能力值:
(RANK:210 )
2 楼
peid会获取pe文件里面的一堆数据,没找到就是无效的了
能力值:
( 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;
}
//试下这个函数
能力值:
( 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;
}
这个是我的代码,好像都一样哈~~