C ++挂了一个DLL?

时间:2010-01-26 02:18:06

标签: c++ hook

有没有快速方法在c ++中挂钩dll?我知道有微软的Detours这个东西,但只是挂钩一些dll函数的快速简单方法?

例如,我想将dll void mytestfunction()中的函数mytestdll.dll挂钩到hook_mytestfunction()

提前感谢!

5 个答案:

答案 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/

但是我谷歌并且可以在代码项目中找到一些新的成绩:

http://www.codeproject.com/KB/winsdk/LibMinHook.aspx

答案 4 :(得分:2)

只需调用GetProcAddress(hDll,“mytestfunction”),然后在那里写jmp hook_mytestfunction,然后在hook_mytestfunction中的mytestfunction开头放置指令。

当然,如果您了解它,它真的很快捷。如果您不这样做 - 使用MS Detours或其他库。通常你可以在不了解其工作原理的情况下完成它。