开发者社区> 问答> 正文

c++的诡异语法问题 ///////// 400 请求报错 

下面是问题的关键代码 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类型的啊,为什么还要显示的转换下?

展开
收起
kun坤 2020-05-29 10:59:15 635 0
1 条回答
写回答
取消 提交回答
  • 我瞎猜的啊,不一定对。我觉得你这个问题可能是这样的。
    1)64 是IMAGE_DOS_HEADER的大小吧。
    2)你正确的那个,是两个纯数字相加。然后把结果强制类型转换成指针。
    3)错误的那个,是把pCurrentModelDosHeader当作一个指向数组的指针,并把这个指针的位置后移pCurrentModelDosHeader->e_lfanew个单元。换句话说,错误的那个结果应该是等于

    ((DWORD)pCurrentModelDosHeader + pCurrentModelDosHeader->e_lfanew * sizeof(IMAGE_DOS_HEADER))

    ######@Lance_Ric 不客气,是我不小心蒙上了。######谢谢你######对哦,编译器似乎的确是看成指针数组处理了,我一直认为p+XX才是当做数组处理,没想到倒过来也会被这么处理。 就是winnt.h里面定义的DosHeader。######

    引用来自“chrisg”的评论

    我瞎猜的啊,不一定对。我觉得你这个问题可能是这样的。 1)64 是IMAGE_DOS_HEADER的大小吧。 2)你正确的那个,是两个纯数字相加。然后把结果强制类型转换成指针。 3)错误的那个,是把 pCurrentModelDosHeader当作一个指向数组的指针,并把这个指针的位置后移pCurrentModelDosHeader->e_lfanew个单元。换句话说,错误的那个结果应该是等于
    ((DWORD)pCurrentModelDosHeader + pCurrentModelDosHeader->e_lfanew * sizeof(IMAGE_DOS_HEADER))
    chrisg解释地应该很清楚了。 对于一个指针变量p,和一个unsigned int的变量n相加,p+n相当于p[n]。 你需要的是
    (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + (unsigned char *)pCurrentModelDosHeader)
    (我看到过n[p]相当于n+p的说法,不过没试过。。。) ######嗯,我试验过了,的确成立,谢谢。######为什么指针本身应该就是dword类型的啊?######应为目标程序是32位######确实好
    2020-05-29 14:51:02
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载