将 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*
我的程序运行是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*