对于商业应用程序中使用的 API 挂钩库或代码,您有什么建议?
我看过 Microsoft Detours,它似乎非常好,但绝对超出了我期望从我的应用程序中获得的利润的预算。
是否有任何库提供跨 WinXP 和 Vista 的兼容性(如果不是太多要求的话,还有 Windows 7!)?有没有人在商业产品中使用过这样的库?
在系统范围内,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 上的问题。您可以使用文件系统过滤器驱动程序监视某些文件系统活动。
你也可以试试 NCodeHook 库(http://newgre.net/ncodehook),它是免费的而且很小。
我推荐MinHook。它绝对是你能找到的最好的免费库,而且不比 Microsoft Detours 差。
你想做什么?修补导入表是否足够?我在家里使用了http://jpassing.wordpress.com/2008/01/06/using-import-address-table-hooking-for-testing/的变体来进行一些有趣的副业。
你可以试试 EasyHook,它看起来很有用。虽然不能修补“系统范围”,但您需要类似代理 DLL 的东西。
您是否尝试过Deviare API Hook ...
Deviare 是根据商业和开源许可证(GNU 通用公共许可证第 3 版)获得许可的。