Если несложно, скажите плз как импортировать KeServiceDescriptorTable в драйвер режима ядра (асм)? И вообще было бы неплохо увидеть минимальный код перехвата native api на асме =\
Vilco Тут на сайте Ms-Rem свои статьи выкладывал (перехват АПИ) Всего вроде 3 статьи. Как раз подробно объясняется, как перехватить и обработать АПИшку в р3 и р0. Код проверенный и рабочий. Так что сразу в компилятор и тестируй напрямую... imp__***** *-что импортируешь....
хотя бы тот же сплайсинг. Код (Text): mov cl, 1fh call KfRaiseIrql cli mov byte ptr [FunctionOffset], 0e9h mov dword ptr [FunctionOffset+1], <смещение_к_адресу_хука> sti mov cl, 0 call KfLowerIrql
Извиняюсь, наверное, неправильно выразил. Статьи прочитал, но они на паскале. Хотелось бы реализовать тоже самое на асме, но не получается. Во-первых не могу понять как импортировать вышеуказанную переменную. Подключил ntoskrnl из kmd. Все равно не работает. Если несложно, выложите то же самое, только на асме (т.е. перехват подменой адреса в таблицах ядра...) И ещё вопрос, немного не в тему, как напечатать число? Ибо я пишу так Код (Text): mov eax, KeServiceDescriptorTable invoke DbgPrint, $CTA0("KeServiceDescriptorTable: %d"), eax и показывает отрицательное число o_O
не знаю, есть ли в масм cinvoke, но нужно использовать его. invoke передает переменные исходя из stdcall-соглашения. А тебе нужно C.
может лучше не %d, а %08x ? Системные адреса - выше 0x80000000, целые знаковые числа такого диапазона интерпретируются как отрицаиельные. %x ставь Это как раз насчет первого пункта. Насчет второго я отписал
Воть пишу Код (Text): ;@echo off ;goto make ;---------------------------------------------------------------------- ;end of pre-self-building ;---------------------------------------------------------------------- ;---------------------------------------------------------------------- ;my api)int driver ;---------------------------------------------------------------------- ;pc routine ;---------------------------------------------------------------------- .386 .model flat, stdcall option casemap:none ;---------------------------------------------------------------------- ;inc files ;EXTRN KeServiceDescriptorTable: DWORD ;---------------------------------------------------------------------- includelib \masm32\LIB\wxp\ntoskrnl.lib include \masm32\INCLUDE\wxp\ntstatus.inc include \masm32\INCLUDE\wxp\ntddk.inc include \masm32\INCLUDE\wxp\ntoskrnl.inc include \masm32\INCLUDE\wxp\ntint.inc ;---------------------------------------------------------------------- include \masm32\MACROS\Strings.mac ;---------------------------------------------------------------------- ;code ;---------------------------------------------------------------------- .data PKeServiceDescriptorTable PSERVICE_DESCRIPTOR_TABLE ? TrueNtOpenProcess PVOID ? FalsNtOpenProcess PVOID ? func_id ULONG 7Ah gs_tt DWORD 0 ;---------------------------------------------------------------------- ; Intercepted function: ; NTSTATUS NtOpenProcess ( ; OUT PHANDLE ProcessHandle, ; IN ACCESS_MASK DesiredAccess, ; IN POBJECT_ATTRIBUTES ObjectAttributes, ; IN PCLIENT_ID ClientId OPTIONAL) .code DriverULoad proc pDriverObject:PDRIVER_OBJECT local CR0Reg:ULONG push ECX push EBX push EDX push func_id call NtProcAddr cli ;// запрещаем прерывания mov EBX, cr0 mov CR0Reg,EBX and EBX,0FFFEFFFFh ;// сбросить WP bit mov cr0, EBX mov ECX, TrueNtOpenProcess mov dword ptr [EAX], ECX mov eax, CR0Reg mov cr0, eax ;// востановить содержимое CR0 sti pop EDX pop EBX pop ECX ret DriverULoad endp ;---------------------------------------------------------------------- DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local CR0Reg:ULONG mov PKeServiceDescriptorTable, KeServiceDescriptorTable invoke DbgPrint, $CTA0("enter p_int") mov EAX, offset KeServiceDescriptorTable invoke DbgPrint, $CTA0("KeSerDesT offset: %x"), PKeServiceDescriptorTable invoke DbgPrint, $CTA0("KeSetDesT : %x"), KeServiceDescriptorTable push EBX push ECX push func_id call NtProcAddr mov gs_tt,EAX invoke DbgPrint, $CTA0("NeededProcOffset: %x"), gs_tt sub EAX, KeServiceDescriptorTable mov gs_tt,EAX invoke DbgPrint, $CTA0("Subjenction: %x"), gs_tt mov ECX, DWORD PTR [EAX] ;saved mov EBX, ECX mov TrueNtOpenProcess, ECX mov FalsNtOpenProcess, offset NewNtOpenProcess cli mov EBX, cr0 mov CR0Reg,EBX and EBX,0FFFEFFFFh ;сбросить WP bit mov cr0, EBX mov ECX, FalsNtOpenProcess mov dword ptr [EAX], ECX mov EBX, CR0Reg mov cr0, EBX ;востановить содержимое CR0 sti pop ECX pop EBX* mov EAX, pDriverObject assume EAX:PDRIVER_OBJECT mov [EAX].DriverUnload, offset DriverULoad assume EAX:nothing mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp ;---------------------------------------------------------------------- NtProcAddr proc fnum: ULONG ;EAX=ptr to proc addr push EBX push ECX push EDX mov EDX, fnum invoke DbgPrint, $CTA0("Proc number: %x"), fnum xor EAX, EAX shl EDX,1 shl EDX,1 ;MULx4=massiv offset mov gs_tt, EDX invoke DbgPrint, $CTA0("Proc offset at KE: %x"), gs_tt mov EBX, PKeServiceDescriptorTable invoke DbgPrint, $CTA0("PKeServiceDescriptorTable again: %x"), PKeServiceDescriptorTable assume EBX:PSERVICE_DESCRIPTOR_TABLE mov ECX,[EBX].ntoskrnl.ServiceTable ;в ECX - массив из PVOID mov gs_tt, ECX invoke DbgPrint, $CTA0("Service table addr: %x"), gs_tt mov EAX,ECX add EAX, EDX mov gs_tt, EAX invoke DbgPrint, $CTA0("Proc addr_abs: %x"), gs_tt mov ECX, DWORD PTR [EAX] mov gs_tt, ECX invoke DbgPrint, $CTA0("PTR TO NEEDED Proc : %x"), gs_tt assume EBX:nothing pop EDX pop ECX pop EBX ret NtProcAddr endp ;---------------------------------------------------------------------- NewNtOpenProcess proc ProcessHandle:PHANDLE, DesiredAccess:ACCESS_MASK, ObjectAttributes:POBJECT_ATTRIBUTES, ClientId:PCLIENT_ID invoke DbgPrint, $CTA0("Intercepted_success") push ClientId push ObjectAttributes push DesiredAccess push ProcessHandle call TrueNtOpenProcess ret NewNtOpenProcess endp ;---------------------------------------------------------------------- ;end ;---------------------------------------------------------------------- end DriverEntry ;---------------------------------------------------------------------- ;self-building ;---------------------------------------------------------------------- :make \masm32\bin\ml /nologo /c /coff simplest.bat \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:proc_int.sys /subsystem:native simplest.obj del simplest.obj echo. pause Компилится и либо bsod, либо просто ни черта не делает. Подскажите чё тут не так
Напиши сразу после начала процедура запуска драйвера инструкцию int 3, скомпиль и запускай, не забудь SoftIce включить, а то BSoD будет. А вообще поищи по форуму, я не давно на ASM код выкладывал, перехват NtOpenProcess из статьи «Перехват API функций в Windows NT (часть 3). Нулевое кольцо. [Ms-Rem]», переписанный на ASM.
Так ты ничему не научишься, элементарный поиск по сайту (. http://www.wasm.ru/forum/viewtopic.php?id=19210
Времени не хватает. Тем более что то в той теме я не нашел кода на асме) Просто недавно на форуме, где чё куда тыкать? Где он там?
Да нет, сорцы перехавата написанные на асме ^_^ http://www.wasm.ru/forum/viewtopic.php?id=19210 Вот тема, где оно там?
Скажите пожалуйста, если я знаю имя функции, могу ли я узнать где нибудь список параметров для неё? И что должна возвращать... И конешно, желательно смысл каждого параметра ^_^ Рассматривается множество функций Native API
Как правило нет, но можно продизасмить её, и вывести параметры самостоятельно, можно посмотреть в сорцах wrk, win2k, ROS.