9

对于商业应用程序中使用的 API 挂钩库或代码,您有什么建议?

我看过 Microsoft Detours,它似乎非常好,但绝对超出了我期望从我的应用程序中获得的利润的预算。

是否有任何库提供跨 WinXP 和 Vista 的兼容性(如果不是太多要求的话,还有 Windows 7!)?有没有人在商业产品中使用过这样的库?

4

6 回答 6

18

在系统范围内,Win32 中的 API 挂钩实际上是不可能的。您可以通过将 DLL 注入每个进程然后从内部修补每个进程来近似它。您可以使用 IAT 修补(修补调用二进制文件的位置)或 Detours 样式的修补程序(修补被调用者的位置)。

给调用者打补丁(IAT 打补丁)意味着您需要枚举进程中加载​​的每个 DLL 并分别打补丁。您还需要挂钩LoadLibrary以修补动态加载的任何新 DLL。

修补被调用者(Detours)的优点是您只需修补一个位置即可使钩子应用于整个过程。

即使您从共享系统 DLL 挂钩 API,您也必须为每个进程打补丁;操作系统将调用写时复制,当您修补系统 DLL 时,该进程将获得一个要修补的私有副本。

DLL 注入变得有点讨厌,而且还有几种技术:AppInit_DLLs,它只适用于加载的进程USER32.DLL(并且在 Vista 和 Windows 7 中有几个新限制),使用SetWindowsHookEx,或使用CreateRemoteThread. Vista 和 Windows 7 中的完整性级别使得注入系统范围内的进程变得更加困难。您的应用程序需要以管理员权限和高完整性级别运行才能成功完成。

另一种技术是在内核模式下挂钩系统服务。这需要编写设备驱动程序,但它基本上是Sysinternals Process Monitor使用的技术(或者至少曾经使用过一次)。由于PatchGuard和驱动程序签名要求,这是 64 位 Vista 和 Win7 上的问题。您可以使用文件系统过滤器驱动程序监视某些文件系统活动。

于 2009-12-17T06:47:52.300 回答
3

你也可以试试 NCodeHook 库(http://newgre.net/ncodehook),它是免费的而且很小。

于 2009-11-12T15:21:29.997 回答
2

我推荐MinHook。它绝对是你能找到的最好的免费库,而且不比 Microsoft Detours 差。

于 2013-10-01T14:45:50.627 回答
1

你想做什么?修补导入表是否足够?我在家里使用了http://jpassing.wordpress.com/2008/01/06/using-import-address-table-hooking-for-testing/的变体来进行一些有趣的副业。

于 2009-07-07T03:52:52.350 回答
0

你可以试试 EasyHook,它看起来很有用。虽然不能修补“系统范围”,但您需要类似代理 DLL 的东西。

http://www.codeplex.com/easyhook

于 2009-09-24T19:47:33.130 回答
0

您是否尝试过Deviare API Hook ...

Deviare 是根据商业和开源许可证(GNU 通用公共许可证第 3 版)获得许可的。

于 2015-10-11T14:34:58.227 回答