GetModuleHandle(),用于另一个进程中的 DLL

use*_*117 3 c++ module getprocaddress createremotethread

标题真的解释了这一切,我有一个进程进入另一个进程。我需要能够在此程序上为某个非 Windows 标准的 DLL 调用 GetModuleHandle,而且我没有主程序的源代码。

我需要使用它来调用带有 GetProcAddress 的导出函数,最后在 CreateRemoteThread 中使用它来远程启动该程序上的任务。

无论如何我可以从另一个程序而不是它正在创建远程线程的本地程序中获取 ModuleHandle 吗?

谢谢。

Smi*_*_61 6

我看到了三种可能的解决方案。据我所知,没有 Windows API 允许您获取另一个进程中模块的函数地址。


解决方案1:

IMO 最简单的解决方案是将 DLL 注入目标进程并从目标进程本身检索所有需要的信息。有很多不同的方法可以让你的 DLL 进入目标进程,我最喜欢的是反射 DLL 注入


解决方案2:

解决方案 2 使用EnumProcessModules ( Usage )HMODULE从另一个进程获取引用。您不能GetProcAddress直接在调用中使用这些。解决这个问题的方法是使用LoadLibraryEx将 DLL 加载到您的进程中( "MODULE_NAME", NULL, DONT_RESOLVE_DLL_REFERENCES )。在成功加载模块后,这将为您提供一个HMODULE实例,您可以将其传递给GetProcAddress.

from 返回的地址GetProcAddress仅对您的地址空间有效,但幸运的是它也与模块库相关。通过HMODULE从地址中减去您的引用,然后将其添加到HMODULE目标进程中的引用,您将获得目标进程中函数的地址。

例如:targetProc = myProc - myModule + targetModule;其中 myProc 是 achar *并且 myModule 和 targetModule 是HMODULE


解决方案3:

解决方案 3 是最难实施的 IMO。这个方案需要你读取目标的进程内存来定位需要的模块,然后解析模块找到函数地址。

可以在此处此处找到此解决方案的资源。


我没有亲自测试过解决方案 2 或 3,但理论上它们应该可以工作。我个人使用了解决方案 1,并建议将其作为实现这一目标的方法。另外两个解决方案需要大量样板代码来模拟现有的 Windows API 方法。