首页
社区
课程
招聘
[求助]关于验证PE文件有效性的方法
发表于: 2008-3-18 20:32 4858

[求助]关于验证PE文件有效性的方法

2008-3-18 20:32
4858
在Iczelion's的教程中有这样一段话:
    1、首先检验文件头部第一个字的值是否等于 IMAGE_DOS_SIGNATURE,是则 DOS MZ header 有效。
    2、一旦证明文件的 DOS header 有效后,就可用e_lfanew来定位 PE header 了。
    3、比较 PE header 的第一个字的值是否等于 IMAGE_NT_HEADER。

也就是说,只要是以"MZ"开头,IMAGE_DOS_SIGNATURE的e_lfanew指向的位置的是"PE",那这个文件就是有效的PE文件了~!

我写了一个PE文件,内容如下:
Offset          0  1    2   3   4  5   6   7     8  9   A   B   C   D   E   F

00000000   4D 5A 00 00 00 00 00 00  00 00 00 00 00 00 00 00   MZ..............
00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 00 00  00 00 00 00 40 00 00 00   ............@...
00000040   50 45 00 00 00 00 00 00  00 00 00 00 00 00 00 00   PE..............
这样子,按照上面的判断方法应该是有效的PE文件,我用PEid来分析,它就显示是个无效的PE文件,为什么呢?
它是怎么判断一个文件是不是PE文件的呢?
大家有没有什么新的方法判断呢?高手给提示下!

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
peid会获取pe文件里面的一堆数据,没找到就是无效的了
2008-3-18 20:35
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
3
//判断文件是否为合法PE文件
BOOL CheckPe(FILE* pFile)
{   
  fseek(pFile,0,SEEK_SET);
  BOOL  bFlags=FALSE;
  WORD  IsMZ;
  DWORD  IsPE,pNT;
  fread(&IsMZ,sizeof(WORD),1,pFile);
  if(IsMZ==0x5A4D)
  {
    fseek(pFile,0x3c,SEEK_SET);
    fread(&pNT,sizeof(DWORD),1,pFile);
    fseek(pFile,pNT,SEEK_SET);
    fread(&IsPE,sizeof(DWORD),1,pFile);
    if(IsPE==0X00004550)
      bFlags=TRUE;
    else
      bFlags=FALSE;
  }
  else
    bFlags=FALSE;
  fseek(pFile,0,SEEK_SET);
  return bFlags;
}

//试下这个函数
2008-3-18 20:39
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
void CPEFrm::CheckPE(CString _PathName)
{
/*
        在Iczelion's的教程中有这样一段话:

                1、首先检验文件头部第一个字的值是否等于 IMAGE_DOS_SIGNATURE,是则 DOS MZ header 有效。
                2、一旦证明文件的 DOS header 有效后,就可用e_lfanew来定位 PE header 了。
                3、比较 PE header 的第一个字的值是否等于 IMAGE_NT_HEADER。
        如果前后两个值都匹配,那我们就认为该文件是一个有效的PE文件。
        也就是说,以“MZ”开头,有“PE”就是一个有效的PE文件了~
*/
        CFile PEfile;

        long lfanew;

        _IMAGE_DOS_HEADER PEDosHeader;
        _IMAGE_NT_HEADERS PENTHeader;

        if(FALSE==PEfile.Open(_PathName,CFile::typeBinary|CFile::shareDenyNone))
        {
                ::MessageBox(NULL,"文件打开失败!","错误",MB_OK);
                return ;
        }
        PEfile.Read(&PEDosHeader,sizeof(_IMAGE_DOS_HEADER));
        if(PEDosHeader.e_magic!=IMAGE_DOS_SIGNATURE)//"MZ"
        {
                PEfile.Close();
                ::MessageBox(NULL,"无效的PE文件!","错误",MB_OK);
                return;
        }
        else
        {
                SetPEDOSHeader(PEDosHeader);
        }

        lfanew=PEDosHeader.e_lfanew;  //获取e_lfanew的值

        try{
                PEfile.Seek(lfanew,CFile::begin);
        }catch(...)
        {
                PEfile.Close();
                ::MessageBox(NULL,"无效的PE文件!","错误",MB_OK);
                return;
        }

        PEfile.Read(&PENTHeader,sizeof(_IMAGE_NT_HEADERS));//----------NT头
        if(PENTHeader.Signature!=IMAGE_NT_SIGNATURE)//"PE\0\0"
        {
                PEfile.Close();
                ::MessageBox(NULL,"无效的PE文件!","错误",MB_OK);
                return;
        }
        else
        {
                SetPENTHeader(PENTHeader);
        }

        isPEHeader = TRUE;
}
这个是我的代码,好像都一样哈~~
2008-3-18 21:18
0
游客
登录 | 注册 方可回帖
返回
//