Прочитал статью Ms-Rem "Перехват API в NT" 3-ю часть, пытаюсь изобразить написанное там на асме. Вот что получилось: ;@echo off ;goto make .386 .model flat, stdcall option casemap:none include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\include\w2k\ntoskrnl.inc include \masm32\include\w2k\w2kundoc.inc includelib \masm32\lib\w2k\ntoskrnl.lib include \masm32\Macros\Strings.mac .data realaddr dd 0 CR0Reg dd 0 Messaga1 db "OpenProcess",0 Messaga2 db "Driver loaded", 0 .code ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::: DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local pDeviceObject:PVOID pushad invoke DbgPrint, addr Messaga2 mov edi, KeServiceDescriptorTable mov edi, [edi] mov eax, [edi+(07ah*4)] ;edi+07ah*4 - NtOpenProcess mov realaddr, eax cli mov eax, CR0 mov CR0Reg, eax and eax, -1 mov cr0, eax mov [edi+(07ah*4)], dword ptr offset hookproc mov eax, CR0Reg mov CR0, eax sti mov eax, pDriverObject assume eax:PTR DRIVER_OBJECT mov [eax].DriverUnload, offset DriverUnload assume eax:nothing popad mov eax, STATUS_SUCCESS ret DriverEntry endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::: DriverUnload proc pDriverObject:PDRIVER_OBJECT pushad mov edi, KeServiceDescriptorTable mov edi, [edi] cli mov eax, CR0 mov CR0Reg, eax and eax, -1 mov cr0, eax mov eax, dword ptr realaddr mov [edi+(07ah*4)], eax mov eax, CR0Reg mov CR0, eax sti popad ret DriverUnload endp ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::: hookproc proc invoke DbgPrint, addr Messaga1 jmp dword ptr realaddr ; ret hookproc endp ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::: end DriverEntry :make \masm32\bin\ml /nologo /c /coff tempdrv.bat \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:tempdrv.sys /subsystem:native tempdrv.obj del tempdrv.obj echo. pause Не получается перехватить функцию NtOpenProcess, управлене на hookproc не передается, возможно я не туда прописываю адрес hookproc, но как сделать по другому я не знаю.
Boola KeServiceDescriptorTable это только указатель на эту переменную, поэтому : твоё: mov edi, KeServiceDescriptorTable mov edi, [edi] как надо: mov edi, KeServiceDescriptorTable mov edi, [edi] mov edi, [edi] И теперь в edi действительно указатель на массив адресов функций. P.S. Ты тоже предпочитаешь писать на асме, а не на C. Молодец.
AB_Celitel Спасибо все заработало, обидная ошибка видимо читать разучился. Saint German Тоже спасибо, погляжу
AB_Celitel Еще вопрос: какие функции ты еще перехватывал? не находил ошибок в номерах вызовов функций (я про приложение к статье)?
Ms Rem как должен себя вести парсер на машине, где есть касперский? Пробовал запускать под касперским (на удаленной машине) - количество сервисов и их номера те же, как и на моей машине (без каспера). В то же время слышал мнение, что каспер меняет количество сервисов и их номера. Где здесь правда?
Каспер добавляет новые сервисы, а номера не меняет. Так как в ntoskrnl для описания новых сервисов нет места, то он выносит SDT за пределы ядра и дописывает в конец свои сервисы. Посмотреть что стало с SDT можно в айсе. А парсер просто сканирует ntdll и выводит номера стандартных виндовых сервисов (о каспере он ничего не знает).
Каспера нет, айс не прижился Может так подскажешь по такой ситуации: Код (Text): mov eax, KeServiceDescriptorTable ;указывает ли KeServiceDescriptorTable на новое местоположение таблицы?? mov eax,[eax] mov eax,[eax] mov eax,[eax+NNN*4] ;получу новый валидный адрес сервиса или нет??
KeServiceDescriptorTable остается на месте, а вот KeServiceDescriptorTable->ntoskrnl.ServiceTable указывает уже не в секцию .data ядра, а в выделеную память, и в конец этой таблицы приписаны сервисы каспера. Все остальные сервисы остались на месте, поэтому если тебе надо просто похукать функцию через SDT, то беспокоиться неочем.
I'm sorry but i'm a newer and a foreigner,i don't know Russian at all,i occured some difficulties,i modified 07ah with 029h,cause i wanna hook ZwCreateProccess on my vm(win2k),and i have checked the service number winth windbg,but it couldn't work,i downloaded another HOOK_SRC written by vc,modified the service number,and it worked very well.I Decomplied the driver(C version),but i can't find the difference……Puzzling,Can anyone help me? If necessary,i can send you code sorry for my poor english,i registered just by Luck i relly don't understand the Russian words,quite puzzling
you must modify the dword (address) at memory pointed by service number instead of modify the service number itself
Если комуто мнтересно то есть программа SSTMON. Она отображает ссмт таблицы как шадов так и обычные. Написал её я. Извините конечно за рекламу но помойму с помошью неё гораздо удобней просматривать чем с помошью айса. Скачать её можно по адресу - http://dehunters-soft.drmist.ru/my_projects/sstmon_0x1.rar