【问题标题】:GetModuleHandle(), for a DLL in another processGetModuleHandle(),用于另一个进程中的 DLL
【发布时间】:2014-10-16 02:25:39
【问题描述】:

标题确实说明了这一切,我有一个进程进入另一个进程。我需要能够在这个程序上为某个非 Windows 标准的 DLL 获取模块句柄,并且我没有主程序的源代码。

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

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

谢谢。

【问题讨论】:

  • 将代码注入目标进程并调用GetModuleHandle。无论如何,您返回的句柄仅在该过程的上下文中才有意义。

标签: c++ module getprocaddress createremotethread


【解决方案1】:

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


解决方案 1:

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


解决方案 2:

解决方案 2 使用 EnumProcessModules ( Usage ) 从另一个进程获取 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 是最难实施的 IMO。该方案需要读取目标进程的内存来定位需要的模块,然后解析模块找到函数地址。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多