DWORD baseAddress = (DWORD) GetModuleHandle(NULL);
如果我将该代码放入 DLL 并将其注入进程,那似乎等于注入进程的基地址。
这究竟是如何工作的?从 HMODULE 到 DWORD 的转换如何工作?如果我将它转换为 void* 而不是 DWORD,它会起作用吗?
这是 32 位和 64 位版本的 Windows 的实现细节。HMODULE 比这更早,在 16 位版本的 Windows 中,它们是真正的句柄。这在 win32 中不再需要,加载模块的虚拟内存地址唯一地标识模块。因此,最好使用 VM 地址,无需将其保存在句柄表中。
这确实意味着您不能转换为 DWORD,不足以在 64 位版本上存储虚拟内存地址。您需要使用 DWORD_PTR。
它之所以有效,是因为 Windows 恰好使用基地址作为识别句柄,并且因为在 32 位系统上,地址适合 DWORD。由于 Windows 不需要这样做,因此您不应该依赖它来做任何事情。