❶ 請問cfa和pek是什麼格式的文件如何打開
PE是目前Windows平台上主流的可執行文件格式,包括常見的可執行程序EXE文件、動態鏈接庫DLL文件等。
學習PE文件格式對於了解windows操作系統是必不可少的。
與PE有關的基本概念
地址
虛擬內存地址(Virtual Address, VA)PE文件中的指令被裝入內存後的地址。
相對虛擬內存地址(Reverse Virtual Address, RVA相對虛擬地址是內存地址相對於映射基址的偏移量。
文件偏移地址(File Offset Address, FOA)數據在PE文件中的地址叫文件偏移地址,這是文件在磁碟上存放時相對於文件開頭的偏移。
裝在基址(Image base)PE裝入內存時的基地址。默認情況下,EXE文件在內存中的基地址時0x00400000, DLL文件是0x10000000。這些位置可以通過修改編譯選項更改。
虛擬內存地址、映射基址、相對虛擬內存地址的關系:
VA = Image Base + RVA
文件偏移是相對於文件開始處0位元組的偏移,相對虛擬地址則是相對於裝載基址0x00400000處的偏移。(1)PE文件中的數據按照磁碟數據標准存放,以0x200位元組為基本單位進行組織,PE數據節的大小永遠是0x200的整數倍。(2)當代碼裝入內存後,將按照內存數據標准存放,並以0x1000位元組為基本單位進行組織,內存中的節總是0x1000的整數倍。
內存中數據節相對於裝載基址的偏移量和文件中數據節的偏移量的差異稱為節偏移。
文件偏移地址 = 虛擬內存地址(VA) - 裝載基址(Image Base) - 節偏移
= RVA - 節偏移
DOS頭的下面是DOS Stub。整個DOS Stub是一個位元組塊,其內容隨著鏈接時使用的鏈接器不同而不同,PE中並沒有與之對應的相關結構。
PE頭部解析
緊跟在DOS stub後面的是PE頭標識Signature。與大部分文件格式的頭部結構一樣,PE頭部信息中有一個四位元組的標識,其內容固定,對應的ASCII碼的字元串是「PE00」。
PE頭IMAGE_NT_HEADERS
IMAGE_NT_HEADERS是廣義上的PE頭,在標準的PE文件中其大小為456個位元組,由4個位元組的PE標識符 + IMAGE_FILE_HEADER + IMAGE_OPTIONAL_HEADER32組成。
IMAGE_NT_HEADERS {
Dword Signature; // +0000h - PE文件標識,「PE00」
IMAGE_FILE_HEADER FileHeader; // +0004h - PE標准頭
IMAGE_OPTIONAL_HEADER32 OptionalHeader; // +0018h - PE擴展頭
}
標准PE頭IMAGE_FILE_HEADER
標准PE頭IMAGE_FILE_HEADER緊跟在PE頭標識後,即位於IMAGE_DOS_HEADER的e_lfanew + 4的位置。由此位置開始的20個位元組為數據結構標准PE頭IMAGE_FILE_HEADER的內容。它記錄了PE文件的全局屬性,如該PE文件運行的平台、PE文件類型、文件中存在的節的總數等
❷ pe文件結構剖析,什麼是pe文件
PE文件被抄稱為可移植的執行體是Portable Execute的全稱,常見的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微軟Windows操作系統上的程序文件(可能是間接被執行,如DLL)
詳細的信息到http://ke..com/view/1087038.htm 查看
❸ pe文件的文件格式
A.DOS STUB和DOS頭
DOS插樁程序在大多數情況下由匯編器/編譯器自動產生.通常它調用INT 21H服務9來顯示上述字元串.可以通過IMAGE_DOS_HEADER結構來識別一個合法的DOS頭.這個結構的頭兩個位元組肯定是MZ.可通過該結構的e_lfanew成員來找到PE文件的開始標志.MS-DOS頭部占據了PE文件的頭64個位元組.在微軟的WINNT.H中可以找到其內容結構的描述. 在DOS STUB後是PE文件頭(PE header).PE文件頭是PE相關結構IMGAE_NT_HEADERS的簡稱,即NT映像頭,存放PE整個文件信息發布的重要欄位,包含了PE裝載器用到的重要域.執行體在操作系統中執行時,PE裝載器將從DOS MZ頭中找到PE頭文件的起始偏移量e_lfanew,從而跳過DOS STUB直接定位真正的PE文件.它由3部分組成:
(1)PE文件標志(4H位元組)
PE文件標志0x50450000即PE00,標志著NT映像頭的開始,也是PE文件中與windows有關內容的開始.
(2)映像文件(14H位元組)
是NT映像文件的主要部分,包含PE文件的基本信息
(3)可選映像頭
包含PE文件的邏輯分布信息.
C.節表
節表其實是緊跟NT映像文件的一個結構數組.其成員數目由映像文件頭結構NumberOFSectios域的值來決定.
D.節
PE文件的真正內容劃分為塊,稱之為節.節的劃分基於各組數據的共同屬性.惟有節的屬性設置決定了節的特性和功能.典型的windows NT應用程序可以具有9個節:.texr,.bss.rdata,.data,.rsrc,edata,idata,pdata,.debug
判斷一個文件是否為PE文件
var //檢測指定文件是否有效PE文件
PEDosHead: TImageDosHeader;
PENTHead: TImageNtHeaders;
m_file: integer;
begin
Result := False;
m_file := FileOpen(filename, fmOpenRead or fmShareDenyNone); //只讀和其它任意
if m_File > 0 then
try
FileSeek(m_file, 0, soFromBeginning); //將指針挪至文件頭
FileRead(m_file, PEDosHead, SizeOf(PEDosHead)); //讀PEDosHead結構
FileSeek(m_file, PEDosHead._lfanew, soFromBeginning); //將指針挪至_lfanew
FileRead(m_file, PENTHead, SizeOf(PENTHead)); //讀PENTHead結構
finally
FileClose(m_file);
end;
if (PENTHead.Signature = IMAGE_NT_SIGNATURE) then //檢驗文件頭部第一個字的值是否等於 IMAGE_DOS_SIGNATURE
Result := True;
end;
pe文件結構圖
❹ U盤PE中的PE是什麼意思
相當於一個精簡的系統,Microsoft Windows 預安裝環境(Windows PE)。
1、全稱 Windows Preinstallation Environment,DOS下工作的圖形界面,相當於啟動盤,但比啟動盤功能強,是一個基於WindowsXP核心的迷你操作系統,也可以講是XP的精簡版。
2、Windows PE是Windows系統下的可執行文件的一種(還有NE、LE),是裂攔微軟設計、TIS(Tool Interface Standard,工具介面標准)委員會批準的一種可執行文件格式。
3、PE的意思是Portable Executable(可移植可執行)。所有Windows下的32位或64位可執行文件都是PE文件格敗姿式,其中包括DLL、EXE、FON、OCX、LIB和部分SYS文件。
4、Windows PE以ISO光碟或其他可攜設備作媒介,下載後直接刻盤在BIOS里設置光碟啟動,然後Windows PE會自動引導進入一個命令行界面,可以讀寫FAT32、NTFS等格式的分區,可以對硬碟分區、格式化(可以格成NTFS的)。
5、Windows PE啟動後支持IPv4和IPv6,還可以使用網路環境。使用net命令,就可以簡單地訪問伺服器。
(4)pe文件格式示意圖擴展閱讀:
Windows PE主要的使用環境是虛擬機,虛擬機環境與實際PC環境幾乎沒有區別,如果用戶不清楚虛擬機也沒關系,就當是在真實PC上直接運行。
將BIOS中設置成光碟機引導,並開始啟動系統,當屏幕畫察源絕面上出現「Press any key boot from cd」時,按任意鍵從光碟機上的Windows PE引導啟動。
如果用戶的存儲設備驅動不被支持,在啟動時按下F6鍵可載入特殊設備的驅動。當啟動到桌面時系統會做一些如調整解析度的工作,最後打開默認的CMD命令行解釋工具。
Windows PE啟動相當快捷,而且對啟動環境要求不高,其功能幾乎相當於安裝了一個 Windows 的命令行版本。因此,對於個人計算機用戶,只要將其寫入U盤(或刻錄在一張光碟上),便可放心地去解決初始化系統之類的問題。
網路—Windows PE
網路—PE
❺ PE是什麼文件呀
PE教程1: PE文件格式一覽
考慮到早期寫的PE教程1是自己所有教程中最糟糕的一篇,此番決心徹底重寫一篇以饗讀者。
PE 的意思就是 Portable Executable(可移植的執行體)。它是 Win32環境自身所帶的執行體文件格式。它的一些特性繼承自 Unix的 Coff (common object file format)文件格式。"portable executable"(可移植的執行體)意味著此文件格式是跨win32平台的 : 即使Windows運行在非Intel的CPU上,任何win32平台的PE裝載器都能識別和使用該文件格式。當然,移植到不同的CPU上PE執行體必然得有一些改變。所有 win32執行體 (除了VxD和16位的Dll)都使用PE文件格式,包括NT的內核模式驅動程序(kernel mode drivers)。因而研究PE文件格式給了我們洞悉Windows結構的良機。
本教程就讓我們瀏覽一下 PE文件格式的概要。
DOS MZ header
DOS stub
PE header
Section table
Section 1
Section 2
Section ...
Section n
上圖是 PE文件結構的總體層次分布。所有 PE文件(甚至32位的 DLLs) 必須以一個簡單的 DOS MZ header 開始。我們通常對此結構沒有太大興趣。有了它,一旦程序在DOS下執行,DOS就能識別出這是有效的執行體,然後運行緊隨 MZ header 之後的 DOS stub。DOS stub實際上是個有效的 EXE,在不支持 PE文件格式的操作系統中,它將簡單顯示一個錯誤提示,類似於字元串 "This program requires Windows" 或者程序員可根據自己的意圖實現完整的 DOS代碼。通常我們也不對 DOS stub 太感興趣: 因為大多數情況下它是由匯編器/編譯器自動生成。通常,它簡單調用中斷21h服務9來顯示字元串"This program cannot run in DOS mode"。
緊接著 DOS stub 的是 PE header。 PE header 是PE相關結構 IMAGE_NT_HEADERS 的簡稱,其中包含了許多PE裝載器用到的重要域。當我們更加深入研究PE文件格式後,將對這些重要域耳目能詳。執行體在支持PE文件結構的操作系統中執行時,PE裝載器將從 DOS MZ header 中找到 PE header 的起始偏移量。因而跳過了 DOS stub 直接定位到真正的文件頭 PE header。
PE文件的真正內容劃分成塊,稱之為sections(節)。每節是一塊擁有共同屬性的數據,比如代碼/數據、讀/寫等。我們可以把PE文件想像成一邏輯磁碟,PE header 是磁碟的boot扇區,而sections就是各種文件,每種文件自然就有不同屬性如只讀、系統、隱藏、文檔等等。 值得我們注意的是 ---- 節的劃分是基於各組數據的共同屬性: 而不是邏輯概念。重要的不是數據/代碼是如何使用的,如果PE文件中的數據/代碼擁有相同屬性,它們就能被歸入同一節中。不必關心節中類似於"data", "code"或其他的邏輯概念: 如果數據和代碼擁有相同屬性,它們就可以被歸入同一個節中。(譯者註:節名稱僅僅是個區別不同節的符號而已,類似"data", "code"的命名只為了便於識別,惟有節的屬性設置決定了節的特性和功能)如果某塊數據想付為只讀屬性,就可以將該塊數據放入置為只讀的節中,當PE裝載器映射節內容時,它會檢查相關節屬性並置對應內存塊為指定屬性。
如果我們將PE文件格式視為一邏輯磁碟,PE header是boot扇區而sections是各種文件,但我們仍缺乏足夠信息來定位磁碟上的不同文件,譬如,什麼是PE文件格式中等價於目錄的東東?別急,那就是 PE header 接下來的數組結構 section table(節表)。 每個結構包含對應節的屬性、文件偏移量、虛擬偏移量等。如果PE文件里有5個節,那麼此結構數組內就有5個成員。因此,我們便可以把節表視為邏輯磁碟中的根目錄,每個數組成員等價於根目錄中目錄項。
以上就是PE文件格式的物理分布,下面將總結一下裝載一PE文件的主要步驟:
當PE文件被執行,PE裝載器檢查 DOS MZ header 里的 PE header 偏移量。如果找到,則跳轉到 PE header。
PE裝載器檢查 PE header 的有效性。如果有效,就跳轉到PE header的尾部。
緊跟 PE header 的是節表。PE裝載器讀取其中的節信息,並採用文件映射方法將這些節映射到內存,同時付上節表裡指定的節屬性。
PE文件映射入內存後,PE裝載器將處理PE文件中類似 import table(引入表)邏輯部分。
上述步驟是基於本人觀察後的簡述,顯然還有一些不夠精確的地方,但基本明晰了執行體被處理的過程。
其它看這里~
http://www.pediy.com/tutorial/chap8/Chap8-1-1.htm
❻ 什麼是PE文件分析呀
即對PE文件的分析。
PE 文件格式
對 PE 的一些說明: PE 是 Portable Excutable 的縮寫,是指「可移植可執行」文件,是 32 位 Windows (包括 OS/2 )可執行文件的標准格式。以前的 16 位 Windows 可執行文件的格式稱為 NE ,即 New Excutable 「新可執行」文件。參考: NE 文件格式
一、簡介
PE文件最前面是一個DOS可執行文件(STUB),這使PE文件成為一個合法的MS-DOS可執行
文件。
DOS文件頭後面是一個32位的PE文件標志0X00004550(IMAGE_NT_SIGNATURE)。
接著就是PE的文件頭了,包含的信息有該程序運行平台、有多少段(sections)、文件
鏈接的時間、它是一個可執行文件(EXE)還是一個動態鏈接庫(DLL)或是其他。
後面緊接著有一個「可選」頭部(這個部分總是存在,但是因為COFF在庫(Libraries)
中用了這個詞,在一可執行模塊中並沒有用這個詞,但是仍被叫做可選的)。這可部分包含程
序載入的更多的信息:開始地址、保留堆棧數量、數據段大小等等。
可選頭中還有一個重要的域是一叫做「數據目錄表」(data directories)的數組;表
中的每一項是一個指向某一個段的指針。例如:如果某程序有一個輸出目錄表(export dire
ctory ),那你就會在數據目錄表中找到一個為IMAGE_DIRECTORY_ENTRY_EXPORT的指針,並且
它將指向某一個段。
可選頭的下面就是「段」(sections)了,通過一個叫做「段頭」(section headers)
的結構索引。實際上,段的內容才是你要真正執行的程序,上面介紹的所有的文件頭及目錄表
等信息就是為了能正確的找到它。
每一個段都有一些有關的標志,例如它包含什麼數據(「初始化數據」或其他),它能
否被共享等,及它數據本身的特徵。大多數情況下(並不是全部),每個段會被一個或多個目
錄表指向,目錄表可通過可選頭的「數據目錄表」的入口找到,就象輸出函數表或基址重定位
表。也有沒有目錄表指向的段,如可執行代碼或初始化數據。
整個文件結構如下:
+-------------------+
| DOS-stub |
+-------------------+
| file-header |
+-------------------+
| optional header |
|- - - - - - - - - -|
| |
| data directories |
| |
+-------------------+
| |
| section headers |
| |
+-------------------+
| |
| section 1 |
| |
+-------------------+
| |
| section 2 |
| |
+-------------------+
| |
| ... |
| |
+-------------------+
| |
| section n |
| |
+-------------------+
下面介紹一下相關虛擬地址(Relative Virtual Addresses)
PE格式文件中經常用到RVA,即相關虛擬地址,用在不知道基地址的情況下表示一個內存
地址。它需要加上基地址才能得到線性地址(Linear address)。
例如:假設一個可執行程序調入內存0x400000處並且程序從RVA 0x1560處開始執行。那
么正確的開始地址是0x401560。如果可執行程序調入0x100000處,則開始地址為0x101560。
因為PE文件的每一個段不必按同樣的邊界對齊方式調入,因此RVA地址的計算變得比較復
雜。例如,在文件中每一個段往往按512個位元組的方式對齊,而在內存中可能以4096位元組的方
式對齊。這方面的介紹可見下面的「SectionAlignment」、「FileAlignment」。舉個例子,
假設你知道一個程序從RVA 0x1560開始執行,你想從那兒反匯編它。你發現內存中的段對齊方
式為4096並且.code段開始於內存RVA 0x1560並且有16384位元組長;那麼你可以知道RVA 0x156
0在這個段的0x560處。你又發現這個段在文件中以512位元組方式對齊並且.code開始於文件0x8
00處,那現在你知道了可執行程序開始於0x800+0x560 = 0xd60處。
二、DOS頭(DOS-stub )
眾所周知DOS頭的概念是從16位的WINDOWS可執行程序(NE格式)中來的,這個部分主要
用在OS/2可執行程序、自解壓文檔及其他應用程序。在PE格式文件中,大多數程序的這個部分
中只有大約100個位元組的代碼,只輸出一個諸如「this program needs windows NT 」之類的
信息。
你可以通過一個叫做IMAGE_DOS_HEADER的結構來識別一個合法的DOS頭。這個結構的頭兩
個位元組一定是「MZ」(#define IMAGE_DOS_SIGNATURE "MZ")。怎麼才能找到PE開始的標志呢
?你可以通過該結構的一個叫做「e_lfanew」(offset 60,32bits) 的成員來找到它。在O
S/2及16位WINDOWS程序中這個標志是一個16位的字;在PE程序中,它是一個32位的雙字,值為
0x00004550(#define IMAGE_NT_SIGNATURE 0x00004550)。
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
三、文件頭(File Header)
通過DOS頭,你可以找到一個叫做IMAGE_FILE_HEADER的結構,如下;下面我分別介紹一
下。
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //0x04
WORD NumberOfSections; //0x06
DWORD TimeDateStamp; //0x08
DWORD PointerToSymbolTable; //0x0c
DWORD NumberOfSymbols; //0x10
WORD SizeOfOptionalHeader; //0x14
WORD Characteristics; //0x16
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
Machine:表示該程序要執行的環境及平台,現在已知的值如下:
IMAGE_FILE_MACHINE_I386(0x14c)
Intel 80386 處理器以上
0x014d
Intel 80486 處理器以上
0x014e
Intel Pentium 處理器以上
0x0160
R3000(MIPS)處理器,高位在前
IMAGE_FILE_MACHINE_R3000(0x162)
R3000(MIPS)處理器,低位在前
IMAGE_FILE_MACHINE_R4000(0x166)
R4000(MIPS)處理器,低位在前
IMAGE_FILE_MACHINE_R10000(0x168)
R10000(MIPS)處理器,低位在前
IMAGE_FILE_MACHINE_ALPHA(0x184)
DEC Alpha AXP處理器
IMAGE_FILE_MACHINE_POWERPC(0x1f0)
IBM Power PC,低位在前
NumberOfSections:段的個數,段的概念我們將在下面介紹。
TimeDateStamp:文件建立的時間。你可用這個值來區分同一個文件的不同的版本,即使
它們的商業版本號相同。這個值的格式並沒有明確的規定,但是很顯然的大多數的C編譯器都
把它定為從1970.1.1 00:00:00以來的秒數(time_t )。這個值有時也被用做綁定輸入目錄表
,這將在下面介紹。
注意:一些編譯器將忽略這個值。
PointerToSymbolTable 及 NumberOfSymbols:用在調試信息中,我不太清楚它們的用途
,不過發現它們總為0。
SizeOfOptionalHeader:可選頭的長度(sizeof IMAGE_OPTIONAL_HEADER)你可以用它
來檢驗PE文件的正確性。
Characteristics:是一個標志的集合,其中大部分的位用在目標文件(OBJ)或庫文件
(LIB)中:
Bit 0 (IMAGE_FILE_RELOCS_STRIPPED):置1表示文件中沒有重定向信息。每個段都
有它們自己的重定向信息。這個標志在可執行文件中沒有使用,在可執行文件中是用一個叫做
基址重定向目錄表來表示重定向信息的,這將在下面介紹。
Bit 1 (IMAGE_FILE_EXECUTABLE_IMAGE):置1表示該文件是可執行文件(也就是說
不是一個目標文件或庫文件)。
Bit 2 (IMAGE_FILE_LINE_NUMS_STRIPPED):置1表示沒有行數信息;在可執行文件
中沒有使用。
Bit 3 (IMAGE_FILE_LOCAL_SYMS_STRIPPED):置1表示沒有局部符號信息;在可執行
文件中沒有使用。
Bit 4 (IMAGE_FILE_AGGRESIVE_WS_TRIM):
Bit 7 (IMAGE_FILE_BYTES_REVERSED_LO)
Bit 15 (IMAGE_FILE_BYTES_REVERSED_HI):表示文件的位元組順序如果不是機器所期
望的,那麼在讀出之前要進行交換。在可執行文件中它們是不可信的(操作系統期望按正確的
位元組順序執行程序)。
Bit 8 (IMAGE_FILE_32BIT_MACHINE):表示希望機器為32位機。這個值永遠為1。
Bit 9 (IMAGE_FILE_DEBUG_STRIPPED):表示沒有調試信息,在可執行文件中沒有使
用。
Bit 10 (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP):置1表示該程序不能運行於可移
動介質中(如軟碟機或CD-ROM)。在這種情況下,OS必須把文件拷貝到交換文件中執行。
Bit 11 (IMAGE_FILE_NET_RUN_FROM_SWAP):置1表示程序不能在網上運行。在這種
情況下,OS必須把文件拷貝到交換文件中執行。
Bit 12 (IMAGE_FILE_SYSTEM):置1表示文件是一個系統文件例如驅動程序。在可執
行文件中沒有使用。
Bit 13 (IMAGE_FILE_DLL):置1表示文件是一個動態鏈接庫(DLL)。
Bit 14 (IMAGE_FILE_UP_SYSTEM_ONLY):表示文件被設計成不能運行於多處理器系
統中。
四、可選頭(Optional Header)
文件頭下面就是可選頭,這是一個叫做IMAGE_OPTIONAL_HEADER的結構。它包含很多關於
PE文件定位的信息。下面分別介紹:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic; //0x18
BYTE MajorLinkerVersion; //0x1a
BYTE MinorLinkerVersion; //0x1b
DWORD SizeOfCode; //0x1c
DWORD SizeOfInitializedData; //0x20
DWORD SizeOfUninitializedData; //0x24
DWORD AddressOfEntryPoint; //0x28
DWORD BaseOfCode; //0x2c
DWORD BaseOfData; //0x30
//
// NT additional fields.
//
DWORD ImageBase; //0x34
DWORD SectionAlignment; //0x38
DWORD FileAlignment; //0x3c
WORD MajorOperatingSystemVersion; //0x3e
WORD MinorOperatingSystemVersion; //0x40
WORD MajorImageVersion; //0x42
WORD MinorImageVersion; //0x44
WORD MajorSubsystemVersion; //0x46
WORD MinorSubsystemVersion; //0x48
DWORD Win32VersionValue; //0x4c
DWORD SizeOfImage; //0x50
DWORD SizeOfHeaders; //0x54
DWORD CheckSum; //0x58
WORD Subsystem; //0x5c
WORD DllCharacteristics; //0x5e
DWORD SizeOfStackReserve; //0x60
DWORD SizeOfStackCommit; //0x64
DWORD SizeOfHeapReserve; //0x68
DWORD SizeOfHeapCommit; //0x6c
DWORD LoaderFlags; //0x70
DWORD NumberOfRvaAndSizes; //0x74
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
Magic:這個值好象總是0x010b。
MajorLinkerVersion及MinorLinkerVersion:鏈接器的版本號,這個值不太可靠。
SizeOfCode:可執行代碼的長度。
SizeOfInitializedData:初始化數據的長度(數據段)。
SizeOfUninitializedData:未初始化數據的長度(bss段)。
AddressOfEntryPoint:代碼的入口RVA地址,程序從這兒開始執行。
BaseOfCode:可執行代碼起始位置,意義不大。
BaseOfData:初始化數據起始位置,意義不大。
ImageBase:載入程序首選的RVA地址。這個在址可被Loader改變。
SectionAlignment:段載入後在內存中的對齊方式。
FileAlignment:段在文件中的對齊方式。
MajorOperatingSystemVersion及MinorOperatingSystemVersion:操作系統版本,Load
er並沒有用它。
MajorImageVersion及MinorImageVersion:程序版本。
MajorSubsystemVersion及MinorSubsystemVersion:子系統版本號,這個域系統支持;
例如:如果程序運行於NT下,子系統版本號如果不是4.0的話,對話框不能顯示3D風格。
Win32VersionValue:這個值好象總是為0。
SizeOfImage:程序調入後佔用內存大小(位元組),等於所有段的長度之和。
SizeOfHeaders:所有文件頭的長度之和,它等於從文件開始到第一個段的原始數據之間
的大小。
CheckSum:校驗和。它僅用在驅動程序中,在可執行文件中可能為0。它的計算方法Mic
rosoft不公開,在imagehelp.dll中的CheckSumMappedFile()函數可以計算它。
Subsystem:NT子系統,可能是以下的值:
IMAGE_SUBSYSTEM_NATIVE (1)
不需要子系統。用在驅動程序中。
IMAGE_SUBSYSTEM_WINDOWS_GUI(2)
WIN32 graphical程序(它可用AllocConsole()來打開一個控制台,但是不能在
一開始自動得到)。
IMAGE_SUBSYSTEM_WINDOWS_CUI(3)
WIN32 console程序(它可以一開始自動建立)。
IMAGE_SUBSYSTEM_OS2_CUI(5)
OS/2 console程序(因為程序是OS/2格式,所以它很少用在PE)。
IMAGE_SUBSYSTEM_POSIX_CUI(7)
POSIX console程序。
Windows95程序總是用WIN32子系統,所以只有2和3是合法的值。
DllCharacteristics:Dll狀態。
SizeOfStackReserve:保留堆棧大小。
SizeOfStackCommit:啟動後實際申請的堆棧數,可隨實際情況變大。
SizeOfHeapReserve:保留堆大小。
SizeOfHeapCommit:實際堆大小。
LoaderFlags:好象沒有用。
NumberOfRvaAndSizes:下面的目錄表入口個數,這個值也不可靠,你可用常數IMAGE_N
UMBEROF_DIRECTORY_ENTRIES來代替它,值好象總等於16。
DataDirectory:是一個IMAGE_DATA_DIRECTORY數組,數組元素個數為IMAGE_NUMBEROF_
DIRECTORY_ENTRIES,結構如下:
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
VirtualAddress:起始RVA地址。
Size:長度。
每一個目錄表代表以下的值:
IMAGE_DIRECTORY_ENTRY_EXPORT (0)
IMAGE_DIRECTORY_ENTRY_IMPORT (1)
IMAGE_DIRECTORY_ENTRY_RESOURCE (2)
IMAGE_DIRECTORY_ENTRY_EXCEPTION (3)
IMAGE_DIRECTORY_ENTRY_SECURITY (4)
IMAGE_DIRECTORY_ENTRY_BASERELOC (5)
IMAGE_DIRECTORY_ENTRY_DEBUG (6)
IMAGE_DIRECTORY_ENTRY_COPYRIGHT (7)
IMAGE_DIRECTORY_ENTRY_GLOBALPTR (8)
IMAGE_DIRECTORY_ENTRY_TLS (9)
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG (10)
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (11)
IMAGE_DIRECTORY_ENTRY_IAT (12)
❼ U盤PE里放什麼格式的系統文件
U盤復PE中可以放GHO, ISO 兩種格式的系統文製件,如果你是用「大白菜U盤製作」做成的U盤啟動盤,在它的U盤文件夾中就專門有二個文件夾,一個是放GHO文件,一個是放ISO文件,GHO文件可以通過手動GHOST進行系統還原,而ISO文件的可以通過「大白菜U盤啟動盤」自動的「ONEKEY(GHOST安裝器1.4 4 30)」來一鍵還原系統。(如下圖)
第一種GHO文件的:手動GHOST還原圖:
❽ PE格式的pe的具體結構
如下所示(經過簡化的,具體的可以查看winnt.h,不同字長的結構,其實大體一樣的)。
幾個宏定義:
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned char BYTE; typedef struct _IMAGE_DOS_HEADER
{
WORD e_magic; //魔術數字,所有MS-DOS兼容的可執行文件都將此值設為0X5A4D(MZ)
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)
WORD e_oeminfo; //OEM信息
WORD e_res2[10]; //保留字
DWORD e_lfanew; //新exe頭部的文件地址
}IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
typedef struct IMAGE_NT_HEADERS
{
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;
typedef struct IMAGE_FILE_HEADER
{
WORD Machine;
WORD NumberOfSections;//節的數量
DWORD TimeDateStamp;
DWORD PointerToSymbols;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
}IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;
typedef struct IMAGE_OPTIONAL_HEADER32
{
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUnInitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImgaeBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingsystemversion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsybtemVersion;
WORD MinorSubsybtemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeoOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlages;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
}IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32; PE文件頭後是節表,在winnt.h下如下定義
typedef struct _IMAGE_SECTION_HEADER
{
//IMAGE_SIZEOF_SHORT_NAME=8
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];//節表名稱,如「.text」
union
{
DWORD PhysicalAddress;//物理地址
DWORD VirtualSize;//真實長度,這兩個值是一個聯合結構,可以使用其中的任何一個,//一般是節的數據大小
} Misc;
DWORD VirtualAddress;//RVA
DWORD SizeOfRawData;//物理長度
DWORD PointerToRawData;//節基於文件的偏移量
DWORD PointerToRelocations;//重定位的偏移
DWORD PointerToLinenumbers;//行號表的偏移
WORD NumberOfRelocations;//重定位項數目
WORD NumberOfLinenumbers;//行號表的數目
DWORD Characteristics;//節屬性 如可讀,可寫,可執行等
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; typedef struct IMAGE_THUNK_DATA
{
union
{
DWORD ForwarderString;
DWORD Function;
DWORD Ordinal;
DWORD AddressOfData;
}u1;
}IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
typedef struct IMAGE_IMPORT_BY_NAME
{
WORD Hint;
BYTE Name;
}IMAGE_IMPORT_BY_NAME;