我的程序在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 *
不能工作?
答案 0 :(得分:3)
指针算法根据其指向的值的类型而不同。
如果您将指针投向DWORD
,则添加24实际上会将24*sizeof(DWORD)
添加到您的地址。
当转换为BYTE
时,它只会向地址添加24(BYTE
是1个字节)
注意:如果您确实希望您的指针为DWORD
(此处不是这样):
如果要跳过24个字节,只需将24/sizeof(DWORD)
添加到DWORD*
指针即可。
由于DWORD的大小为4,因此可以按照您的需要工作(即使它是2或8也可以。)
或者使用BYTE*
强制转换计算指针,然后强制转换为DWORD*