繁体   English   中英

C ++挂了一个DLL?

[英]C++ hooking a dll?

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

例如,我想将dll mytestdll.dll的函数void mytestfunction() mytestdll.dllhook_mytestfunction()

提前致谢!

可能最简单的方法是将自己的包装器DLL EXE目录中的相同名称放在一起,并将钩子DLL的副本放在同一目录中并使用新名称。 然后,在您的包装器DLL的IAT中,将任何非截获的调用重定向到包装的DLL(导出转发),并自己实现其他的。

要重定向函数,请将以下行放在.DEF文件中: Foo=wrapped_mytestdll.Foo其中Foo是(损坏的)函数名称, wrapped_mytestdll是复制的DLL的新名称。

因此,受影响的EXE会加载包装器DLL,然后加载包装的DLL。 包装器DLL中的函数优先于包装的DLL。 唯一没有拦截的调用是被包装的DLL对自身的调用,因为那些调用不通过你的IAT。

(我之后发现了一个生成基本“.DEF”文件的工具的链接 ,但是我自己没有测试过。使用风险自负。)

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/

然而,我谷歌它,并可以在代码项目找到一些新的成绩:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM