下面是问题的关键代码 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;
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)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。######
((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位######确实好
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。