什么铸造了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_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 *
不起作用?
答
根据指向的值的类型,指针算术是不同的。
如果您将指针投射到DWORD
,则添加24实际上会将24*sizeof(DWORD)
添加到您的地址。
当铸造,它只是增加了24到地址(为1字节)
注意:如果您真的想你的指针作为DWORD
(不是这里的情况):
如果您想跳过24个字节,只需将24/sizeof(DWORD)
添加到您的DWORD*
指针。 由于DWORD的大小为4,它可以按照你的想法工作(即使是2或8,它也可以工作)。
或计算使用BYTE*
投的指针,然后投到DWORD*
*指针运算* – WhozCraig