判断是不是PE文件
判斷是不是一個PE文件有很多種方法,我們用的方法是:
先讀取Dos頭,判斷e_magic是否等于"MZ",然后再讀取PE文件頭的頭字節,判斷是不是 "PE00"。這樣就能確定是不是一個有效的PE文件。代碼如下:
?
//選擇文件void CPEDlg::OnButton1()
{
// TODO: Add your control notification handler code here
TCHAR tzFilter[] = _T("可執行文件(*.exe)|*.exe|所有文件(*.*)|*.*||");
CFileDialog dlgFile(TRUE,NULL,NULL, OFN_HIDEREADONLY,tzFilter,this);
if (IDOK == dlgFile.DoModal())
{
? m_strFilePath = dlgFile.GetPathName();
? UpdateData(FALSE);
}
}
//判斷是否是PE文件
void CPEDlg::OnButton2()
{
// TODO: Add your control notification handler code here
HANDLE??? hFile = INVALID_HANDLE_VALUE; //打開的PE文件句柄
IMAGE_DOS_HEADER DosHeader = {0};
DWORD??? dwReadLen = 0;
DWORD??? dwNTSignature = 0;
//創建文件
hFile = CreateFile(m_strFilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
? MessageBox("打開文件失敗");
? return;
}
//讀取文件
if (!ReadFile(hFile,&DosHeader,sizeof(DosHeader),&dwReadLen,NULL))
{
? CloseHandle(hFile);
? MessageBox("讀取文件失敗");
? return;
}
//判斷DOS頭部是否為MZ
if (DosHeader.e_magic != IMAGE_DOS_SIGNATURE)
{
? CloseHandle(hFile);
? MessageBox("不是PE文件");
? return;
}
SetFilePointer(hFile,DosHeader.e_lfanew,NULL,FILE_BEGIN);
//讀取PE的NT頭字節
ReadFile(hFile,&dwNTSignature,sizeof(dwNTSignature),&dwReadLen,NULL);
//判斷PE標志
if (dwNTSignature != IMAGE_NT_SIGNATURE)
{
? MessageBox("不是PE文件");
? CloseHandle(hFile);
? return;
}
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
MessageBox("是PE文件");
}
總結