PE(Portable Executable,縮寫 PE),全名可移植的可執行文件,舉凡EXE、DLL、SYS等檔案都包含在內,想了解更多有關PE問間隔式的簡介,請參考Wiki介紹,以下筆者盡量以圖簡單介紹,畢竟只是要簡單了解而已,不用深入地去探究它,不然要說完全部內容可能都天黑了。
網路上有一些查看PE文件格式的工具,如 PEview、CFF Exolorer等,各位朋友們可以抓下來使用。
廢話不多說,就拿前面介紹 用Windows API取得系統SMBIOS table的資訊 文章中的EXE來說明。
以下圖片是以PEview 開啟 SMBIOS.exe的圖片。
筆者將圖片中幾個主要的範圍與地方,分別以不同顏色區分開。
藍色的部分為IMAGE_DOS_HEADER
typedef struct _IMAGE_DOS_HEADER
{
WORD e_magic;
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew;
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
用以下的表格,再比對上面的結構與圖來看會比較清楚每個欄位的數值,這樣會比較容易清楚了解。
綠色的部分為MS-DOS Stub Program,一般不適合探討的重點範圍,筆者為了區隔開所以將他以綠色畫起來。
粉紅的部分為IMAGE_NT_HEADERS
typedef struct _IMAGE_NT_HEADERS
{
ULONG Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
ULONG Signature;
IMAGE_FILE_HEADER FileHeader;
typedef struct _IMAGE_FILE_HEADER
{
WORD Machine;
WORD NumberOfSections;
ULONG TimeDateStamp;
ULONG PointerToSymbolTable;
ULONG NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
欄位注意
- Machine = 0x014C,表示該檔案為x86的檔案,可參考微軟官方網頁 IMAGE_FILE_HEADER structure。
- TimeDateStamp = 0x56860660 (單位:秒),換算成10進制為1451624032秒。 換算成人們看得懂的時間
- Characteristics = 0x0102,表示32位元的可執行檔,可參考微軟官方網頁 IMAGE_FILE_HEADER structure 說明。
1451624032/(365*24*60*60) = 46年餘968032秒,從1970年開始計算到現在 1970 + 46 = 2016。
968032/(24*60*60) = 11天於17632秒
17632/(60*60) = 4小時餘3232秒, GMT + 8 + 4 = 12
3232/60 = 53分餘52秒
AGE_OPTIONAL_HEADER OptionalHeader;
typedef struct _IMAGE_OPTIONAL_HEADER
{
WORD Magic;
UCHAR MajorLinkerVersion;
UCHAR MinorLinkerVersion;
ULONG SizeOfCode;
ULONG SizeOfInitializedData;
ULONG SizeOfUninitializedData;
ULONG AddressOfEntryPoint;
ULONG BaseOfCode;
ULONG BaseOfData;
ULONG ImageBase;
ULONG SectionAlignment;
ULONG FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
ULONG Win32VersionValue;
ULONG SizeOfImage;
ULONG SizeOfHeaders;
ULONG CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
ULONG SizeOfStackReserve;
ULONG SizeOfStackCommit;
ULONG SizeOfHeapReserve;
ULONG SizeOfHeapCommit;
ULONG LoaderFlags;
ULONG NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
欄位注意
- MajorLinkerVersion = 0x0A,表示使用VC2010連結器的版本。
- MajorLinkerVersion = 0x06,表示使用VC6連結器的版本。
- MajorOperatingSystemVersion = 0x05,表示作業系統的版本。
- MinorOperatingSystemVersion = 0x01
typedef struct _IMAGE_DATA_DIRECTORY
{
ULONG VirtualAddress;
ULONG Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
這裡就以一張PE文件格的圖做結束,後續會再針對其他未介紹的部分做說明。
圖片來源:典型PE文件格式
參考資料:








