和x86没什么两样,就是HOOK代码不同而已~~ 还是推荐用 Detours,稳定高效!!! HOOK原理如下: // HOOK指令长度 #define HOOK_LEN 0xC // 保存原始指令 BYTE Ori_Code[HOOK_LEN] = {0x00}; // Hook代码 /* 方式一 MOV RAX, 0x9090909090909090 PUSH RAX RET */ BYTE HookCode[HOOK_LEN] = { 0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x50, 0xC3 }; /* 方式二 MOV RAX, 0x9090909090909090 JMP RAX */ /* BYTE HookCode[HOOK_LEN] = { 0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0 }; */ VOID HookAPI(); VOID UnHookAPI(); static int (WINAPI *kernel_MessageBoxW)( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ) = MessageBoxW; int WINAPI MyMessageBoxW( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ) { UnHookAPI(); int ret = kernel_MessageBoxW(hWnd, TEXT("Hooked!!"), TEXT("hi"), MB_OK); HookAPI(); return ret; } VOID HookAPI() { DWORD OldProtect; ::VirtualProtect(kernel_MessageBoxW, HOOK_LEN, PAGE_EXECUTE_READWRITE, &OldProtect); // 得到原始指令 memcpy(Ori_Code, kernel_MessageBoxW, HOOK_LEN); // 填充跳转地址 *(PINT64)(HookCode+2) = (INT64)&MyMessageBoxW; memcpy(kernel_MessageBoxW, &HookCode, sizeof(HookCode)); } VOID UnHookAPI() { memcpy(kernel_MessageBoxW, &Ori_Code, sizeof(HookCode)); } VOID main() { MessageBoxW(NULL, TEXT("hello"), TEXT("P.Y.G"), MB_OK); HookAPI(); MessageBoxW(NULL, TEXT("hello"), TEXT("P.Y.G"), MB_OK); system("pause"); }
发表评论