detours使用

Detours是微软开发的一个函数库,可用于捕获系统API。在用其进行程序开发之前,得做一些准备工作:

一.下载Detours
     在http://research.microsoft.com/sn/detours 可免费下载Detours
二.安装Detours
        一路NEXT
三.生成Detours库
        在安装后的文件夹下找不到直接可以拿来用的LIB文件,但是却有SRC文件(在**\Microsoft Research\Detours Express 2.1\src下)。该文件夹下还有Makefile,可以直接用来生成库。
        将Detours路径下的SCR文件夹拷贝到**\Microsoft Visual Studio 9.0\VC路径下,注意是整个文件夹(其它版本VC自己照着复制)
        在system32目录找到cmd右键以管理员身份运行,切换至 c:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录运行vcvars32.bat
        切换到\Microsoft Visual Studio9.0\VC\SRC,然后输入..\bin\nmake指令,编译成功后在\Microsoft Visual Studio9.0\VC\Lib文件下就能找到detoured.lib与detours.lib文件了。

付使用简单例子:HOOK MessageBoxW函数
  1. #include "stdafx.h"
  2. #include "DetourHook.h"
  3. #include <detours.h>

  4. #pragma comment(lib, "detours.lib") 
  5. #pragma comment(lib, "detoured.lib")



  6. static int (WINAPI* OLD_MessageBoxW)(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)=MessageBoxW;
  7. int WINAPI NEW_MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)
  8. {
  9.                 
  10.         //修改输入参数,调用原函数
  11.         int ret=OLD_MessageBoxW(hWnd,L"输入参数已修改",L"[测试]",uType);
  12.         return ret;
  13. }

  14. VOID Hook()
  15. {
  16.         DetourRestoreAfterWith();
  17.         DetourTransactionBegin();
  18.         DetourUpdateThread(GetCurrentThread());

  19.         //这里可以连续多次调用DetourAttach,表明HOOK多个函数
  20.         DetourAttach(&(PVOID&)OLD_MessageBoxW,NEW_MessageBoxW);

  21.         DetourTransactionCommit();
  22. }

  23. VOID UnHook()
  24. {
  25.         DetourTransactionBegin();
  26.         DetourUpdateThread(GetCurrentThread());
  27.         
  28.         //这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK
  29.         DetourDetach(&(PVOID&)OLD_MessageBoxW,NEW_MessageBoxW);

  30.         DetourTransactionCommit();

  31. }
  32. int APIENTRY _tWinMain(HINSTANCE hInstance,
  33.                      HINSTANCE hPrevInstance,
  34.                      LPTSTR    lpCmdLine,
  35.                      int       nCmdShow)
  36. {
  37.         MessageBoxW(0,L"正常消息框",L"测试",0);
  38.         Hook();
  39.         MessageBoxW(0,L"正常消息框",L"测试",0);
  40.         UnHook();
  41.         return 0;
  42.         
  43. }
评论 2 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值