使用程序判断一个文件是否是有效的PE文件
生活随笔
收集整理的這篇文章主要介紹了
使用程序判断一个文件是否是有效的PE文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
判斷一個文件是否為有效的PE文件,判斷2個字段:
??? DOS頭的e_magic字段是否為0x5A4D;
??? NT頭的Signature字段是否為0x00004550;
若都是的話則是一個有效的PE文件;
VC6,單文檔工程;
void CIspeView::OnDraw(CDC* pDC) {CIspeDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//HANDLE hFile = CreateFile(TEXT("test.png"), GENERIC_ALL, NULL, NULL,OPEN_EXISTING,NULL,NULL);HANDLE hFile = CreateFile(TEXT("notepad.exe"), GENERIC_ALL, NULL, NULL,OPEN_EXISTING,NULL,NULL);if (hFile == INVALID_HANDLE_VALUE){//std::cout << "打開文件失敗!" << std::endl;pDC->TextOut(20,20,"打開文件失敗!");CloseHandle(hFile);exit(EXIT_SUCCESS);}// 獲取文件的大小DWORD dwFileSize = GetFileSize(hFile, NULL);// 申請內存空間,用于存放文件數據BYTE * FileBuffer = new BYTE[dwFileSize];// 讀取文件內容DWORD dwReadFile = 0;ReadFile(hFile, FileBuffer, dwFileSize, &dwReadFile, NULL);//檢查DOS頭中的MZ標記,判斷e_magic字段是否為0x5A4D,或者是IMAGE_DOS_SIGNATUREDWORD dwFileAddr = (DWORD)FileBuffer;//auto DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE){// 如果不是則提示用戶,并立即結束::MessageBox(NULL, TEXT("這不是一個有效PE文件"), TEXT("提示"), MB_OK);delete FileBuffer;CloseHandle(hFile);exit(EXIT_SUCCESS);}// 若都通過的話再獲取NT頭所在的位置,并判斷Signature字段是否為0x00004550,或者是IMAGE_NT_SIGNATURE//auto NtHeader = (PIMAGE_NT_HEADERS)(dwFileAddr + DosHeader->e_lfanew);PIMAGE_NT_HEADERS NtHeader = (PIMAGE_NT_HEADERS)(dwFileAddr + DosHeader->e_lfanew);if (NtHeader->Signature != IMAGE_NT_SIGNATURE){// 如果不是則提示用戶,并立即結束::MessageBox(NULL, TEXT("這不是一個有效PE文件"), TEXT("提示"), MB_OK);delete FileBuffer;CloseHandle(hFile);exit(EXIT_SUCCESS);}// 若上述都通過,則為一個有效的PE文件//MessageBox(NULL, TEXT("這是一個有效PE文件"), TEXT("提示"), MB_OK);pDC->TextOut(20,60,"這是一個有效PE文件");delete FileBuffer;CloseHandle(hFile); }拷貝一個test.png,notepad.exe到工程目錄;
當測試test.png時如下,
測試 notepad.exe 如下,
目前程序可用;
這一句如果寫為,
auto DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;
則報錯,
cannot convert from 'struct _IMAGE_DOS_HEADER *' to 'int'
改為,
PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;
如果是控制臺版本則需要包含 #include <windows.h>;
總結
以上是生活随笔為你收集整理的使用程序判断一个文件是否是有效的PE文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PE文件结构 - NT头学习
- 下一篇: PE文件结构 - 数据目录表学习