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文件格式
參考資料: