【问题标题】:What's the difference between casting the type of a 32 bit address to (BYTE *) and (DWORD *)将 32 位地址的类型转换为 (BYTE *) 和 (DWORD *) 有什么区别
【发布时间】:2016-09-29 12:52:20
【问题描述】:

我的程序运行在 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 * 不起作用?

【问题讨论】:

  • 指针算法

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


【解决方案1】:

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

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

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

注意:如果你真的希望你的指针是DWORD(这里不是这种情况):

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

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

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 2013-12-11
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多