什么是HMODULE?

17

我有一个小问题。我已经将DLL加载到进程中(它不是我的),我必须使用其中的函数。我已经得到了这个函数的偏移量,所以我需要做的就是获取DLL的地址并将其添加到偏移量上以访问该函数。 GetModuleHandle() 返回 HMODULE 变量,但我实际上不知道 HMODULE 是什么。它是加载的DLL的地址还是其他标记?

如果它不是DLL被加载的位置的地址,我怎样才能获取这个地址呢?我希望我表达清楚。

3个回答

13
你提出的方法可以很好地工作。
看起来你已经将一个dll注入到目标进程中,并希望从注入dll的进程中获取在目标进程中该dll中某个函数的地址。
我假设你还在注入dll的进程中加载了该dll,并且想在目标进程中创建一个远程线程并让它执行目标函数。
由于你注入的dll可能在目标进程中的基址与注入进程中的不同,因此无法直接使用在注入进程中通过调用GetProcAddress获取的地址。
HMODULE只是DLL的基址(详情请见这个答案)。因此,你可以在注入进程中获取dll的HMODULE,并将它从在注入进程中调用GetProcAddress获取的函数地址中减去得到偏移量。然后将偏移量加上目标进程中被注入的dll的HMODULE,就可以获得目标进程中该dll中目标函数的地址。如果该函数具有正确的签名,请将其作为线程函数传递给你调用创建远程线程的函数,然后你现在正在在目标进程中运行该目标函数。
我在这个答案中更详细地解释了这个过程。

谢谢。我有另一个问题。当我像这样做-> http://wklej.org/id/700802/时,我得到了错误的总和。我应该像这样做吗-> http://wklej.org/id/700803/? - Blood
1
David,唯一的情况是如果dll在两个进程中加载的基地址相同,那么它才会被取消。否则,我的答案是有效的,而你的不是 :)。 - Len Holgate
1
我已将 DLL 加载到进程中(不是我的)。我认为这个问题的措辞可以更好,所以在我的回答中解释了我对他问题的理解。虽然再次阅读这句话可能是 DLL 不是他自己的 - 但我原本期望他会纠正我而不是将我的回答标记为正确答案 - 谁知道呢... - Len Holgate
你能再检查一下吗?在64位系统上,我记得将HMODULE强制转换为指针后发现DLL文件不在那里。 - Joshua
Joshua,你有展示失败的代码吗?这个方法在我这里已经使用了好几年了;不过你可能也需要阅读这个答案:https://stackoverflow.com/a/1163681/7925 - Len Holgate
显示剩余3条评论

4

调用GetProcAddress函数。抵消偏移量,因为你既需要添加它(以到达函数),又需要减去它(以获取基地址),所以最好不要费心。


1

它类似于 POSIX 的 dlopen() 函数返回的 void*(甚至可能是一个 typedef,但我不确定)。您将其作为参数传递给 GetProcAddress。完成后,您还将其传递给 FreeLibrary 以卸载 DLL。


typedef void HANDLE; typedef HANDLE HMODULE; 所以HMODULE是void - quantum
2
typedef PVOID HANDLE; typedef void *PVOID;https://learn.microsoft.com/zh-cn/windows/win32/winprog/windows-data-types - TAdrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接