① 如何把一個pe文件做成iso文件
小馬PE文件,還有win7,xp的iso文件,如何做成一個可引導啟動的iso文件,系統只放進Gho和Wim文件,用pe里的工具安裝,想知道怎麼整合
② 什麼是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)
③ 怎麼把C編譯出來的EXE弄成PE文件
首先,c編譯出來的exe就是不一定就是PE文件。
當然有前提:
在WINDOWS操作系統下的編譯器才行!在dos系統下編譯出的不是PE文件,WIN-TC我沒用過不過按照你的描述這個東西應該是DOS下的一款軟體,加了win外殼,編譯出的exe文件是DOS可執行文件,不是PE格式。
可以使用其它編譯器試試,比如GCC,vc++等編譯出pe文件來。
④ 利用pe做完系統,pe文件怎麼處理
沒看明白,給解釋的詳細點好不,我平時不想用pe,就用pe做個系統,裝好系統後怎麼處理
⑤ PE文件怎麼打開
貌似不應該這樣問吧
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文件反匯編成源碼軟體
我倒,你的意思就是把VB生成的源程序反編譯成VB格式。。。 貌似有類似的東西,很多年前有這樣的,不完全。。。 都不太記得叫神馬了,你BAIDU反匯編VB看看
⑦ VC++ Dll文件可以反編譯嗎
可以的。
1、Dll文件和EXE文件一樣,都屬於Windows可執行文件,都遵守PE文件格式。
2、靜態反匯編可以通過IDA等軟體來進行,動態反編譯可以通過Windbg、Ollydbg來進行。以OllyDbg為例,把要反編譯的DLL文件拖到其界面中即可看到其反匯編代碼。
⑧ 急急急 反編譯軟體把EXE文件反譯成什麼 是機器語言還是匯編語言 是哪個匯編語言
首先你得清楚,微軟的exe可執行文件(即PE文件,有PE規范定義)的特徵,才能使用不同的反編譯軟體對exe進行反編譯。
如今,exe一般分託管代碼和非託管代碼兩類(託管代碼是由C#等語言生成的.NET運行時庫支持運行的中間代碼,不是CPU晶元可直接執行的二進制機器碼;而非託管代碼是CPU晶元看執行的機器碼)
非託管代碼反編譯後,其實就是簡單的將二進制機器碼用匯編表示,所以是匯編語言。
託管代碼反編譯,好的反編譯器直接將中間語言位元組碼反編譯成高級語言代碼,如C#
------------------------------------------------------
另外,在什麼平台運行的exe正確反編譯(需要選擇正確的晶元結構)為同平台的匯編語言。
如嵌入式ARM晶元上運行的Win CE系統上的exe就應當正確反編譯為ARM匯編
x86的就應當反編譯為x86匯編。
⑨ 用什麼工具查看修改pe文件怎麼修改
PE工具有很多,像LordPE,Stud_PE,等等,像這些工具可以查看那PE文件的基本結構,也可以修改PE文件。
如果出於學習目的的話,還是直接用16進制編輯工具吧,比如UltraEdit。
改PE的話,用那些工具足矣。點個兩三下就能填個節。16進制編輯器改PE的話,要非常熟悉PE結構,這個結構在winnt.h中有定義,建議你把整體結構組織一下,列印一份,對照每個結構的偏移,看PE文件的16進制碼,很快PE就不在話下了。
⑩ 如何反編譯EXE執行文件
C32asm 可反編譯成匯編文件
http://www.25it.net/SoftView.Asp?SoftID=227
C32asm 是一款非常不錯的國產靜態反編譯工具!
C32Asm現具有如下功能:
快速靜態反編譯PE格式文件(Exe、Dll等)
提供Hex文件編輯功能,功能強大
提供內存Dump、內存編輯、PE文件Dump、PE內存ImageSize修正等多種實用功能
提供內存反匯編功能,提供匯編語句直接修改功能,免去OPCode的直接操作的繁瑣
提供反編譯語句彩色語法功能,方便閱讀分析,能方便自定義語法色彩
提供輸入表、輸出表、參考字元、跳轉、調用、PE文件分析結果等顯示
提供方便的跳轉、調用目標地址的代碼顯示
提供匯編語句逐位元組分析功能,有助於分析花指令等干擾代碼