small-q 发表于 2014-9-23 09:10:22

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");
}


390172962 发表于 2016-4-13 07:06:18

谢谢分享好东西

gujin162 发表于 2016-5-10 17:22:36


太棒了,这个必须支持啦

lan451709 发表于 2016-7-13 00:48:40

我们的友情仍将继续

laiyigeya 发表于 2016-12-11 20:33:31

学习学习了啊

xie83544109 发表于 2017-11-28 17:20:04

{:lol:}
来学习了,多谢楼主哟
页: [1]
查看完整版本: x64原生Hook API(非Detours)[转自飘云BLOG]