1
如果您涉足这一领域,那么您已经知道Microsoft Research的Detours在API挂钩方面几乎树立了基准。那么为什么我们不迅速进行比较呢?与DETOURS VS.带有非商业许可证的MHOOK Detours是免费提供的,但仅支持x86平台。Detours也可以被许可用于商业用途,这也为您提供了全面的x64支持,但是您只有在签署NDA后才能看到许可条件。Mhook是根据MIT许可证免费发行的,并支持x86和x64。Detours避开了正式支持将钩子附加到正在运行的应用程序的想法。当然,您可以自由执行此操作-但是如果最终在此处或此处导致随机崩溃,则只能怪自己。Mhook旨在能够在正在运行的应用程序中设置和删除挂钩-毕竟,这就是您在现实世界中所需要的。尽力避免覆盖可能被另一个线程执行的代码。Detours支持事务挂钩和脱钩;也就是说,采用全有或全无的方法同时设置一堆钩子。仅当可以全部设置挂钩时,才会设置挂钩,否则库将回滚所做的任何更改。Mhook不会这样做。最后,Mhook在管理其使用的蹦床的内存时非常懒惰。Detours根据需要分配内存块,并使用结果数据区域在内部存储尽可能多的蹦床。另一方面,Mhook对每个已设置的挂钩使用一次对VirtualAlloc的调用。每个钩子都需要少于100字节的存储空间,因此这非常浪费,因为VirtualAlloc每次Mhook调用时都会从进程的虚拟地址空间中抢走64K。(实际分配的内存将是一个页面,这也很浪费。)但是,最后,这实际上并不重要,除非您在应用程序中设置了大量的挂钩。另外,这很容易解决。