看了个识别PE文件结构的小程序。有写不明白 的地方。
#include <windos.h>
int main(int argc ,char* argv[])
{
if (argc<2)return 1;
char* pFileName=argv[1];
if(pFileName)
{ FILE * filept=fopen(pFileName,"r");
IMAGE_DOS_HEADER dosHdr;
IMAGE_NT_HEADER ntHdr;
if(filept)
{ fread(&dosHdr,sizeof(IMAGE_DOS_HEADER,1,filept);
fseek(fliept,dosHdr.e_lfanew,SEEK_SET);
fread(&ntHdr,sizeof(IMAGE_NT_HEADER,1,filept);
if ((dosHdr.e_magic==IMAGE_DOS_SIGNATURE)&&(ntHdr.sinature==IMAGE_NT_SIGNATURE ))
printf("%s is PE \n",pFileName);
else
printf("%s is not PE \n",pFileName);
}
else
printf("open %s error .\n",pFileName);
}
return 0;
}
程序我到是能看明白。也知道IMAGE_DOS_HEADER 等是在winnt.h里面定义的一些常量。
但是我想不明白PE文件是以二进制形式存放在硬盘的。当要识别PE文件的时候是先把它先读入内存,然后检查吗?
但是他怎么定位偏移的呢,为什么直接用 dosHdr.e_magic==IMAGE_DOS_SIGNATURE 比较呢?dosHdr.e_magic的值从何而来,怎么来的??
今天有看了论坛出的《软件加密技术内幕》中第2章 PE分析工具
比如这个函数:
BOOL IsPEFile(LPVOID ImageBase)
{
PIMAGE_DOS_HEADER pDH=NULL;
PIMAGE_NT_HEADERS pNtH=NULL;
if(!ImageBase)
return FALSE;
pDH=(PIMAGE_DOS_HEADER)ImageBase;
if(pDH->e_magic!=IMAGE_DOS_SIGNATURE)
return FALSE;
pNtH=(PIMAGE_NT_HEADERS32)((DWORD)pDH+pDH->e_lfanew);
if (pNtH->Signature != IMAGE_NT_SIGNATURE )
return FALSE;
return TRUE;
}
ImageBase是在_IMAGE_OPTIONAL_HEADER 结构中定义的,为何可以作为IF的判断条件呢?比如: if(!ImageBase) ImageBase的值怎么确定?怎么从PE文件中获得?难道PE识别工具打开文件的时候,就可以把这些都翻译为确定的值了??
这写问题困扰我几天了,希望各位大侠可以解惑,不吝赐教 !
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课