推荐的方法是什么,用于商业应用程序挂钩Win32 API?

9

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

我已经看过了微软Detours,它似乎非常不错,但是它的价格肯定超出了我预期的应用利润。

是否有任何库能够在WinXP和Vista之间提供兼容性(如果可以的话还包括Windows 7)?是否有人曾经在商业产品中使用过这样的库,并且有经验?


如果您能说明要挂钩哪些API以及原因,那会很有帮助。 - Michael
Detours是一个仪器包。你想要做的就是为Win32 DLL添加仪器吗? - Robert Harvey
首先,非常抱歉没有及时回复,我正在度长假。回到主题,我想要钩取Windows的CreateProcess和文件处理函数。基本上,我希望我的应用程序在Windows操作系统触及文件(可能是一个EXE文件)之前获得控制权。 - user133790
6个回答

18

在Win32中,系统范围内的API挂钩不太可能实现。您可以通过将DLL注入到每个进程中并从内部对每个进程进行修补来近似实现它。您可以使用IAT修补(其中您对调用二进制文件进行修补)或Detours样式的修补(其中您对被调用者进行修补)。

修补调用方(IAT修补)意味着您需要枚举在进程中加载的每个DLL并单独对每个DLL进行修补。您还需要挂钩LoadLibrary以便修补任何新加载的DLL。

修补被调用方(Detours)的优点是只需修补一个位置即可使挂钩应用于整个进程。

即使您从共享的系统DLL挂接API,您仍需要执行按进程的修补;操作系统会调用写时复制,当您修补系统DLL时,进程会获得一个私有副本进行修补。

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

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


3

...但是文档记录不够完善。仍然+1。 - 0xC0000022L

2
我建议您使用MinHook。它绝对是您能找到的最好的免费库,不亚于微软的Detours。

我在许多场合成功地使用了MinHook。绝对值得推荐。 - Qix - MONICA WAS MISTREATED

1

0
你可以尝试使用EasyHook,它看起来很有用。但是无法进行“系统范围”的补丁,你需要像代理DLL这样的东西。

http://www.codeplex.com/easyhook


EasyHook已经迁移到https://github.com/EasyHook/EasyHook。 - brewmanz

0
你尝试过 Deviare API Hook 吗?...

Deviare 采用商业和开源许可证(GNU通用公共许可证第3版)授权。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接