飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8088|回复: 16

[C/C++] Detours3 使用示例代码

[复制链接]

该用户从未签到

发表于 2014-12-31 16:59:04 | 显示全部楼层 |阅读模式



  1. // stdafx.h

  2. #include <Windows.h>
  3. #include "..\\include\\detours.h"
  4. #ifdef WIN32
  5. #pragma comment(lib,"..\\lib\\x86\\Detours.lib")
  6. #endif
  7. #ifdef WIN64
  8. #pragma comment(lib,"..\\lib\\x64\\Detours.lib")
  9. #endif

复制代码


  1. //TestDetours.cpp

  2. #include "stdafx.h"

  3. typedef int (WINAPI * FP_MessageBoxW)(HWND hWnd,
  4.                LPCWSTR lpText,
  5.                LPCWSTR lpCaption,
  6.                UINT uType
  7.                );

  8. FP_MessageBoxW pMessageBoxW = MessageBoxW;

  9. int WINAPI NsMessageBoxW(HWND hWnd,
  10.                           LPCWSTR lpText,
  11.                           LPCWSTR lpCaption,
  12.                           UINT uType
  13.                           )
  14. {
  15.     lpText = L"Detours!文字被修改!";
  16.     return pMessageBoxW( hWnd, lpText, lpCaption, uType );
  17. }


  18. VOID TestDetours()
  19. {
  20.     // 目标 HOOK MessageBoxW
  21.     MessageBoxW(NULL,L"测试弹窗,未被修改。",L"PYG",0);
  22. }

  23. // 启用 Detours HOOK
  24. BOOL InitDetours()
  25. {

  26.     BOOL bRet = FALSE;

  27.     __try
  28.     {
  29.         // 简单判一下函数是否成功,也可以不用判断返回值
  30.         // 第一步
  31.         if ( DetourTransactionBegin() )
  32.             __leave;
  33.         // 第二步
  34.         if ( DetourUpdateThread( ::GetCurrentThread() ) )
  35.             __leave;

  36.         // 第三步 添加我们HOOK的替换函数
  37.         DetourAttach( &(PVOID&)pMessageBoxW, NsMessageBoxW );
  38.         // 继续添加其他的HOOK
  39.         // DetourAttach( &(PVOID&)pMessageBoxA, NsMessageBoxA );

  40.         // 第四步
  41.         if ( DetourTransactionCommit() != NO_ERROR )
  42.             __leave;

  43.         bRet = TRUE;

  44.     }
  45.     __finally
  46.     {
  47.         ;
  48.     }

  49.     return bRet;
  50. }

  51. // 停用 Detours HOOK
  52. BOOL UnInitDetours()
  53. {
  54.     BOOL bRet = FALSE;

  55.     __try
  56.     {

  57.         // 第一步
  58.         if ( DetourTransactionBegin() != NO_ERROR )
  59.             __leave;
  60.         // 第二步
  61.         if ( DetourUpdateThread( ::GetCurrentThread() ) != NO_ERROR )
  62.             __leave;

  63.         // 第三步 同上添加了几个这里就反安装几个
  64.         DetourDetach( &(PVOID&)pMessageBoxW, NsMessageBoxW );

  65.         // 第四步
  66.         if ( DetourTransactionCommit() != NO_ERROR )
  67.             __leave;

  68.         bRet = TRUE;

  69.     }
  70.     __finally
  71.     {
  72.         ;
  73.     }

  74.     return bRet;
  75. }

  76. int _tmain(int argc, _TCHAR* argv[])
  77. {

  78.     DWORD TickCount = GetTickCount();

  79.     // 原始弹窗
  80.     TestDetours();

  81.     // 设置钩子
  82.     InitDetours();

  83.     TestDetours();

  84.     // 恢复钩子
  85.     UnInitDetours();

  86.     // 原始弹窗
  87.     TestDetours();

  88.         return 0;
  89. }


复制代码



TestDetours.rar

92.05 KB, 下载次数: 114, 下载积分: 飘云币 -2 枚

售价: 1 枚飘云币  [记录]

评分

参与人数 4威望 +432 飘云币 +432 收起 理由
小范 + 20 + 20 赞一个!
sdnyzjzx + 8 + 8 赞一个!
lucky_789 + 4 + 4 赞一个!
small-q + 400 + 400 很给力!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 09:10
  • 签到天数: 959 天

    [LV.10]以坛为家III

    发表于 2014-12-31 18:25:42 | 显示全部楼层

    感谢楼主分享!
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2016-1-13 12:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-12-31 18:26:23 | 显示全部楼层
    感谢NISY提供实例!

    点评

    Detours 和 mHook 这些库的好处就在于,可以在函数执行前或函数执行后用C语言来做一些事情。 int WINAPI NsMessageBoxW(HWND hWnd, LPCWSTR lpText, LP  详情 回复 发表于 2014-12-31 18:32
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2014-12-31 18:32:22 | 显示全部楼层

    mHook 测试代码 X86\X64

    small-q 发表于 2014-12-31 18:26
    感谢NISY提供实例!


    Detours 和 mHook 这些库的好处就在于,可以在函数执行前或函数执行后用C语言来做一些事情。

    int WINAPI NsMessageBoxW(HWND hWnd,
                              LPCWSTR lpText,
                              LPCWSTR lpCaption,
                              UINT uType
                              )
    {
        lpText = L"Detours!文字被修改!";
        // 原函数执行前做你想做的事情
        int lRet = pMessageBoxW( hWnd, lpText, lpCaption, uType );
        // 原函数执行后做你想做的事情
        return lRet;
    }
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-17 22:44
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2014-12-31 18:56:52 | 显示全部楼层
    很强大的Detour,感谢提供64位。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-9-27 19:17
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2015-1-1 11:41:06 | 显示全部楼层
    你这是泄露版吗?{:soso_e113:}
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-5-7 12:58
  • 签到天数: 177 天

    [LV.7]常住居民III

    发表于 2015-1-1 15:27:39 | 显示全部楼层
    谢谢N大。收到了。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-1-1 12:12
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2015-1-1 18:05:57 | 显示全部楼层
    不是很会用,限制比较多,比如无法HOOK任意地址
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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