任意位置hook nt函数
详细代码
#include <ntddk.h> #pragma pack(1) typedef struct ServiceDescriptorEntry { unsigned int *ServiceTableBase; unsigned int *ServiceCounterTableBase; //仅适用于checked build版本 unsigned int NumberOfServices; unsigned char *ParamTableBase; } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; #pragma pack() __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; ULONG g_ntOpenKey = 0; UCHAR OldTraitCode[5]; void PageProtectOn() { __asm{//恢复内存保护 mov eax, cr0 or eax, 10000h mov cr0, eax sti } } void PageProtectOff() { __asm{//去掉内存保护 cli mov eax, cr0 and eax, not 10000h mov cr0, eax } } void FilterOpenKey() { KdPrint(("InlinkHook Process Name: %s ", (char*)PsGetCurrentProcess() + 0x174)); } __declspec(naked) void MyOpenKey() { __asm{ call FilterOpenKey pop eax push 0x94 jmp eax } } VOID HookNtOpenKey() { UCHAR TraitCode[5]; ULONG NewAddress = (ULONG)&MyOpenKey; ULONG AwayAddress = NewAddress - 5 - g_ntOpenKey; //call TraitCode[0] = 0xE8; *(ULONG*)&TraitCode[1] = AwayAddress; //HOOK PageProtectOff(); RtlCopyMemory(OldTraitCode, (PVOID)g_ntOpenKey, 5); RtlCopyMemory((PVOID)g_ntOpenKey, TraitCode, 5); PageProtectOn(); } VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject) { PageProtectOff(); RtlCopyMemory((PVOID)g_ntOpenKey, OldTraitCode, 5); PageProtectOn(); DbgPrint("DriverUnload"); } NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath) { g_ntOpenKey = KeServiceDescriptorTable.ServiceTableBase[119]; HookNtOpenKey(); pDriverObject->DriverUnload = DriverUnload; DbgPrint("DriverEntry"); return STATUS_SUCCESS; }
0则评论给“[驱动开发]HookOpenKey”