Windows API间谍/劫持技术

时间:2020-03-06 14:20:58  来源:igfitidea点击:

我对使用API​​间谍/劫持实现我正在研究的项目的某些核心功能感兴趣。在这个问题中也曾提到过,但这并不是真正的话题,因此我认为最好有一个自己的问题。

我想收集有关此信息,不同技术/库(MS Detours,IAT修补程序)或者其他建议的尽可能多的信息。

另外,知道某人是否有使用这种技术的实际生产经验尤其有趣-他们是否可以足够稳定以生产代码,或者这严格来说是一种研究技术?它可以在Windows的多个版本上正常工作吗?它有多容易发生错误?

个人经验和外部联系均受到赞赏。

解决方案

我实施了而不是MS Detours(我们不喜欢许可证要求或者不愿为x64支付巨额费用)的MS.tourtours.dll(L-GPL),它的运行效果非常好,我将其从Win32移植到Win64,我们一直在使用大约2年的自我商业应用程序。

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

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

挂钩标准WinAPI函数相对安全,因为在不久的将来它们不会有太大变化,因为微软这样做了。
最好保持WinAPI在各个版本之间向后兼容。
我想说,标准WinAPI挂钩通常是稳定和安全的。

像在目标程序的内部一样,钩住其他任何东西都是另外一回事。
不管目标程序是什么,挂钩本身通常都是可靠的做法。该过程最薄弱的环节通常是找到正确的位置,
并挂在上面。

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

在钩子是标准做法的游戏黑客中,这种方式在某种程度上已被" sigscanning"击败了,该技术是由LanceVorgin最初针对臭名昭著的技术开发的
MPC板。它通过扫描可执行程序映像中的函数的静态部分来工作,实际的指令字节不会改变,除非
函数的动作已修改。
Sigscanning显然比使用静态地址表要好,但是如果目标应用程序进行了足够的更改,它最终也会失败。

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

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

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

许多人忘记了Windows dll被编译为可热补丁映像(MSDN)。

热补丁是绕开WinAPI的最佳方法,因为它简洁明了,并且保留了原始功能,这意味着不需要使用任何内联汇编,只需稍微调整一下函数指针即可。

在此处可以找到一个小的热补丁教程。