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++的编译器试了下,结果还是一样.
为什么?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)