GetModuleHandle(),用于另一个进程中的DLL
GetModuleHandle(), for a DLL in another process
标题解释了这一切。真的,我有一个进程正在利用另一个进程。我需要能够在这个程序上为某个不是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方法。
- 读取进程内存多级指针(DLL 注入)
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 如何从目标进程卸载 DLL?
- 当我将 DLL 注入现有进程时,DLLMain 不执行任何操作
- 如何获取 dll 注入到的进程的名称
- 使用参数调用远程进程中的函数(注入的 DLL)
- 如何找出我的dll附加到哪个进程
- Dll进程挂钩不工作
- 如何防止我的dll在某个进程未处于活动状态时运行
- 将 DLL 附加到托管进程不起作用
- 枚举已加载特定 DLL 的进程
- 是否可以使用 c++ 获取与 WinCE 中指定进程关联的所有 Dll 的内存使用情况?
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- 从注入进程的 DLL 调用函数并更改指针函数的地址
- 如何停止DLL中的进程终止异常
- DLL使用sqlite3从不同的进程写入同一个数据库文件
- Dll 注入 - 在另一个进程中编写本机代码
- 动态链接库 (.dll) 中的对象是否跨进程共享
- 在 c# 接口应用程序之间进行通信并注入到另一个进程 dll