TA的每日心情 | 奋斗 2016-1-13 12:25 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
http://www.dllhook.com/?id=13
- 和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");
- }
复制代码
|
|