我有兴趣使用API间谍/劫持来实现我正在开发的项目的一些核心功能。它也被提到了in this question,但那并不是真正的话题,所以我觉得它的问题本身就更好了。
我想尽可能多地收集有关此信息,不同技术/库(MS Detours,IAT patching)或其他建议的信息。
此外,了解某人是否有使用此类技术的真实生产经验会特别有趣 - 他们是否可以为生产代码提供足够的稳定性,或者这是一种严格的研究技术?它是否适用于多个版本的Windows?它有多容易出错?
个人经历和外部链接都受到赞赏。
答案 0 :(得分:3)
我实现了syringe.dll(L-GPL)而不是MS Detours(我们不喜欢许可证要求或x64支持的巨额支付)它运行得非常好,我将它从Win32移植到Win64,我们一直现在使用我们的自我商业应用程序大约2年。
我们使用它的原因非常简单,实际上它提供了一个表示框架工作,用于重新打包,重新标记与许多不同产品相同的编译应用程序,我们对字符串,常规资源,工具栏和一般进行一般过滤和替换菜单。
作为L-GPL,我们提供源,版权等,并且只动态链接到库。
答案 1 :(得分:2)
挂钩标准WinAPI功能是相对安全的,因为它们在不久的将来不会发生太大变化,如果有的话,因为微软会这样做 最好使WinAPI在版本之间保持向后兼容。 我认为,标准的WinAPI挂钩通常是稳定且安全的。
在目标程序的内部结构中挂钩其他任何东西都是另一回事。 无论目标程序如何,挂钩本身通常都是一种可靠的做法。这个过程中最薄弱的环节通常是找到正确的点, 并坚持下去。
应用程序中最小的更改可以并且将更改函数的地址,更不用说动态库等等。
在游戏中,挂钩是标准做法,这在某种程度上已经被“sigscanning”击败,这是LanceVorgin在臭名昭着的一种技术 MPC板。它的工作原理是扫描可执行映像中的函数的静态部分,除非实际指令字节不会改变 功能的动作被修改。 Sigscanning显然比使用静态地址表更好,但是当目标应用程序发生足够的变化时,它最终也会失败。
可以找到c ++中sigscanning的示例实现here。
答案 2 :(得分: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 和一个仍在开发中的时移应用程序。
答案 3 :(得分:1)
很多人忘了的是,windows dll被编译为hot-patchable images(MSDN)。
热补丁是WinAPI绕行的最佳方式,因为它干净简洁,并保留了原始功能,这意味着不需要使用内联汇编,只需稍加调整的函数指针。
可以找到一个小的热补丁教程here。