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