我有兴趣使用 API 间谍/劫持来实现我正在从事的项目的一些核心功能。在这个问题中也提到了它,但这并不是真正的话题,所以我认为最好有一个自己的问题。,
我想尽可能多地收集关于这方面的信息、不同的技术/库(MS Detours、IAT patching)或其他建议。
此外,如果有人有任何使用此类技术的实际生产经验,这将特别有趣——它们是否可以足够稳定以用于生产代码,或者这是否是一种严格的研究技术?它是否可以在多个版本的 Windows 上正常工作?它有多容易出错?
个人经验和外部链接都受到赞赏。
我有兴趣使用 API 间谍/劫持来实现我正在从事的项目的一些核心功能。在这个问题中也提到了它,但这并不是真正的话题,所以我认为最好有一个自己的问题。,
我想尽可能多地收集关于这方面的信息、不同的技术/库(MS Detours、IAT patching)或其他建议。
此外,如果有人有任何使用此类技术的实际生产经验,这将特别有趣——它们是否可以足够稳定以用于生产代码,或者这是否是一种严格的研究技术?它是否可以在多个版本的 Windows 上正常工作?它有多容易出错?
个人经验和外部链接都受到赞赏。
我实现了注射器.dll(L-GPL)而不是 MS Detours(我们不喜欢许可证要求或为 x64 支持支付巨额费用)它工作得非常好,我将它从 Win32 移植到 Win64,我们一直在使用自我商业应用大约 2 年了。
我们使用它的原因非常简单,实际上它提供了一个表示框架,用于重新打包、重新标记相同的编译应用程序作为许多不同的产品,我们对字符串、通用资源、工具栏和菜单进行通用过滤和替换。
作为 L-GPL,我们提供源代码、版权等,并且只动态链接到库。
挂钩标准 WinAPI 函数相对安全,因为它们在不久的将来不会发生太大变化,如果有的话,因为 Microsoft 最好保持 WinAPI 在版本之间向后兼容。我想说,标准的 WinAPI 挂钩通常是稳定和安全的。
挂钩其他任何东西,如在目标程序的内部,是另一回事。无论目标程序如何,挂钩本身通常都是一种可靠的做法。该过程中最薄弱的环节通常是找到正确的位置并坚持下去。
应用程序中的最小变化可以并且将会改变函数的地址,更不用说动态库等了。
在 gamehacking 中,hook 是标准做法,这在一定程度上被“sigscanning”打败了,这是 LanceVorgin 在有点臭名昭著的 MPC 板上首次开发的一种技术。它通过扫描可执行映像以查找函数的静态部分来工作,除非修改函数的操作,否则实际指令字节不会改变。sigscanning 显然比使用静态地址表要好,但是当目标应用程序发生足够的变化时,它最终也会失败。
可以在此处找到 c++ 中 sigscanning 的示例实现。
几年来,我一直在使用标准的 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 以及仍在开发中的时移应用程序。