如何拦截dll方法调用?
它有哪些技术?
它只能在C/C++中完成吗?
如何拦截从所有正在运行的进程到给定dll的方法调用?
如何拦截从给定进程到给定dll的方法调用?
shoosh.. 10
我可以通过两种标准方式来实现这一目标
DLL导入表钩子.
为此,您需要解析DLL的PE标头,找到导入表并写入您自己的函数的地址,而不是已经写入的地址.您可以保存原始功能的地址,以便以后调用它.此维基百科文章的外部链接中的引用应该为您提供执行此操作所需的所有信息.
直接修改代码.找到要挂钩的函数的实际代码,并修改它的第一个操作码以跳转到您自己的代码.你需要保存那里的操作码,这样他们最终会被执行.这比听起来更简单,因为它已经以Detours库的形式以不低于Microsoft的方式实现.
这是一个非常巧妙的事情.只需几行代码,您就可以从outlook.exe中替换所有对GetSystemMetrics()的调用,并观察发生的奇迹.
一种方法的优点是另一种方法的缺点.第一种方法允许您将所有其他DLL以非挂钩方式完全添加到您想要的DLL的外科挂钩.第二种方法允许你最全局的钩子拦截所有调用功能.
我可以通过两种标准方式来实现这一目标
DLL导入表钩子.
为此,您需要解析DLL的PE标头,找到导入表并写入您自己的函数的地址,而不是已经写入的地址.您可以保存原始功能的地址,以便以后调用它.此维基百科文章的外部链接中的引用应该为您提供执行此操作所需的所有信息.
直接修改代码.找到要挂钩的函数的实际代码,并修改它的第一个操作码以跳转到您自己的代码.你需要保存那里的操作码,这样他们最终会被执行.这比听起来更简单,因为它已经以Detours库的形式以不低于Microsoft的方式实现.
这是一个非常巧妙的事情.只需几行代码,您就可以从outlook.exe中替换所有对GetSystemMetrics()的调用,并观察发生的奇迹.
一种方法的优点是另一种方法的缺点.第一种方法允许您将所有其他DLL以非挂钩方式完全添加到您想要的DLL的外科挂钩.第二种方法允许你最全局的钩子拦截所有调用功能.
如果您事先知道所有DLL函数,一种技术是编写自己的包装器DLL,将所有函数调用转发给真正的DLL.此DLL不必用C/C++编写.您需要做的就是匹配原始DLL的函数调用约定.