我有一个小问题。我已将 DLL 加载到进程中(它不是我的),我必须在其中使用函数。我已经得到了这个函数的偏移量,所以我要做的就是获取 DLL 地址并将偏移量添加到该函数中。 GetModuleHandle()
返回 HMODULE
变量,但实际上我不知道 HMODULE
是什么。它是加载的 DLL 的地址还是某种其他标记?
如果它不是加载DLL的地方的地址,我怎么能得到这个地址?我希望我说清楚。
原文由 Blood 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个小问题。我已将 DLL 加载到进程中(它不是我的),我必须在其中使用函数。我已经得到了这个函数的偏移量,所以我要做的就是获取 DLL 地址并将偏移量添加到该函数中。 GetModuleHandle()
返回 HMODULE
变量,但实际上我不知道 HMODULE
是什么。它是加载的 DLL 的地址还是某种其他标记?
如果它不是加载DLL的地方的地址,我怎么能得到这个地址?我希望我说清楚。
原文由 Blood 发布,翻译遵循 CC BY-SA 4.0 许可协议
它类似于 POSIX dlopen()
void*
(它甚至可能是 typedef - 但我不确定)。您将其传递给 GetProcAddress
作为参数。完成后,您还将它传递给 FreeLibrary
以卸载 DLL。
原文由 ThiefMaster 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
您提出的方法将正常工作。
似乎您已将 dll 注入目标进程,并希望从注入 dll 的进程中获取目标进程中该 dll 中的函数地址。
我假设您还在将 dll 注入目标进程的进程中加载了 dll,并且您希望在目标进程中创建一个远程线程并让它在目标进程中执行目标函数。
由于您注入的 dll 可能不会在目标进程中加载到与注入过程中相同的地址,因此您不能简单地使用通过在注入过程中调用 GetProcAddress 函数获得的地址。
HMODULE 只是 DLL 的基地址(有关详细信息,请参阅 此答案)。因此,您可以在注入过程中获取 dll 的 HMODULE,然后从函数上 GetProcAddress 返回的地址中减去它。然后可以将目标进程中注入的dll的HMODULE添加到这个偏移量中,以获取目标进程中注入的dll中目标函数的地址。假设此函数具有正确的签名,请将其作为线程函数传递给您的调用以创建远程线程,并且您现在正在目标进程中运行目标函数。
我在 这个答案 中更详细地解释了这一点。