有两种方法可以想到这样做
> DLL导入表钩.
为此,您需要解析DLL的PE标题,找到导入表,并写入自己的函数的地址,而不是已经在那里编写的地址.您可以保存原始功能的地址,以便稍后调用.这个wikipedia article的外部链接中的引用应该给你所需要的所有信息,以便能够做到这一点.
>直接修改代码.找到要钩住的函数的实际代码,并修改其第一个操作码以跳转到您自己的代码.您需要保存那里的操作码,以便最终执行.这比它听起来更简单,因为它已经以Detours library的形式已经实现了不少于微软本身.
这是一个非常整洁的事情.只需几行代码,您可以从outlook.exe中将所有调用替换为GetSystemMetrics(),并观察发生的奇迹.
一种方法的优点是另一种方法的缺点.第一种方法允许您将一个外科钩子完全添加到您想要的DLL中,其他所有其他DLL都通过未挂钩.第二种方法允许你最全局的钩子拦截所有调用做的功能.