标题确实解释了这一切,我有一个进程进入另一个进程。我需要能够在这个程序上为某个不是 Windows 标准的 DLL 获取模块句柄,并且我没有主程序的源代码。
我需要使用它来调用带有 GetProcAddress 的导出函数,最后在 CreateRemoteThread 中使用它来远程启动该程序上的任务。
无论如何我可以从另一个程序中获取一个 ModuleHandle,而不是它正在创建远程线程的本地程序吗?
谢谢。
标题确实解释了这一切,我有一个进程进入另一个进程。我需要能够在这个程序上为某个不是 Windows 标准的 DLL 获取模块句柄,并且我没有主程序的源代码。
我需要使用它来调用带有 GetProcAddress 的导出函数,最后在 CreateRemoteThread 中使用它来远程启动该程序上的任务。
无论如何我可以从另一个程序中获取一个 ModuleHandle,而不是它正在创建远程线程的本地程序吗?
谢谢。
我看到了三种可能的解决方案。据我所知,没有 Windows API 允许您在另一个进程中获取模块的函数地址。
解决方案1:
最简单的解决方案 IMO 是将 DLL 注入目标进程并从目标进程本身中检索所有需要的信息。有许多不同的方法可以让你的 DLL 进入目标进程,我最喜欢的是反射 DLL 注入。
解决方案2:
解决方案 2 使用EnumProcessModules ( Usage ) 从另一个进程获取HMODULE
引用。您不能GetProcAddress
直接在调用中使用这些。解决此问题的方法是使用LoadLibraryEx将 DLL 加载到您的进程中( "MODULE_NAME", NULL, DONT_RESOLVE_DLL_REFERENCES )
。这会在模块加载成功后为您提供一个HMODULE
实例,您可以将其传递给GetProcAddress
.
从返回的地址GetProcAddress
仅对您的地址空间有效,但幸运的是它也与模块库相关。通过从地址中减去您的HMODULE
引用,然后将其添加到HMODULE
目标进程中的引用,您将获得目标进程中函数的地址。
例如:targetProc = myProc - myModule + targetModule;
myProc 是 achar *
而 myModule 和 targetModule 是HMODULE
.
解决方案3:
解决方案 3 是最难实施的 IMO。该解决方案要求您读取目标的进程内存以定位所需的模块,然后解析模块以找到函数地址。
我没有亲自测试过解决方案 2 或 3,但理论上它们应该可以工作。我个人使用了解决方案 1,并建议将其作为实现此目的的方法。其他两个解决方案需要大量样板代码来模拟现有的 Windows API 方法。