0

好的,所以我将一个 dll 注入到目标进程地址空间中。如何返回目标进程正在使用的 dll 提供的函数列表,比如说 user32.dll;然后假设 user32.dll 包含一个名为 (int test1(str 1, str 2)) 的函数(我知道它没有),我想调用该函数,我该怎么做?

谢谢。

4

2 回答 2

2

你真的需要做你写的所有东西吗?通过 dll 获取导出函数列表并非易事,在获取内存中的模块地址后,您必须遍历几个 PE 格式的数据结构,这并不容易手动完成(尽管DbgHelp 函数自动化了大部分过程)。

另一方面,如果你只是想检查一个 dll 是否被加载并调用它的一个函数,那么工作就变得容易了。

如果您不关心是否必须加载 dll,只需调用LoadLibrary并获取模块句柄即可;否则,首先调用GetModuleHandle,如果已加载,它将为您提供模块的句柄,如果未加载,NULL并且如果您想继续,在调用之后LoadLibrary(LoadLibrary增加 dll 的引用计数,因此您确定 dll 赢了在此期间不要卸载)。

然后,要检查您需要的程序是否存在并获取其地址,请使用GetProcAddress; 请注意,通常 C 函数(如 Windows dll 导出的函数)仅按名称导出,而不是通过签名导出(在 C 中不存在重载);如果要调用使用修饰名称导出的 C++ 过程,则必须指定修饰名称。

GetProcAddress将返回一个指针,您必须将其转换为具有正确函数签名的函数指针;现在你已经完成了,只需使用它来调用函数并且不要忘记调用FreeLibrary以减少对 dll 的引用计数器。

请注意,所有这些东西都不能从DllMain注入函数的内部安全地完成;看这里

于 2010-12-28T01:43:23.587 回答
0

第一种方法是使用 DependencyWalker。您将在此过程中获得每个 dll 的所有导入。当然,这种方法不会涵盖使用 LoadLibrary / GetProcAddress 的动态调用,但要涵盖它,您需要挂钩 LdrLoadDll / GetProcAddress 以获取附加的进程 / dll 正在使用的确切功能。这不是什么大问题,但需要一些时间。

于 2011-01-06T15:08:53.403 回答