在另一个进程地址空间中,调用dll中的函数,如何进行

时间:2010-12-27 22:32:14

标签: c++ windows visual-studio-2008 dll dll-injection

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

如果你不在乎是否需要加载dll,只需调用LoadLibrary并获取模块句柄;否则,先调用GetModuleHandle,如果已加载,将为您提供模块的句柄,如果不是,则为NULL,如果您想继续,则在调用后LoadLibrary({ {1}}递增dll的引用计数,因此您确定dll在此期间不会被卸载。)

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

LoadLibrary会返回一个指针,你必须使用正确的函数签名强制转换为函数指针;现在你已经完成了,只需用它来调用函数,不要忘记调用FreeLibrary将引用计数器递减到dll。

请注意,所有这些内容都无法从注入函数的GetProcAddress内部安全地完成;见here

答案 1 :(得分:0)

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