gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:53:29 25 4
gpt4 key购买 nike

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

谢谢。

最佳答案

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

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

如果你不关心是否必须加载dll,只需调用LoadLibrary即可。并获取模块句柄;否则,先打电话 GetModuleHandle ,如果已加载,它将为您提供模块句柄,如果未加载,则为 NULL,如果您想继续,则在调用 LoadLibrary (LoadLibrary 增加 dll 的引用计数,因此您确定 dll 不会同时被卸载)。

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

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

请注意,所有这些事情都无法从注入(inject)函数的 DllMain 内部安全地完成;见here .

关于c++ - 在另一个进程地址空间,调用dll中的函数,如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542296/

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