文件結構
EXE 文件比較複雜,每個EXE文件都有一個文件頭,結構如下。
EXE文件頭的信息
├偏移量┤意義 ┤
├00h-01h ┤MZ'EXE文件标記 ┤
├02h-03h ┤最後一頁的字節數(每頁512B) ┤
├04h-05h ┤文件長度(字節數)除以512的商+1 -| ┤
├06h-07h ┤重定位項的個數 ┤
├08h-09h ┤文件頭除16的商 ┤
├0ah-0bh ┤程序運行所需最小段數 ┤
├0ch-0dh ┤..............大.... ┤
├oeh-0fh ┤堆棧段的段值 (SS) ┤
├10h-11h ┤........sp ┤
├12h-13h ┤文件校驗和 ┤
├14h-15h ┤IP ┤
├16h-17h ┤CS ┤
├18h-19h ┤............ ┤
├1ah-1bh ┤............ ┤
├1ch ┤............ ┤
―――――――――――――――――――――――――
.EXE文件包含一個文件頭和一個可重定位程序映象。文件頭包含MS-DOS用于加載程序的信息,例如程序的大小和寄存器的初始值。文件頭還指向一個重定位表,該表包含指向程序映象中可重定位段地址的指針鍊表。文件頭的形式與EXEHEADER結構對應:
EXEHEADER STRUC
exSignature dw 5A4Dh ;.EXE标志
exExraBytes dw ;最後(部分)頁中的字節數
exPages dw ;文件中的全部和部分頁數
exRelocItems dw ;重定位表中的指針數
exHeaderSize dw ;以字節為單位的文件頭大小
exMinAlloc dw ;最小分配大小
exMaxAlloc dw ;最大分配大小
exInitSS dw ;初始SS值
exInitSP dw ;初始SP值
exChechSum dw ;補碼校驗值
exInitIP dw ;初始IP值
exInitCS dw ;初始CS值
exRelocTable dw ;重定位表的字節偏移量
exOverlay dw ;覆蓋号
EXEHEADER ENDS程序映象
包含處理器代碼和程序的初始數據,緊接在文件頭之後。它的大小以字節為單位,等于EXE文件的大小減去文件頭的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通過把該映象直接從文件拷貝到内存加載.EXE程序然後調整定位表中說明的可重定位段地址。
定位表是一個重定位指針數組,每個指向程序映象中的可重定位段地址。文件頭中的exRelocItems域說明了數組中指針的個數,exRelocTable域說明了分配表的起始文件偏移量。每個重定位指針由兩個16位值組成:偏移量和段值。 為加載.EXE程序,MS-DOS首先讀文件頭以确定.EXE标志并計算程序映象的大小。然後它試圖申請内存。首先,它計算程序映象文件的大小加上PSP的大小再加上EXEHEADER結構中的exMinAlloc域說明的内存大小這三者之和,如果總和超過最大可用内存塊的大小。則MS-DOS停止加載程序并返回一個出錯值。如果總和沒超過最大可用内存塊的大小,它便計算程序映象的大小加上PSP的大小再加上EXEHEADER結構中exMaxAlloc域說明的内存大小之和,如果第二個總和小于最大可用内存塊的大小,則MS-DOS 分配計算得到的内存量。否則,它分配最大可用内存塊。分配完内存後,MS-DOS确定段地址,也稱為起始段地址,MS-DOS從此處加載程序映象。如果exMinAlloc域和exMaxAlloc域中的值都為零,則MS-DOS把映象盡可能地加載到内存最高端。否則,它把映象加載到緊挨着PSP域之上。接下來,MS-DOS讀取重定位表中的項目調整所有由可重定位指針說明的段地址。對于重定位表中的每個指針,MS-DOS尋找程序映象中相應的可重定位段地址,并把起始段地址加到它之上。一旦調整完畢,段地址便指向了内存中被加載程序的代碼和數據段。 MS-DOS在所分配内存的最低部分建造256字節的PSP,把AL和AH設置為加載 .COM程序時所設置的值。MS-DOS使用文件頭中的值設置SP與SS,調整SS初始值,把起始地址加到它之上。MS-DOS還把ES和DS設置為PSP的段地址.最後,MS-DOS從程序文件頭讀取CS和IP的初始值,把起始段地址加到CS之 上,把控制轉移到位于調整後地址處的程序。
文件格式
Linux32/64位可執行文件
Linux是靠文件屬性來判斷判斷是否可執行。每個文件專門有個屬性來表示文件是否可執行。
MS-DOS可執行文件
最簡單的可執行文件格式,可以在MS-DOS和32位的WINDOWS中運行。它通過在文件頭添加ASCII字符串“MZ”(16進制中表示為4D5A)來标識。“MZ”是MS-DOS開發者之一的馬克·茨柏克沃斯基(Mark Zbikowski)的姓名首字母縮寫DOS可執行文件是16位可執行文件,運行于兼容x86指令集(或x86虛拟機)下的實模式或虛拟8086模式。
16位NE X86可執行文件
通過在文件頭添加ASCII字符串“NE”來标識。它隻能運行在Windows和OS/2系統,而不能在DOS下運行。
16/32位X86可執行文件
通過在文件頭添加ASCII字符串“LE”來标識。它僅用來在Windows 3.x和Windows 9x中替代VxD驅動。
32位線性可執行文件
通過在文件頭添加ASCII字符串“LX”來标識。運行在OS/2 2.0以及更高版本中,也可用于某些DOS擴展。
32位X86可執行文件
這是最複雜也最流行的可執行文件格式,通過在文件頭添加ASCII字符串“PE”來标識。它主要運行于Windows 95和Windows NT以及更高版本的Windows中,也可在BeOS R3中運行。
64位X86-64可執行文件
與前一種類似,但使用支持64位的X86cpu(64根地址總線)。因此它僅能在64位的Windows系統中運行,譬如Windows 7 64位和 Windows10 X64。
反編譯
計算機軟件反向工程也稱為計算機軟件還原工程,是指通過對他人軟件的目标程序(可執行程序)進行“逆向分析、研究”工作,以推導出他人的軟件産品所使用的思路、原理、結構、算法、處理過程、運行方法等設計要素,某些特定情況下可能推導出源代碼。
反彙編是把目标代碼轉為彙編代碼的過程,是把二級制可執行程序機器語言轉換為彙編語言代碼,常用于軟件破解、病毒分析、逆向工程、軟件漢化等領域。
常用軟件debug、W32Dasm、C32Asm等
修改軟件UEStudio開發環境等