关于c ++:GetModuleHandle(),用于另一个进程中的DLL

GetModuleHandle(), for a DLL in another process

标题确实说明了所有这些,我有一个进入另一个过程的过程。 我需要能够在该程序上使用非Windows标准的DLL的GetModuleHandle,而且我没有主程序的源代码。

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

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

谢谢。


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

解决方案1:

IMO最简单的解决方案是将DLL注入目标进程,并从目标进程本身中检索所有需要的信息。有多种方法可以将DLL放入目标进程,我最喜欢的是Reflective DLL Injection。

解决方案2:

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

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

例如:targetProc = myProc - myModule + targetModule;,其中myProc是char *,而myModule和targetModule是HMODULE

解决方案3:

解决方案3是最难实施的IMO。此解决方案要求您读取目标的过程存储器以找到所需的模块,然后解析这些模块以查找功能地址。

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

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