PE檔案檢測DOS頭\NT頭
以下都是我個人的淺見,如有不對,多謝指出。
1、Windows的2種檔案
01、可執行檔案 EXE DLL
可執行檔案 都有一個 PE 結構
PE結構:
DOS頭
NT頭
一個程式EXE= PE結構+資料
- IMAGE_DOS_HEADER STRUCT (轉載)
- {
- +0h WORDe_magic //Magic DOS signature MZ(4Dh 5Ah) DOS可執行檔案標記
- +2h WORDe_cblp//Bytes on last page of file
- +4h WORDe_cp//Pages in file
- +6h WORD e_crlc//Relocations
- +8h WORDe_cparhdr //Size of header in paragraphs
- +0ah WORD e_minalloc //Minimun extra paragraphs needs
- +0ch WORDe_maxalloc //Maximun extra paragraphs needs
- +0eh WORDe_ss //intial(relative)SS value DOS程式碼的初始化堆疊SS
- +10h WORDe_sp //intial SP value DOS程式碼的初始化堆疊指標SP
- +12h WORDe_csum //Checksum
- +14h WORDe_ip // intial IP value DOS程式碼的初始化指令入口[指標IP]
- +16h WORDe_cs //intial(relative)CS value DOS程式碼的初始堆疊入口
- +18h WORDe_lfarlc //File Address of relocation table
- +1ah WORDe_ovno // Overlay number
- +1ch WORDe_res[4] //Reserved words
- +24h WORDe_oemid // OEM identifier(for e_oeminfo)
- +26h WORD e_oeminfo // OEM information;e_oemid specific
- +29h WORDe_res2[10] // Reserved words
- +3ch DWORD e_lfanew //Offset to start of PE header 指向PE檔案頭
- } IMAGE_DOS_HEADER ENDS
02、不可執行檔案 資料檔案
2、每一個檔案都是以二進位制的方式儲存在磁碟中的;
那麼該如何區分一個檔案是不是 可執行檔案呢?
00、開啟一個檔案
CFile cFile(m_strFilePath, CFile::modeReadWrite);
01、先獲取該檔案的DOS頭 IMAG_DOS_HEADER, 這是用來相容DOS程式的;DOS頭中包含了NT頭的偏移位置。
IMAGE_DOS_HEADER dosHeader = { 0 };
DWORD dosSize = 0;
dosSize = cFile.Read(&dosHeader, sizeof(dosHeader));
if (dosSize != sizeof(dosHeader))
{
break;
}
02、通過DOS頭中偏移位獲取NT頭的位置;
IMAGE_NT_HEADERS32 ntHeader = { 0 };
DWORD dntSize = 0;
cFile.Seek(dosHeader.e_lfanew, CFile::begin);
dntSize=cFile.Read(&ntHeader, sizeof(IMAGE_NT_HEADERS32));
if (dntSize != sizeof(IMAGE_NT_HEADERS32))
{
break;
}
03、判斷ntHeader.Signature == IMAGE_NT_SIGNATURE
以下是我的程式碼:
CString strCheckPE = L"Not PE!!";
if (m_strFilePath.IsEmpty())
{
OnClickedButton1();
}
do
{
CFile cFile(m_strFilePath, CFile::modeReadWrite);
if (cFile.m_hFile != CFile::hFileNull)
{
IMAGE_DOS_HEADER dosHeader = { 0 };
DWORD dosSize = 0;
dosSize = cFile.Read(&dosHeader, sizeof(dosHeader));
if (dosSize != sizeof(dosHeader))
{
break;
}
if (dosHeader.e_magic != IMAGE_DOS_SIGNATURE)
{
break;
}
IMAGE_NT_HEADERS32 ntHeader = { 0 };
DWORD dntSize = 0;
cFile.Seek(dosHeader.e_lfanew, CFile::begin);
dntSize=cFile.Read(&ntHeader, sizeof(IMAGE_NT_HEADERS32));
if (dntSize != sizeof(IMAGE_NT_HEADERS32))
{
break;
}
if (ntHeader.Signature == IMAGE_NT_SIGNATURE)
{
strCheckPE = L"Is PE!!";
}
}
} while (FALSE);
MessageBox(strCheckPE);
相關文章
- C語言程式設計獲取PE檔案DOS頭C語言程式設計
- Nt函式原型標頭檔案函式原型
- PE教程3: File Header (檔案頭)Header
- 檢測根目錄帶bom頭資訊的檔案
- Billy Belceb 病毒編寫教程for Win32 ----PE檔案頭Win32
- 檢視BAM檔案頭部資訊
- PE頭詳細分析
- PHP檔案頭BOM頭問題PHP
- 8.13 標頭檔案剖析:標頭檔案路徑(下)
- wav檔案的檔案頭
- PE教程2: 檢驗PE檔案的有效性
- C 標頭檔案
- 關於資料檔案頭的檢查點SCN
- #include sys/xxx.h標頭檔案 UNIX標頭檔案
- Java解析ELF檔案:使用Java讀取檔案頭部、節區頭部表、程式頭部表Java
- locate標頭檔案和庫檔案
- C 標頭檔案 作用
- Oracle檔案頭資訊(zt)Oracle
- 祖傳標頭檔案
- PE巨頭凱雷路演PPT 全程解析私募巨頭DNA
- 使用BBED檢視SYSTEM檔案頭的root dba及bootstrap$boot
- 透過hexdump檢視硬碟標頭檔案的區別硬碟
- PE檔案格式
- 安全帽佩戴檢測攝像頭
- 標頭檔案的作用分析
- fcntl.h標頭檔案
- 各種型別檔案頭型別
- linux 標頭檔案 作用Linux
- 轉儲日誌檔案頭
- bbed 與檔案頭恢復
- 什麼是 標頭檔案
- 關於資料檔案頭的檢查點SCN知識
- 02@在類的標頭檔案中儘量少引入其他標頭檔案
- C/C++標頭檔案太難記?一個萬能標頭檔案全搞定!C++
- 使用 header 頭下載檔案Header
- c++筆記_標頭檔案C++筆記
- idea檔案頭資訊設定Idea
- JS檔案放在頭還是尾JS