Detours简介

Detours是微软开发的拦截函数调用的库,可以在ARM,x86,x64,IA64多个平台上工作:具有以下几个功能:

  • 运行时动态的拦截自定义的函数,windows api函数
  • 拦截类的成员函数,com接口的成员函数
  • 修改dll的导入表,附加任何数据段到二进制文件
  • 在一个新进程中加载某个dll

使用Detours

加载对应库

开始拦截

首先要保存好目标函数的函数指针,因为后面我们恢复的时候,还需要知道原始的目标函数指针。函数指针的参数、返回值以及调用约定都需要跟目标函数一直,否则会出现莫名其妙的错误。

然后调用DetourTransactionBegin函数来开始一次detours过程。然后使用DetourUpdateThread来更新线程,之后DetourAttach设置hook函数去拦截对应的目标函数。最后调用DetourTransactionCommit函数使拦截开始生效。代码如下:

结束拦截

结束拦截的流程跟开始拦截差不多。只不过把之前detour住的函数恢复成原来的。

其他注意事项

拦截其他进程里面的api的时候,需要把detour相关的代码封装到一个dll里面,然后让这个dll加载到要拦截的进程里面。你可以使用DetourCreateProcessWithDllEx这个函数创建一个新的目标进程,并加载指定的dll。

这个dll的dllmain函数必须在一开始调用DetourRestoreAfterWith函数。如果这个dll需要在32位和64混合环境中使用,那么必须dll必须调用DetourIsHelperProcess函数,以及要把DetourFinishHelperProcess这个函数导出为序号1,因为rundll32.exe回去调用这个函数执行一些帮助任务。

发表评论

电子邮件地址不会被公开。 必填项已用*标注