什么铸造了32位地址的类型(BYTE *)和(DWORD *)之间

问题描述:

我的程序运行在32位的Windows地址的虚拟内存空间的类型不同,所以是DWORD。我想通过更改IAT中API的地址来挂接API。所以,我首先获取目标进程映像的基址。然后,我尝试获取IMAGE_OPTIONAL_HEADER结构的起始地址。什么铸造了32位地址的类型(BYTE *)和(DWORD *)之间

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_hCurrentProcessBaseBYTE*,但起初,我把它铸造于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

*指针运算* – WhozCraig

根据指向的值的类型,指针算术是不同的。

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

当铸造​​,它只是增加了24到地址(​​为1字节)

注意:如果您真的想你的指针作为DWORD(不是这里的情况):

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

或计算使用BYTE*投的指针,然后DWORD*