【发布时间】:2016-09-29 12:52:20
【问题描述】:
我的程序运行在 32 位 Windows 上,所以虚拟内存空间中的地址类型是DWORD。我想通过更改 IAT 中 API 的地址来挂钩 API。所以,我先得到目标进程映像的基地址。然后,我尝试获取 IMAGE_OPTIONAL_HEADER 结构的起始地址。
IMAGE_OPTIONAL_HEADER32* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((BYTE*)g_hCurrentProcessBase+pDosHeader->e_lfanew+24); //variable g_hCurrentProcessBase is the base address of the image of the target process
如你所见,我将 g_hCurrentProcessBase 转换为 BYTE* 类型,但一开始,我将其转换为 DWORD* 类型,如下所示:
IMAGE_OPTIONAL_HEADER32* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((DWORD*)g_hCurrentProcessBase+pDosHeader->e_lfanew+24);
但它不起作用,得到了一个错误的地址 IMAGE_OPTIONAL_HEADER 结构。
但是变量g_hCurrentProcessBase 的值应该是DWORD(我在32 位Windows 系统上运行),但是将此变量转换为DWORD * 不起作用,导致地址错误。但是将其转换为 BYTE* 有效,那么它们之间有什么区别?为什么将其转换为 DWORD * 不起作用?
【问题讨论】:
-
指针算法
标签: c++ windows byte portable-executable dword