x64原生Hook API(非Detours)[转自飘云BLOG]
http://www.dllhook.com/?id=13和x86没什么两样,就是HOOK代码不同而已~~
还是推荐用 Detours,稳定高效!!!
HOOK原理如下:
// HOOK指令长度
#define HOOK_LEN 0xC
// 保存原始指令
BYTE Ori_Code = {0x00};
// Hook代码
/* 方式一
MOV RAX, 0x9090909090909090
PUSH RAX
RET
*/
BYTE HookCode =
{
0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x50, 0xC3
};
/* 方式二
MOV RAX, 0x9090909090909090
JMP RAX
*/
/*
BYTE HookCode =
{
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");
}
谢谢分享好东西
太棒了,这个必须支持啦 我们的友情仍将继续 学习学习了啊 {:lol:}
来学习了,多谢楼主哟
页:
[1]