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

What's the difference between casting the type of a 32 bit address to (BYTE *) and (DWORD *)

我的程序运行是32位的Windows,所以虚拟内存space中的地址类型是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 * 不起作用?

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

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

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

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

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

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