飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4896|回复: 5

[x64] x64原生Hook API(非Detours)[转自飘云BLOG]

[复制链接]
  • TA的每日心情
    奋斗
    2016-1-13 12:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-9-23 09:10:22 | 显示全部楼层 |阅读模式
    http://www.dllhook.com/?id=13

    1. 和x86没什么两样,就是HOOK代码不同而已~~
    2. 还是推荐用 Detours,稳定高效!!!

    3. HOOK原理如下:

    4. // HOOK指令长度
    5. #define HOOK_LEN 0xC
    6. // 保存原始指令
    7. BYTE Ori_Code[HOOK_LEN] = {0x00};

    8. // Hook代码
    9. /*   方式一
    10. MOV RAX, 0x9090909090909090
    11. PUSH RAX
    12. RET
    13. */
    14. BYTE HookCode[HOOK_LEN] =
    15. {
    16.         0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x50, 0xC3
    17. };

    18. /*   方式二
    19. MOV RAX, 0x9090909090909090
    20. JMP RAX
    21. */
    22. /*
    23. BYTE HookCode[HOOK_LEN] =
    24. {
    25.         0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0
    26. };
    27. */


    28. VOID HookAPI();
    29. VOID UnHookAPI();

    30. static int (WINAPI *kernel_MessageBoxW)(
    31.         HWND hWnd,
    32.         LPCTSTR lpText,
    33.         LPCTSTR lpCaption,
    34.         UINT uType
    35.         ) = MessageBoxW;

    36. int WINAPI MyMessageBoxW(
    37.         HWND hWnd,
    38.         LPCTSTR lpText,
    39.         LPCTSTR lpCaption,
    40.         UINT uType
    41.         )
    42. {
    43.         UnHookAPI();
    44.         int ret = kernel_MessageBoxW(hWnd, TEXT("Hooked!!"), TEXT("hi"), MB_OK);
    45.         HookAPI();
    46.         return ret;
    47. }

    48. VOID HookAPI()
    49. {
    50.         DWORD OldProtect;
    51.         ::VirtualProtect(kernel_MessageBoxW, HOOK_LEN, PAGE_EXECUTE_READWRITE, &OldProtect);
    52.         // 得到原始指令
    53.         memcpy(Ori_Code, kernel_MessageBoxW, HOOK_LEN);  
    54.         // 填充跳转地址
    55.         *(PINT64)(HookCode+2) = (INT64)&MyMessageBoxW;
    56.         memcpy(kernel_MessageBoxW, &HookCode, sizeof(HookCode));
    57. }

    58. VOID UnHookAPI()
    59. {
    60.         memcpy(kernel_MessageBoxW, &Ori_Code, sizeof(HookCode));       
    61. }

    62. VOID main()
    63. {
    64.         MessageBoxW(NULL, TEXT("hello"), TEXT("P.Y.G"), MB_OK);
    65.         HookAPI();
    66.         MessageBoxW(NULL, TEXT("hello"), TEXT("P.Y.G"), MB_OK);
    67.         system("pause");
    68. }
    复制代码



    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2018-1-21 20:19
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2016-4-13 07:06:18 | 显示全部楼层
    谢谢分享好东西
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:11
  • 签到天数: 958 天

    [LV.10]以坛为家III

    发表于 2016-5-10 17:22:36 | 显示全部楼层

    太棒了,这个必须支持啦
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-8-21 04:30
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-7-13 00:48:40 | 显示全部楼层
    我们的友情仍将继续
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-25 23:39
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2016-12-11 20:33:31 | 显示全部楼层
    学习学习了啊
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:13
  • 签到天数: 2169 天

    [LV.Master]伴坛终老

    发表于 2017-11-28 17:20:04 | 显示全部楼层

    来学习了,多谢楼主哟
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表