将32位地址的类型转换为(BYTE *)和(DWORD *)之间的区别是什么?

时间:2016-09-29 12:52:21

标签: c++ windows byte portable-executable dword

我的程序在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 *不能工作?

1 个答案:

答案 0 :(得分:3)

指针算法根据其指向的值的类型而不同。

如果您将指针投向DWORD,则添加24实际上会将24*sizeof(DWORD)添加到您的地址。

当转换为BYTE时,它只会向地址添加24(BYTE是1个字节)

注意:如果您确实希望您的指针为DWORD(此处不是这样):

如果要跳过24个字节,只需将24/sizeof(DWORD)添加到DWORD*指针即可。 由于DWORD的大小为4,因此可以按照您的需要工作(即使它是2或8也可以。)

或者使用BYTE*强制转换计算指针,然后强制转换为DWORD*