DWORD baseAddress = (DWORD) GetModuleHandle(NULL);

如果我将该代码放入一个 DLL 并将其注入(inject)一个进程,这似乎等于注入(inject)进程的基地址。

这究竟是如何工作的?从 HMODULE 到 DWORD 的转换是如何工作的?如果我将它转换为 void* 而不是 DWORD 会起作用吗?

最佳答案

这是 32 位和 64 位版本的 Windows 的实现细节。 HMODULE 比这更旧,在 16 位版本的 Windows 中,它们是真正的句柄。这在 win32 中不再需要,加载模块的虚拟内存地址唯一标识该模块。因此最好使用 VM 地址,无需将其保存在句柄表中。

这确实意味着您不能转换为 DWORD,不足以在 64 位版本上存储虚拟内存地址。您需要使用 DWORD_PTR。

关于c++ - 为什么使用 GetModuleHandle 获取基地址有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18066847/

10-12 15:07