PE檔案結構(0x02)
阿新 • • 發佈:2019-01-05
最
最近包括暑假一直在學習PE檔案的格式結構,對一些病毒感染檔案的方式想要做一些瞭解,學的東西可能很淺顯,在這裡記錄一下想。
PE檔案的第一個位元組起始於 MS-DOS 頭部,被稱作 IMAGE_DOS_HEADER,定義在WINNT.H,其結構如下:
typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE頭部 WORD e_magic; // 魔術數字 WORD e_cblp; // 檔案最後頁的位元組數 WORD e_cp; // 檔案頁數 WORD e_crlc; // 重定義元素個數 WORD e_cparhdr; // 頭部尺寸,以段落為單位 WORD e_minalloc; // 所需的最小附加段 WORD e_maxalloc; // 所需的最大附加段 WORD e_ss; // 初始的SS值(相對偏移量) WORD e_sp; // 初始的SP值 WORD e_csum; // 校驗和 WORD e_ip; // 初始的IP值 WORD e_cs; // 初始的CS值(相對偏移量) WORD e_lfarlc; // 重分配表文件地址 WORD e_ovno; // 覆蓋號 WORD e_res[4]; // 保留字 WORD e_oemid; // OEM識別符號(相對e_oeminfo) WROD e_oeminfo; // OEM資訊 WORD e_res2[10]; // 保留字 DWORD e_lfanew; // 新exe頭部的檔案地址 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
大小為64位。
第一個域e_magic,被稱為魔術數字,它被用於表示一個MS-DOS相容的檔案型別。所有MS-DOS相容的可執行檔案都將這個值設為0x5A4D,表示ASCII字元MZ。在這裡其他的域我們不做深入。重點我們需要關注的是最後一個大小為雙字,位於60位,也就是0x3C處也就是4個位元組的域 e_lfanew. 通過它我們才能找到PE檔案相關的NT映像頭。
PE_HEADER
PE_HEADER是PE相關的NT映像頭(IMAGE_NT_HEADER)的簡稱,裡面包含PE裝載器的重要欄位。執行體在執行PE檔案操作時,PE裝載器將從IMAGE_DOS_HEADER中的 e_lfanew
也就是說 PNTHeader = IMAGERBase + DOSHeader --->e_lfanew
隨便拉一個EXE一下:
拉微信開刀,這裡就是他的e_lfanew的地址值,由於是小端位元組序,我們應該從右往左讀,就是00 00 01 08處,EXE並沒有載入到記憶體中,在這裡基址是0,所以PE開始應該在0x0108 h處。
可以看到PE標誌出現。