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

时间:2014-10-16 02:25:39

标签: c++ module getprocaddress createremotethread

标题解释了这一切,我有一个流程进入另一个流程。我需要能够GetModuleHandle,在这个程序中为某个不是Windows标准的DLL,我没有主程序的源代码。

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

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


解决方案1:

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


解决方案2:

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

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

Ex:targetProc = myProc - myModule + targetModule;其中myProc为char *,myModule和targetModule为HMODULE


解决方案3:

解决方案3是最难实施的IMO。此解决方案要求您读取目标的进程内存以找到所需的模块,然后解析模块以查找函数地址。

可以找到此解决方案的资源herehere


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