· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Как перехватить ф-ии драйвера?

Посл.отвђт Сообщенiе


Дата: Ноя 8, 2003 21:47:35

Как перехватить ф-ии драйвера (наподобие перехвата апи под win32)? И вообще, реально ли это сделать? Например tcpip.sys.
Заранее благодарен, SToweeSH.


Дата: Ноя 9, 2003 00:30:56

В принципе, реально, конечно. Но для этого необходимо ОЧЕНЬ ПРИЛИЧНО разбираться в паписании драйверов...


Дата: Ноя 9, 2003 14:28:22

>>ОЧЕНЬ ПРИЛИЧНО разбираться в написании драйверов...
Это и так понятно. Мне интересен именно метод перехвата и сильно ли он отличается от методов перехвата для апи ф-ий.


Дата: Ноя 9, 2003 15:13:13

Если API не системный сервис, то ничем не отличается. Пример можно посмотреть в DbgView (sysinternals.com) - он хучит ntoskrnl!DbgPrint. Дровина в ресурсах прячется.

Для системных сервисов проще заменить адрес в таблице.
Ищи в нете по ключевому слову KeServiceDescriptorTable - об этом много где есть.

Кое что о системных сервисах есть в свежеопубликованной на этом сайте статье "Об упаковщиках в последний раз. Часть вторая". Volodya, видишь, я исправляюсь :-p


Дата: Ноя 10, 2003 00:16:33 · Поправил: Grenader

SToweeSH
Я просто имел в виду, что ПЕРЕХВАТ сервисов - это просто. Также не составляет труда повесить хук и на любую функцию ядра (например, пишем туда "jmp наш_код", и т.д.). А вот что касается интерпретации полученных данных - вот тут надо разбираться :) Извини за некорректный ответ.


Дата: Ноя 10, 2003 01:20:14

2Grenader: вопрос не про перехват ф-ий сервисов и не про перехват апи ф-ий (тем более) - это я и так отлично знаю. Я спрашивал именно про низкоуровневый перехват ф-ий драйвера.
2Four-F: спасибо за инфу. Только смогу ли я из своего драйвера перехватить запросы, посылаемые системному драйверу? (ndis, tcpip).


Дата: Ноя 10, 2003 04:44:42

SToweeSH
"низкоуровневый перехват ф-ий драйвера" - это перехват "запросов, посылаемых системному драйверу? (ndis, tcpip).", так?
IoCallDriver и иже с ним - вот что в твоем случае нужно перехватывать. В обработчике анализируешь IRP и дальше вроде как все просто.

"не про перехват апи ф-ий (тем более)"
апи функции из ntoskrnl.exe - я про них говорил, а не про MessageBox :)


Дата: Ноя 10, 2003 14:29:29

>>>"низкоуровневый перехват ф-ий драйвера" - это перехват "запросов, посылаемых системному драйверу? (ndis, tcpip).", так?

Если нужен "легальный" способ, можно еще использовать драйвер-фильтр.Rajeev Nagar : Windows NT File System Internals. A Developer's Guide. http://anatolix.naumen.ru/win32books.htm


Дата: Ноя 10, 2003 23:02:51

2Grenader: могешь на мыло описалово IoCallDriver скинуть (и ей подобных)?
2rcz: спасибо за линк. А можно подробней и про "нелегальный" способ?


Дата: Ноя 11, 2003 17:32:07

"Нелегальный" способ - получаешь DRIVER_OBJECT нужного драйвера, В нем есть массив обработчиков (смещение 0x38)
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
Правишь их на себя. Только вызываемый код должен быть в пуле неподкачиваемой памяти.

DRIVER_OBJECT можно получить так
получаем PDEVICE_OBJECT *DeviceObject

IoGetDeviceObjectPointer( IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject );

в DEVICE_OBJECT по смещению 0x8 находится PDRIVER_OBJECT

Идея такая. На практике не пробовал.

А перехват через IoCallDriver. Вся его работа (после IofCallDricer вызывается IovpVerifierFlag) -
.text:0041F5EA _IovpVerifierFlags proc near            ; CODE XREF: sub_0_52FC9F+18p
.text:0041F5EA                                         ; sub_0_52FC9F+77p ...
.text:0041F5EA                 push    esi
.text:0041F5EB                 mov     esi, edx        ; IRP
.text:0041F5ED                 push    edi
.text:0041F5EE                 mov     edi, ecx        ; DEVICE_OBJECT
.text:0041F5F0                 dec     byte ptr [esi+23h] ; Dec Current Location
.text:0041F5F3                 mov     al, [esi+23h] 
.text:0041F5F6                 xor     ecx, ecx
.text:0041F5F8                 cmp     al, cl
.text:0041F5FA                 jg      short loc_0_41F607 ; esi+60h - Stack Location
.text:0041F5FC                 push    ecx
.text:0041F5FD                 push    ecx
.text:0041F5FE                 push    ecx
.text:0041F5FF                 push    esi
.text:0041F600                 push    35h
.text:0041F602                 call    KeBugCheckEx
.text:0041F607 
.text:0041F607 loc_0_41F607:                           ; CODE XREF: _IovpVerifierFlags+10j
.text:0041F607                 mov     eax, [esi+60h]  ; esi+60h - Stack Location
.text:0041F60A                 push    esi
.text:0041F60B                 sub     eax, 24h        ; new stack
.text:0041F60E                 push    edi
.text:0041F60F                 mov     [esi+60h], eax  ; set new stack location
.text:0041F612                 mov     [eax+14h], edi  ; PDEVICE_OBJECT
.text:0041F615                 mov     ecx, [edi+8]    ; DRIVER_OBJECT
.text:0041F618                 movzx   eax, byte ptr [eax]
.text:0041F61B                 call    dword ptr [ecx+eax*4+38h] ; call MajorFunction[IRP_MJ_FUNCTION]
.text:0041F61F                 pop     edi
.text:0041F620                 pop     esi
.text:0041F621                 retn


Дата: Ноя 13, 2003 01:07:59

Спасибо, попробую.


Дата: Ноя 13, 2003 18:08:36

Только поправочка. Небольшой касяк с символами вышел. Это не _IovpVerifierFlags :).


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.037