对于商业应用程序中使用的API挂钩库或代码,您有什么建议?
我看过微软Detours,这看起来非常好,但绝对超出预算,我期待从我的应用程序中获利。
是否有任何库可以提供WinXP和Vista之间的兼容性(如果没有太多要求,可以提供Windows 7)?有没有过在商业产品中使用这种库的经验的人?
答案 0 :(得分:17)
在整个系统范围内,Win32中的API挂钩实际上是不可能的。您可以通过将DLL注入每个进程然后从内部修补每个进程来近似它。您可以使用IAT修补(修补调用二进制文件的地方)或Detours风格的修补程序(修补被调用者)。
修补调用者(IAT修补)意味着您需要枚举进程中加载的每个DLL并分别修补每个DLL。您还需要挂钩LoadLibrary
以便修补任何即时加载的新DLL。
修补被调用者(Detours)的优点是你只需要修补一个位置以使钩子适用于整个过程。
即使您从共享系统DLL挂钩API,也必须执行每进程修补;操作系统将调用copy-on-write,当您修补系统DLL时,将为该进程提供一个要修补的私有副本。
DLL注入变得有点讨厌,并且有几种技术:AppInit_DLLs
,它只适用于加载USER32.DLL
的进程(并且在Vista和Windows 7中有几个新的限制),使用SetWindowsHookEx
或使用CreateRemoteThread
。 Vista和Windows 7中的Integrity levels使得向系统范围内的进程注入更加困难。您的应用需要以管理员权限和高完整性级别运行才能成功将其关闭。
另一种技术是在内核模式下挂钩系统服务。这需要编写设备驱动程序,但它基本上是Sysinternals Process Monitor使用的技术(或者至少使用过一次)。由于PatchGuard和驱动程序签名要求,这是64位Vista和Win7上的问题。您可以使用file system filter驱动程序监视某些文件系统活动。
答案 1 :(得分:3)
您也可以尝试使用NCodeHook lib(http://newgre.net/ncodehook),它是免费的。
答案 2 :(得分:2)
我建议MinHook。它绝对是你能找到的最好的免费图书馆,并不比微软Detours差。
答案 3 :(得分:1)
你想做什么?修补导入表是否足够?我在家中使用http://jpassing.wordpress.com/2008/01/06/using-import-address-table-hooking-for-testing/的变体来进行一些有趣的侧面项目。
答案 4 :(得分:0)
你可以试试EasyHook,看起来很有用。但是无法修补“系统范围”,你需要像代理DLL这样的东西。
答案 5 :(得分:0)
你试过Deviare API Hook ...
Deviare根据商业和开源许可证(GNU通用公共许可证第3版)获得许可。