pe反編譯
『壹』 學習反編譯涉及到什麼知識
首先要懂編譯原理。
還要有扎實的匯編和c語言的知識,這一點非常重要。
最好還要有linux/unix環境的知識(如果是在windows環境,你需要了解pe文件格式)。
『貳』 如何用PE修改一個exe文件的標題和內容
誰能告訴我怎麼用PE
Explorer或者W32Dasm修改EXE文件的源代碼?我反編譯出代碼2)如果文件是加殼的,必須先脫殼後才能,進行下一步的工作
3)如果文件沒
『叄』 反編譯exe文件就是把exe還原為匯編
首先了解一下概念,exe程序只是WIN下PE格式的可執行文件的一種,而所謂的計算機執行的代碼只是一串
二進制數
,跟數據沒區別,當CS,EIP指向哪,哪裡就是程序,而匯編語言之所以叫最底層的語言,是因為,
匯編的每一個語法,都應對了一串二進制的指令,這也就是
反匯編
的原理,所以
NO1.一、
反編譯
exe程序
就是
把
exe
還原為匯編語言嗎?,這句話,不能叫還原,應該叫解釋,「解釋」的東西,沒還原的那麼逼真,比如,在匯編
源程序
中所有的標號和注釋,進行編譯後,變成二進制可執行文件後,在反匯編,標號就變成數字了,而注釋更是沒了.....
二、除了
還原為
匯編語言,還能
反編譯為
其他
高級語言
嗎?不能,高級語言的語法是建立在大量的計算機
二進制代碼
之上的,比如你C語言隨便調用一個子函數,到了二進制中,他是先壓棧,參數(編譯後參數從右往左壓,每個語言還不一樣),然後就是call
子函數,子函數運行後,他還要清理堆棧,所以你一個句簡單的高級語言,其實蘊含了大量的代碼,而高級語言編譯後的程序,就脫離了他的開發環境,樓上說的會引起你誤會,Java的中間碼,可以用他自帶的反編譯工具,因為Java不是
編譯器
,而是
解釋器
,所以他不編譯,只是解釋他的中間碼
NO2.所有的exe都可以反匯編,但是你要注意,不只exe這種pe格式,linux下可執行文件是elf,所以你在反匯編的時候,要注意可執行文件的文件的頭,而早期的DOS只是純二進制代碼,沒有
頭文件
,這個很重要,你要反匯編什麼格式,就要選擇相應的工具
NO3
.exe反匯編,當然是OD,不過,我對OD不熟悉,好像他只支持WIN下的反匯編
『肆』 什麼是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)
『伍』 有沒有64位程序的資源編譯/反編譯工具,例如32位下面的eXeSCOPE
據我所知,有編譯器,反編譯器至少現在還沒有……
64為處理器結構根據官方資料X64多了8個通用寄存器:R8、R9、R10、R11、R12、R13、R14、R15,當然,它們都是64位的。
所以需要有專門針對這種新處理器結構的反匯編工具才能完成反匯編……
另外X32中原有的寄存器在X64中均為擴展為64位,且名稱的第一個字母從E改為R。不過我們還是可以在64位程序中調用32位的寄存器,如RAX(64位)、EAX(低32)、AX(低16位)、AL(低8位)、AH(8到15位),相應的有R8、R8D、R8W和R8B。不過不要在程序中使用如AH之類的寄存器,因為在AMD的CPU上這種用法會與某些指令產生沖突。所以反匯編過程也更加復雜,相信各大編程論壇已經開始有高手嘗試著去解決反匯編這類復雜的問題,我們一同關注吧……
『陸』 如何對一個exe程序反編譯得到它的匯編程序 下了一個 pe explorer 但是不太看的懂 求指教
生成的程序是不能看到源代碼的,不過可以看到那個程序的資源,用e-code explorer 反匯編調試由易語言編譯生成的易格式可執行文件,分析內部結構,查看其中的各項數據。。格式分析:分析易格式可執行文件的總體結構,查看對應項的數
『柒』 PE32 或 PE32+頭 和標準的windows PE 文件頭 還有CLR 頭里的這個「頭」是什麼意思啊
PE等是指可執行程序(EXE或DLL)文件格式,每種文件格式都有一些該可執行文件載入到內存中所需要的信息(如程序入口點等),這些信息被組織為特定的數據結構,放在該可執行文件的開頭部分,所以叫文件「頭」。
『捌』 pe explorer怎麼修改程序把要改的程序拉進去 反編譯出現代碼段 但不知道點哪裡進行修改
問題是你要改什麼?工具不是主要的,掌握了其中的原理,什麼工具都是一樣的改.
『玖』 用pexplorer 打開EXE也能反匯編了,如何看他裡面的框架,內詳
導出.lst格式,慢慢分析,弄成vb6是不肯呢個的,只能看匯編代碼,高級點的反編譯工具你可以用ida pro,是所有反編譯里最強大的。
『拾』 VC++ Dll文件可以反編譯嗎
可以的。
1、Dll文件和EXE文件一樣,都屬於Windows可執行文件,都遵守PE文件格式。
2、靜態反匯編可以通過IDA等軟體來進行,動態反編譯可以通過Windbg、Ollydbg來進行。以OllyDbg為例,把要反編譯的DLL文件拖到其界面中即可看到其反匯編代碼。