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类型的啊,为什么还要显示的转换下?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
确实好
应为目标程序是32位
为什么指针本身应该就是dword类型的啊?
嗯,我试验过了,的确成立,谢谢。
引用来自“chrisg”的评论
我瞎猜的啊,不一定对。我觉得你这个问题可能是这样的。
1)64 是IMAGE_DOS_HEADER的大小吧。
2)你正确的那个,是两个纯数字相加。然后把结果强制类型转换成指针。
3)错误的那个,是把pCurrentModelDosHeader当作一个指向数组的指针,并把这个指针的位置后移pCurrentModelDosHeader->e_lfanew个单元。换句话说,错误的那个结果应该是等于
对哦,编译器似乎的确是看成指针数组处理了,我一直认为p+XX才是当做数组处理,没想到倒过来也会被这么处理。 就是winnt.h里面定义的DosHeader。
谢谢你
@Lance_Ric 不客气,是我不小心蒙上了。
我瞎猜的啊,不一定对。我觉得你这个问题可能是这样的。
1)64 是IMAGE_DOS_HEADER的大小吧。
2)你正确的那个,是两个纯数字相加。然后把结果强制类型转换成指针。
3)错误的那个,是把pCurrentModelDosHeader当作一个指向数组的指针,并把这个指针的位置后移pCurrentModelDosHeader->e_lfanew个单元。换句话说,错误的那个结果应该是等于