C++ 拦截应用程序对DLL的函数调用

C++ 拦截应用程序对DLL的函数调用,c++,function,dll,C++,Function,Dll,情况如下: 假设我有一个依赖于库“Library.dll”的应用程序“App”。我想知道函数在运行时调用“App”的情况。假设我无法访问“App”或“library.dll”的源代码,但我知道存在的每个函数的名称和参数都是“library.dll”。我有没有办法找出“library.dll”中的哪些函数被“App”调用 我在stackoverflow中看到了类似的问题: 我的Ates Goral先生的回答让我很感兴趣,他提到编写一个包装器DLL,将函数调用转发到真实的DLL。我希望有人能给我提供

情况如下:

假设我有一个依赖于库“Library.dll”的应用程序“App”。我想知道函数在运行时调用“App”的情况。假设我无法访问“App”或“library.dll”的源代码,但我知道存在的每个函数的名称和参数都是“library.dll”。我有没有办法找出“library.dll”中的哪些函数被“App”调用

我在stackoverflow中看到了类似的问题:

我的Ates Goral先生的回答让我很感兴趣,他提到编写一个包装器DLL,将函数调用转发到真实的DLL。我希望有人能给我提供一些关于如何实现这一点的见解,或者给我指出一个我可以从中获得信息的地方

我最感兴趣的两个部分是让我的应用程序加载我的.dll,以及如何将函数实际转发到原始的“library.dll”


谢谢

包装器DLL工作得非常完美-下面是它的工作原理:

让我们假设,
library.dll
导出
intsomefunct(inti,void*o)
——您现在可以创建自己的dll,使用类似

#include <windows.h>

//Declare this for every function prototype
typedef int (*int_f_int_pvoid)(int,void*);

//Declare this for every function
int_f_int_pvoid lib_somefunct


//this snipplet goes into dllmain
...
HINSTANCE hlibdll = LoadLibrary("X:\PATH\TO\renamed_library.dll");
//For every function
lib_somefunct=(int_f_int_pvoid)GetProcAddress(hlibdll,"somefunct");
...


//Again for every function    
int somefunct(int i, void* o)
{
    //Log the function call and parameters
    //...

    //Call library.dll
    int result=lib_somefunct(i, o);


    //Log the result 
    //...

    return result;
}
#包括
//为每个函数原型声明这一点
typedef int(*int_f_int_pvoid)(int,void*);
//为每个函数声明这个
int_f_int_pvoid lib_somefunc
//这个小飞贼进入德勒曼
...
HINSTANCE hlibdll=LoadLibrary(“X:\PATH\TO\rename_library.dll”);
//每种功能
lib_somefunct=(int_f_int_pvoid)GetProcAddress(hlibdll,“somefunct”);
...
//对于每个函数都是如此
int somefunct(int i,void*o)
{
//记录函数调用和参数
//...
//调用library.dll
int result=lib_somefunct(i,o);
//记录结果
//...
返回结果;
}
导出函数,将原始DLL重命名为
重命名的库.DLL后,将生成的DLL命名为
library.DLL

现在,目标EXE将加载(您的)
library.dll
,而这反过来将加载(原始的,但已重命名的)
renamed\u library.dll
——并且每当目标程序调用函数时,它将运行您的日志代码

警告:您的tragetexe可能是多线程的,所以请准备好使用线程安全的日志机制


我已成功地使用此方法调试了一个奇怪的MAPI问题。

Google for“dll包装生成器”。一年前在Perl中有过,但不记得名称。我肯定还有其他人。这正是我想要的。您为我的项目提供了一个很好的起点,我感谢您的帮助。