Windows可執行文件簡述(三)
4.LE格式
在Windows3.x的時代,從DOS啓動Windows,Windows在把機器轉到保護模式之前需要在實模式下做一些初始化。實模式的16位代碼必須和32位代碼一起放在可執行文件中。舊的DOS下的可執行文件和NE格式的可執行文件無法滿足這個要求,於是從Win 3.x起到Win 9x,產生了一種新型的可執行文件格式LE,它只適用於工作於系統底層的、同時包含16位代碼和32位代碼的VxD驅動程序。OS/2 2.x也使用LE格式。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一般而言,保護模式下的可執行文件會在不同的Sections中放置程序代碼和數據,利用可執行文件頭中的各種屬性標誌來告訴可執行文件加載器在面對這些Sections時的各種細節動作。但是VxD卻將程序代碼和數據混雜在段之中,通過不同段前的標識來表明該段在運行時的特性。程序代碼和數據之所以能夠混雜在一起,而仍然能夠有效運作,是因爲VxD所使用的平坦模式的代碼和平坦模式下的數據選擇器有相同的基地址與限制因素。因此不論使用上述哪一個寄存器緩存器都可以取用程序代碼或數據。
下圖是LE格式的可執行文件的結構示意圖:
MZ文件頭 |
DOS文件頭 |
DOS Stub程序 | |
LE標誌 | |
LE文件頭 |
LE文件頭 |
LCODE |
程序段 |
PCODE | |
…… …… | |
16ICODE | |
MCODE |
在LE文件中,代碼和數據被存放在幾類運行屬性不同的段中。下面是LE文件之中一些可用的段類:
LCODE:頁面鎖定的代碼和數據段。這種段被鎖定在內存裏。換句話說,這段永遠不會被放到硬盤上去,所以你一定要謹慎的使用這種段類以免浪費寶貴的內存。那些每時每刻都必須放在內存中的代碼和數據應該放在這個段裏。尤其是那些硬件中斷處理程序。
PCODE:可調頁代碼段。VMM可以對這種段實行調頁處理,在這種段裏的代碼不必時刻放在內存裏,當VMM需要物理內存的時候,它就會把這段放到硬盤上去。
PDATA:可調頁數據段。
ICODE:僅用於的初始化段。這種段裏的代碼僅僅用來進行VxD的初始化。當初始化完成後,VMM就把這段從內存中釋放。
DBOCODE:僅用於調試的代碼數據段。當你要調試VxD程序時,就要用到這種段裏的代碼和數據,例如,它包含要調試的消息的處理代碼。
SCODE:靜態代碼和數據段。這種段時刻存在於內存中,即使VxD已經卸載,這種段對某些動態的VxD程序很有用,這些VxD程序需要在某一Windows進程裏不停的加載/卸載而又要紀錄上次的環境和狀態。
RCODE:實模式初始化代碼數據段。這種段包含實模式初始化需要的16位代碼和數據。
16ICODE:保護模式初始化數據段。這是一個16位的段,它包含VxD要從保護模式拷貝到V86模式的代碼。例如,如果你要把一些V86的代碼拷貝到一個虛擬機上時,你想拷貝的代碼就要放在這裏。如果你把它放在其他的段裏,編譯程序就會產生錯誤的代碼,例如,它會產生32位代碼而不是16位代碼。
MCODE:鎖定的消息字串。這種段包含了由VMM消息宏幫助編譯的消息字串,這有助於你構造你的驅程的國際版本。
5.PE格式
16位的程序是不健壯的,因此爲了保證Windows的健壯性,Microsoft在Microsoft Windows NT 3.1及其以後的操作系統版本,也就是所有的基於Win32的操作系統中推出了一種新的可執行文件的格式,也就是PE文件格式。PE的意思就是Portable Executable(可移植的可執行文件),內含32位程序代碼和數據,是UNIX Common Object File Format(COFF)的演化。PE格式比其它格式優越的關鍵點在於它有依字母次序排列的Exports,以及一個可以直接將程序影像映像成虛擬內存的內存文件映射功能。與此同時,Microsoft也推出了新的obj文件和lib文件的格式。PE文件結構的總體層次分佈圖如下:
DOS MZ Header |
DOS 實模式存根(Stub)程序 |
PE Header(PE文件標記等) |
Optional Header |
.text Section Header |
.bss Section Header |
.rdata Section Header |
…………………… |
.debug Section Header |
.text Section |
.bss Section |
.rdata Section |
……………… |
.debug Section |
從PE開始,可執行文件的結構開始有了正式的文檔化。Microsoft在Visual C++ 6的聯機文檔(即《MSDN Library Visual Studio 6.0》)中給出了以C語言描述的PE結構,這給開發者提供了很大的方便。同時還在VC的Include目錄裏的WINNT.h文件中提供PE的各結構的定義,提供了PE文件中使用的原始數據結構。
=======================================================================
rivershan原創於2004年3月23日 3:38