3
DWORD baseAddress = (DWORD) GetModuleHandle(NULL);

如果我将该代码放入 DLL 并将其注入进程,那似乎等于注入进程的基地址。

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

4

2 回答 2

5

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

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

于 2013-08-05T20:34:51.347 回答
3

它之所以有效,是因为 Windows 恰好使用基地址作为识别句柄,并且因为在 32 位系统上,地址适合 DWORD。由于 Windows 不需要这样做,因此您不应该依赖它来做任何事情。

于 2013-08-05T20:30:06.403 回答