dispro 2014-06-29 06:32 采纳率: 0%
浏览 707

再次被c++诡异的语法打败

下面是问题的关键代码
IMAGE_DOS_HEADER* pCurrentModelDosHeader =(IMAGE_DOS_HEADER*) ::GetModuleHandle(NULL);
IMAGE_NT_HEADERS32* pCurrentModelNtHeader = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + pCurrentModelDosHeader);//出错
IMAGE_NT_HEADERS32* pCurrentModelNtHeader2 = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + (DWORD)pCurrentModelDosHeader);//正确
WORD MagicNumber= pCurrentModelNtHeader2->OptionalHeader.Magic;

///////////////////////////////////////


反汇编代码对比
IMAGE_NT_HEADERS32* pCurrentModelNtHeader = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + pCurrentModelDosHeader);//出错
012B7544 mov eax,dword ptr [pCurrentModelDosHeader]

012B7547 mov ecx,dword ptr [eax+3Ch]

012B754A shl ecx,6

012B754D add ecx,dword ptr [pCurrentModelDosHeader]

012B7550 mov dword ptr [pCurrentModelNtHeader],ecx

IMAGE_NT_HEADERS32* pCurrentModelNtHeader2 = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + (DWORD)pCurrentModelDosHeader);//正确
012B7553 mov eax,dword ptr [pCurrentModelDosHeader]

012B7556 mov ecx,dword ptr [eax+3Ch]

012B7559 add ecx,dword ptr [pCurrentModelDosHeader]

012B755C mov dword ptr [pCurrentModelNtHeader2],ecx
多出的这句shl ecx,6 把原先结构体成员e_lfanew的偏移乘上了64导致错误结果,可是指针本身应该就是dword类型的啊,为什么还要显示的转换下?

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-13 13:01
    关注

    该回答引用ChatGPT

    在 C++ 中,指针是一种数据类型,它包含一个地址,该地址指向内存中的另一个位置。指针的数据类型与指向的对象类型相关联,例如,一个指向 DWORD 类型的指针可以被定义为 DWORD*。


    在上面的代码中,pCurrentModelDosHeader 是一个指向 IMAGE_DOS_HEADER 结构体的指针。该结构体中包含一个成员 e_lfanew,其数据类型为 LONG,因此在表达式 pCurrentModelDosHeader->e_lfanew 中,e_lfanew 的类型为 LONG。另一方面,DWORD 是一个 32 位的无符号整数类型。在这种情况下,使用显式类型转换将 e_lfanew 转换为 DWORD 类型是合理的。


    对于 shl ecx, 6 这一行代码,它将 ecx 寄存器的值向左移动 6 位,相当于将 ecx 乘以 64。这是因为在 IMAGE_DOS_HEADER 结构体中,e_lfanew 成员表示从结构体开头到 IMAGE_NT_HEADERS32 结构体的偏移量,该结构体的大小为 64 个字节。因此,将 e_lfanew 乘以 64 可以得到 IMAGE_NT_HEADERS32 结构体的地址。


    然而,如果在这里使用指针类型转换,则会发生指针算术。在这种情况下,指针加上一个整数值会导致指针指向另一个内存位置,而不是将该值视为指针的偏移量。因此,应该使用 DWORD 类型进行指针算术,而不是指针类型转换。

    评论

报告相同问题?

悬赏问题

  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开