首页
社区
课程
招聘
[求助]发现一个问题
发表于: 2008-11-19 21:21 4116

[求助]发现一个问题

2008-11-19 21:21
4116
PIMAGE_DOS_HEADER pDosHeader = NULL; //dos头
PIMAGE_NT_HEADERS pNTHeader = NULL; //NT头
.....略
pDosHeader = ( PIMAGE_DOS_HEADER )pImageOfFile;
pNTHeader = ( PIMAGE_NT_HEADERS )( pDosHeader + pDosHeader->e_lfanew );

我随便打开了一个文件通过调试发现pDosHeader = 0x390000;pDosHeader->e_lfanew = 0xc8;
经过 pNTHeader = ( PIMAGE_NT_HEADERS )( pDosHeader + pDosHeader->e_lfanew )这句代码计算按常理来说pNTHeader 应该是0x3900c8;可是发现是0x00393200

随后翻开原来的代码发现是这样写的:
pDosHeader = ( PIMAGE_DOS_HEADER )pImageOfFile;
pNTHeader = ( PIMAGE_NT_HEADERS )( (DWORD)pDosHeader + pDosHeader->e_lfanew );
和上面一样,发现pDosHeader = 0x390000;pDosHeader->e_lfanew = 0xc8;
然后发现计算后pNTHeader变成了 0x3900c8,计算正确了.

DWORD是32位的指针也是32位的为什么上面的那个不行,然后我看了下汇编代码,错误的那个汇编代码是:
0040116D 8B 8D EC FE FF FF mov ecx,dword ptr [ebp-114h]
00401173 8B 51 3C mov edx,dword ptr [ecx+3Ch] //得到e_lfnew
00401176 C1 E2 06 shl edx,6 //为什么要左移6位
00401179 8B 85 EC FE FF FF mov eax,dword ptr [ebp-114h]
0040117F 03 C2 add eax,edx
00401181 89 85 E8 FE FF FF mov dword ptr [ebp-118h],eax
正确的那个的汇编代码是:
0040116D 8B 8D EC FE FF FF mov ecx,dword ptr [ebp-114h]
00401173 8B 95 F0 FE FF FF mov edx,dword ptr [ebp-110h]
00401179 03 51 3C add edx,dword ptr [ecx+3Ch]
0040117C 89 95 E8 FE FF FF mov dword ptr [ebp-118h],edx
,看来上面的代码错就错在左移了6位,但是编译器为什么要左移6位?
我以为是微软编译器的问题,有用BC++的编译器试了下,结果还是一样.
为什么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
指针加一个数和DWORD加一个数的区别,不用多说吧
IMAGE_DOS_HEADER 是64字节,所以左移6位
2008-11-19 23:32
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
指针类型问题啊,我一般在指针相加时强制把基址转换成char*类型,这样加多少是多少,保证不会错
2008-11-20 09:06
0
游客
登录 | 注册 方可回帖
返回
//