gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:26:18 26 4
gpt4 key购买 nike

场景如下:

假设我有这个依赖于这个库“library.dll”的应用程序“App”。我想知道函数调用“App”在运行时执行的操作。假设我无权访问“App”或“library.dll”的源代码,但我知道存在的每个函数的名称和参数都是“library.dll”。有什么办法可以找出“应用程序”正在调用“library.dll”中的哪些函数?

我在stackoverflow看到类似的问题:How to intercept dll method calls?

我的 Ates Goral 先生的回答引起了我的兴趣,他提到编写一个 wrapperDLL 将函数调用转发到真正的 DLL。我希望有人能为我提供一些关于如何实现这一点的见解,或者指出我可以从中获取有关此事的信息的地方。

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

谢谢

最佳答案

包装器 DLL 工作完美 - 这是它的工作原理:

假设 library.dll 导出 int somefunct(int i, 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;
}

导出您的函数,将原始 DLL 重命名为 renamed_library.dll 后,将生成的 DLL 命名为 library.dll

现在目标 EXE 将加载(您的)library.dll,这将加载(原始的,但已重命名的)renamed_library.dll - 并且每当目标程序调用一个函数,它将运行您的登录代码。

警告:您的 traget EXE 可能是多线程的,因此请准备好拥有线程安全的日志记录机制。

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

关于c++ - 拦截应用程序对 DLL 的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10771134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com