我对使用API监视/劫持来实现我正在工作的项目的一些核心功能很感兴趣。也有人提到过in this question,但这并不是真正的主题,所以我认为在这个问题上有自己的问题会更好。
我想收集尽可能多的关于这方面的信息,不同的技术/库(MS Detours,IAT patching)或其他建议。
此外,如果有人有使用这种技术的实际生产经验,那将是一件特别有趣的事情--它们是否足够稳定,可以用于生产代码,或者这只是一种用于研究的技术?它能在多个版本的windows上正常工作吗?它有多容易出现bug?
个人经历和外部链接都很受欢迎。
发布于 2008-09-18 12:34:06
我实现了syringe.dll (L-GPL),而不是MS Detour(我们不喜欢许可证要求或为x64支持而支付的巨额费用)它工作得非常好,我将它从Win32移植到Win64,我们已经在我们的自我商业应用程序中使用了大约2年。
我们使用它的原因非常简单,实际上它提供了一个表示框架,用于重新打包,将相同的已编译应用程序重新标记为许多不同的产品,我们对字符串、通用资源、工具栏和菜单进行常规过滤和替换。
作为L-GPL'd,我们提供源代码,版权等,并且只动态链接到库。
发布于 2008-09-18 12:40:58
挂接标准的WinAPI函数是相对安全的,因为它们在不久的将来不会有太大的变化,如果有的话,因为微软这样做了,所以最好让WinAPI在不同版本之间保持向后兼容。我想说的是,标准的WinAPI挂钩通常是稳定和安全的。
挂起任何其他东西,如在目标程序的内部,则是另一回事。无论目标程序是什么,挂钩本身通常都是一种可靠的实践。这个过程中最薄弱的一环通常是找到正确的位置,并抓住它。
应用程序中最小的更改都可以并将更改函数的地址,更不用说动态库等了。
在游戏黑客中,钩子是标准的做法,这在某种程度上被"sigscanning“击败了,这是一种由LanceVorgin最先在有些臭名昭著的MPC板上开发的技术。它的工作原理是通过扫描可执行映像来查找函数的静态部分,即除非修改函数的操作,否则实际的指令字节不会改变。签名扫描显然比使用静态地址表更好,但当目标应用程序发生足够多的更改时,它最终也会失败。
可以在here中找到c++中sigscanning的示例实现。
发布于 2008-09-18 13:54:12
我使用标准的IAT钩子技术已经有几年了,它工作得很好,很稳定,并且移植到x64上没有任何问题。我遇到的主要问题更多的是与我如何注入钩子有关,我花了相当长的时间才弄清楚如何最好地在托管进程启动的“正确”点挂起它们,以便注入对我来说是可靠的和足够早的。我的注入器使用Win32调试API,虽然这使得挂起非托管进程变得很容易,但在适当的时间挂起托管进程需要进行一些试验和错误。
我的主要用途是编写测试工具,我有一个死锁检测程序,这里详细介绍了:http://www.lenholgate.com/blog/2006/04/deadlock-detection-tool-updates.html,一个GetTickCount()控制程序,可以从这里http://www.lenholgate.com/blog/2006/04/tickshifter-v02.html下载,以及一个仍在开发中的时移应用程序。
https://stackoverflow.com/questions/91935
复制相似问题