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

GetModuleHandle(), for a DLL in another process

本文关键字:进程 DLL 另一个 用于 GetModuleHandle      更新时间:2023-10-16

标题解释了这一切。真的,我有一个进程正在利用另一个进程。我需要能够在这个程序上为某个不是Windows标准的DLL获取ModuleHandle,而且我没有主程序的源代码。

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

我是否可以从另一个程序中获得ModuleHandle,而不是用它创建远程线程的本地程序?

谢谢。

我看到了三种可能的解决方案。据我所知,没有windows API可以让您在另一个进程中获得模块的函数地址。


解决方案1:

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


解决方案2:

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

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

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


解决方案3:

解决方案3是海事组织最难执行的。此解决方案要求您读取目标的进程内存以定位所需的模块,然后解析模块以查找函数地址。

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


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