7

我有兴趣使用 API 间谍/劫持来实现我正在从事的项目的一些核心功能。在这个问题中也提到了它,但这并不是真正的话题,所以我认为最好有一个自己的问题。,

我想尽可能多地收集关于这方面的信息、不同的技术/库(MS DetoursIAT patching)或其他建议。

此外,如果有人有任何使用此类技术的实际生产经验,这将特别有趣——它们是否可以足够稳定以用于生产代码,或者这是否是一种严格的研究技术?它是否可以在多个版本的 Windows 上正常工作?它有多容易出错?

个人经验和外部链接都受到赞赏。

4

4 回答 4

3

我实现了注射器.dll(L-GPL)而不是 MS Detours(我们不喜欢许可证要求或为 x64 支持支付巨额费用)它工作得非常好,我将它从 Win32 移植到 Win64,我们一直在使用自我商业应用大约 2 年了。

我们使用它的原因非常简单,实际上它提供了一个表示框架,用于重新打包、重新标记相同的编译应用程序作为许多不同的产品,我们对字符串、通用资源、工具栏和菜单进行通用过滤和替换。

作为 L-GPL,我们提供源代码、版权等,并且只动态链接到库。

于 2008-09-18T12:34:05.917 回答
2

挂钩标准 WinAPI 函数相对安全,因为它们在不久的将来不会发生太大变化,如果有的话,因为 Microsoft 最好保持 WinAPI 在版本之间向后兼容。我想说,标准的 WinAPI 挂钩通常是稳定和安全的。

挂钩其他任何东西,如在目标程序的内部,是另一回事。无论目标程序如何,挂钩本身通常都是一种可靠的做法。该过程中最薄弱的环节通常是找到正确的位置并坚持下去。

应用程序中的最小变化可以并且将会改变函数的地址,更不用说动态库等了。

在 gamehacking 中,hook 是标准做法,这在一定程度上被“sigscanning”打败了,这是 LanceVorgin 在有点臭名昭著的 MPC 板上首次开发的一种技术。它通过扫描可执行映像以查找函数的静态部分来工作,除非修改函数的操作,否则实际指令字节不会改变。sigscanning 显然比使用静态地址表要好,但是当目标应用程序发生足够的变化时,它最终也会失败。

可以在此处找到 c++ 中 sigscanning 的示例实现。

于 2008-09-18T12:40:58.413 回答
1

几年来,我一直在使用标准的 IAT 挂钩技术,它运行良好,运行良好且稳定,并且可以毫无问题地移植到 x64。我遇到的主要问题更多地与我如何首先注入钩子有关,花了很长时间才弄清楚如何最好地在启动时的“正确”点暂停托管进程,以便注入对我来说是可靠且足够早的。我的注入器使用 Win32 调试 API,虽然这使得挂起非托管进程很容易,但需要一些试验和错误才能在适当的时间暂停托管进程。

我对 IAT 的使用主要用于编写测试工具,我有一个死锁检测程序,详细信息如下:http : //www.lenholgate.com/blog/2006/04/deadlock-detection-tool-updates.html GetTickCount() 控制程序可从此处下载http://www.lenholgate.com/blog/2006/04/tickshifter-v02.html 以及仍在开发中的时移应用程序。

于 2008-09-18T13:54:12.090 回答
1

很多人忘记了 Windows dll 被编译为热补丁图像( MSDN )。

热补丁是WinAPI绕道的最好方法,因为它干净简单,并且保留了原始函数,这意味着不需要使用内联汇编,只需稍微调整函数指针。

一个小的热补丁教程可以在这里找到。

于 2010-12-24T06:25:35.150 回答