有没有快速方法在c ++中挂钩dll?我知道有微软的Detours这个东西,但只是挂钩一些dll函数的快速简单方法?
例如,我想将dll void mytestfunction()
中的函数mytestdll.dll
挂钩到hook_mytestfunction()
。
提前感谢!
答案 0 :(得分:4)
最简单的方法可能是在EXE目录中放入自己的包含的包装器,并将带钩的DLL的副本放在同一目录中,并使用新名称。然后,在您的包装器DLL的IAT中,将任何非截获的调用重定向到包装的DLL(导出转发),并自己实现其他的。
要重定向函数,请将以下行放在.DEF文件中:Foo=wrapped_mytestdll.Foo
其中Foo是(受损的)函数名称,wrapped_mytestdll
是复制的DLL的新名称。
因此,受影响的EXE会加载包装器DLL,然后加载包装的DLL。包装器DLL中的函数优先于包装的DLL。唯一被拦截的不的调用是被包装的DLL对自身的调用,因为那些调用不通过你的IAT。
(我已经发现a link to a tool生成一个基本的“.DEF”文件,但我自己没有测试过。使用风险自负。)
答案 1 :(得分:3)
Detours 是快速而简单的方式!
答案 2 :(得分:3)
我假设您是否正在挂钩您正在挂钩该DLL的导出?
在这种情况下,您可以执行简单的IAT(如有必要,可能还有EAT)钩子。
IAT / EAT挂钩Detours的优势在于钩子的应用和移除是100%安全的(因为你没有替换代码,你正在更换指针,因此没有竞争条件的可能性),并且很容易在本机x64进程上进行挂钩(除非你为Prof版本分配10个宏,否则微软的Detours库不能做)。
是的,有第三方绕道图书馆有x64支持和照顾大部分比赛条件和什么不是,但其中一些非常昂贵,而其他人只是一个痛苦的工作。
IAT / EAT挂钩既快速又简单,并且在“通过C / C ++的Windows”一书中提供了用于执行它们的示例代码(以及互联网上的多个位置)。
这是我所知道的一个相当通用的答案,但如果没有更多关于你正在尝试做什么的更多信息,就很难详细说明。
答案 3 :(得分:2)
我以前用过这个并取得了成功:
http://software.intel.com/en-us/articles/intercepting-system-api-calls/
但是我谷歌并且可以在代码项目中找到一些新的成绩:
答案 4 :(得分:2)
只需调用GetProcAddress(hDll,“mytestfunction”),然后在那里写jmp hook_mytestfunction
,然后在hook_mytestfunction中的mytestfunction开头放置指令。
当然,如果您了解它,它真的很快捷。如果您不这样做 - 使用MS Detours或其他库。通常你可以在不了解其工作原理的情况下完成它。