c++的诡异语法问题

发布于 2021-11-25 11:11:45 字数 1388 浏览 865 评论 9

下面是问题的关键代码
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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

灵芸 2021-11-27 23:00:31

确实好

简单气质女生网名 2021-11-27 22:59:01

应为目标程序是32位

一笔一画续写前缘 2021-11-27 22:58:31

为什么指针本身应该就是dword类型的啊?

风透绣罗衣 2021-11-27 22:53:28

嗯,我试验过了,的确成立,谢谢。

坚持沉默 2021-11-27 21:13:00

引用来自“chrisg”的评论

我瞎猜的啊,不一定对。我觉得你这个问题可能是这样的。

1)64 是IMAGE_DOS_HEADER的大小吧。

2)你正确的那个,是两个纯数字相加。然后把结果强制类型转换成指针。

3)错误的那个,是把pCurrentModelDosHeader当作一个指向数组的指针,并把这个指针的位置后移pCurrentModelDosHeader->e_lfanew个单元。换句话说,错误的那个结果应该是等于

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

爱的那么颓废 2021-11-27 16:38:23

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

眼眸里的那抹悲凉 2021-11-27 15:00:52

谢谢你

瑾兮 2021-11-27 11:02:56

@Lance_Ric 不客气,是我不小心蒙上了。

裸钻 2021-11-27 06:26:36

我瞎猜的啊,不一定对。我觉得你这个问题可能是这样的。

1)64 是IMAGE_DOS_HEADER的大小吧。

2)你正确的那个,是两个纯数字相加。然后把结果强制类型转换成指针。

3)错误的那个,是把pCurrentModelDosHeader当作一个指向数组的指针,并把这个指针的位置后移pCurrentModelDosHeader->e_lfanew个单元。换句话说,错误的那个结果应该是等于

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文