E×E[可執行程式]

E×E[可執行程式]
更多義項 ▼ 收起列表 ▲

可執行程式(executable program,EXE File)是可在作業系統存儲空間中浮動定位的二進制可執行程式。它可以載入到記憶體中,由作業系統載入並執行。特定的CPU指令集(如X86指令集)對應的不同平台之間的可執行程式不可直接移植運行。

簡介

windows作業系統中的二進制執行檔分兩種:一種後輟名為.COM,另一種是.EXE 。在MS-DOS下,有重名的.EXE檔案和.COM檔案運行時,優先執行.COM檔案。如果只有A.EXE,就可以直接輸入"A",而不用輸入全名。但如果有A.COM和A.EXE,輸入A則優先執行A.COM,要運行A.EXE只能輸入A.EXE而不能輸入A。在WINDOWS系統中的執行檔案一般都是.EXE檔案。在windows中,用戶在命令提示符輸入不帶 .exe 擴展名的檔案名稱後按 Enter 鍵或者點雙擊就能運行可執行程式。linux不象MS-DOS/windows一樣靠檔案後綴名來判斷是否可執行,而是靠檔案屬性來判斷。每個檔案專門有個屬性來表示檔案是否可執行,對於腳本之類的程式,檔案第一行指明執行本腳本的程式位置。

windows/MS-DOS下的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開發環境等

相關詞條

熱門詞條

聯絡我們