[英]C++ hooking a dll?
有没有快速方法在c ++中挂钩dll? 我知道有微软的Detours的东西,但是不是只有一个简单的方法来挂钩几个dll函数?
例如,我想将dll mytestdll.dll
的函数void mytestfunction()
mytestdll.dll
到hook_mytestfunction()
。
提前致谢!
可能最简单的方法是将自己的包装器DLL 与 EXE目录中的相同名称放在一起,并将钩子DLL的副本放在同一目录中并使用新名称。 然后,在您的包装器DLL的IAT中,将任何非截获的调用重定向到包装的DLL(导出转发),并自己实现其他的。
要重定向函数,请将以下行放在.DEF文件中: Foo=wrapped_mytestdll.Foo
其中Foo是(损坏的)函数名称, wrapped_mytestdll
是复制的DLL的新名称。
因此,受影响的EXE会加载包装器DLL,然后加载包装的DLL。 包装器DLL中的函数优先于包装的DLL。 唯一没有拦截的调用是被包装的DLL对自身的调用,因为那些调用不通过你的IAT。
Detours 是快速而简单的方法!
我假设您正在挂钩DLL,您正在挂钩该DLL的导出?
在这种情况下,您可以执行简单的IAT(如果需要,可能还有EAT)钩子。
IAT / EAT钩子优于Detours的优势在于钩子的应用和移除是100%安全的(因为你没有替换代码,你正在更换指针,所以不存在竞争条件),以及在本机x64进程上也可以很容易地进行挂钩(除非你为Prof版本分配10个宏,否则微软的Detours库不能这样做)。
是的,有第三方绕道库有x64支持和照顾大多数竞争条件和什么不是,但其中一些非常昂贵,而其他一些只是一个痛苦的工作。
IAT / EAT挂钩既快速又简单,并且在“通过C / C ++的Windows”一书中提供了用于执行它们的示例代码(以及互联网上的多个位置)。
这是我所知道的一个相当通用的答案,但如果没有关于你正在尝试做什么的更多信息,很难进一步详细说明。
我以前用过这个成功了:
http://software.intel.com/en-us/articles/intercepting-system-api-calls/
然而,我谷歌它,并可以在代码项目找到一些新的成绩:
只需调用GetProcAddress(hDll,“mytestfunction”),然后在那里编写jmp hook_mytestfunction
,然后在hook_mytestfunction中的mytestfunction开头放置指令。
当然,如果您了解它,它真的很快捷。 如果您不这样做 - 使用MS Detours或其他库。 通常你可以在不了解其工作原理的情况下做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.