NT Header
NT Header是緊挨DOS MZ Header 與 DOS sub部分 ,主要包含三大部分內(nèi)容PE標(biāo)志,PE文件頭矛纹,PE可選頭
圖片轉(zhuǎn)自:https://blog.csdn.net/evileagle/article/details/11693499
PE 標(biāo)志
PE標(biāo)志又稱PE簽名话原,即是PE入口標(biāo)志,共占4Byte螃诅。此部分可以通過(guò)該標(biāo)志來(lái)確定PE文件入口,此部分為固定內(nèi)容[50 45 00 00]小端存儲(chǔ)方式,同時(shí)也是NT頭的第一大部分
PE 標(biāo)準(zhǔn)文件頭
typedef struct _IMAGE_FILE_HEADER {
+0x00 WORD Machine;
+0x02 WORD NumberOfSections;
+0x04 DWORD TimeDateStamp;
+0x08 DWORD PointerToSymbolTable;
+0x0c DWORD NumberOfSymbols;
+0x10 WORD SizeOfOptionalHeader;
+0x12 WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
代碼部分中+代表相對(duì)偏移量(offset)
PE-Header定義重要關(guān)鍵字段詳解(共計(jì)20Byte)
字段 | 含義 | 大小 | 成員位置 |
---|---|---|---|
Machine | 可以運(yùn)行在什么樣CPU上 | 2Byte | 1 |
NumberOfSections | 表示段的數(shù)量 | 2Byte | 2 |
TimeDateStamp | 編譯器寫入的時(shí)間戳术裸,與文件的創(chuàng)建時(shí)間倘是,修改時(shí)間這些無(wú)關(guān) | 4Byte | 3 |
SizeOfOptionalHeader | 指定PE擴(kuò)展頭大小 | 2Byte | 6 |
Characteristics | 文件屬性,信息標(biāo)記等 | 2Byte | 7 |
Machine字段補(bǔ)充說(shuō)明
常見(jiàn)的一些Machine字段取值說(shuō)明,均為小端存儲(chǔ)
- [4C 01]<14C:Intel 386以及后續(xù)>
- [64 86]<8664 x64框架>
- [00 00]<任意>
NumberOfSections字段補(bǔ)充說(shuō)明
指明PE文件包含段的個(gè)數(shù)袭艺,例如 .text(代碼段)搀崭、.rdata(只讀數(shù)據(jù)段)、 .data(全局變量數(shù)據(jù)段)等
TimeDateStamp字段補(bǔ)充說(shuō)明
從1970.1.1 00:00:00以來(lái)的秒數(shù)猾编,他與文件的創(chuàng)建時(shí)間瘤睹,修改時(shí)間這些無(wú)關(guān)
SizeOfOptionalHeader字段補(bǔ)充說(shuō)明
默認(rèn)32位PE文件則是224Byte [E0 00], 64位PE文件位240Byte [F0 00]
Characteristics字段補(bǔ)充說(shuō)明
轉(zhuǎn)為二進(jìn)制,通過(guò)每一位組合后來(lái)查看含義,比如可以區(qū)分文件是exe還是dll等
綜上所述PE標(biāo)準(zhǔn)文件頭大小固定答倡,且為20Byte轰传,共7大成員字段。其中關(guān)鍵字段成員為以上5大字段成員內(nèi)容瘪撇。
繼續(xù)以Kernel32.dll進(jìn)行分析
根據(jù)圖中數(shù)據(jù)可以進(jìn)行分析
字段 | 含義 | 數(shù)值(小端存儲(chǔ)) |
---|---|---|
Machine | Intel 386以及后續(xù)CPU運(yùn)行 | 4C01 |
NumberOfSections | 表示段的數(shù)量為5 | 0500 |
TimeDateStamp | 編譯器寫入的時(shí)間戳 | 871FB759 |
SizeOfOptionalHeader | 指定PE擴(kuò)展頭大小為224Byte | E000 |
Characteristics | 文件屬性信息標(biāo)記二進(jìn)制位為 | 0221 |
從分析中可以得出關(guān)鍵信息:此Kernel32.dll運(yùn)行在的CPU環(huán)境以及使用是屬于的32位PE文件
關(guān)于Characteristics的分析 由于小端存儲(chǔ)位0221實(shí)際存儲(chǔ)位2102即二進(jìn)制位0010 0001 0000 0010 拼接的數(shù)據(jù)获茬,可根據(jù)查詢各個(gè)位代表含義為:
第1位:文件是可執(zhí)行的
第8位:只在32位平臺(tái)上運(yùn)行
第13位:這是一個(gè)DLL文件
通過(guò)分析3個(gè)1的位置得出文件屬性結(jié)論:分析的kernel32.dll是一個(gè)可以在32位平臺(tái)執(zhí)行的dll文件
補(bǔ)充 關(guān)于Characteristics字段詳解
位置 | 符號(hào) | 含義 |
---|---|---|
0 | IMAGE_ FILE_ RELOCS STRIPPED | 文件中不存在重定位信息 |
1 | IMAGE_ FILE_ EXECUTABLE_ IMAGE | 文件是可執(zhí)行的 |
2 | IMAGE_ FILE_ LINE NUMS_STRIPPED | 不存在行信息 |
3 | IMAGE_ FILE_ LOCAL. SYMS_ STRIPPED | 不存在符號(hào)信息 |
4 | IMAGE_ FILE_ AGGRESSIVE_ Ws_ TRIM | 調(diào)整工作集 |
5 | IMAGE_ FILE_ LARGE_ ADDRESS _AWARE | 應(yīng)用程序可處理大于2GB的地址 |
6 | 此標(biāo)志保留 | |
7 | IMAGE_ FILE_ BYTES_REVERSED_LO | 小尾方式 |
8 | IMAGE_ FILE_ 32BIT _MACHINE | 只在32位平臺(tái)上運(yùn)行 |
9 | IMAGE_ FILE_ DEBUG STRIPPED | 不包含調(diào)試信息 |
10 | IMAGE_ FILE_ REMOVABLE RUN_ FROM_ SWAP | 不能從可移動(dòng)盤運(yùn)行 |
11 | IMAGE_ FILE NET_ RUN_ FROM_SWAP | 不能從網(wǎng)絡(luò)運(yùn)行 |
12 | IMAGE_ FILE_ SYSTEM | 系統(tǒng)文件(如驅(qū)動(dòng)程序),不能直接運(yùn)行 |
13 | IMAGE_ FILE_ DLL | 這是一個(gè)DLL文件 |
14 | IMAGE_ FILE_ UP_ SYSTEM_ONLY | 文件不能在多處理器計(jì)算機(jī)上運(yùn)行 |
15 | IMAGE_ FILE_BYTES_ REVERSED_ HI | 大尾方式 |