1)節(jié):PE文件的真正內(nèi)容劃分成塊,稱之為sections(節(jié))。每節(jié)是一塊擁有共同屬性的數(shù)據(jù),比如代碼/數(shù)據(jù)、讀/寫等。我們可以把PE文件想象成一邏輯磁盤,PE header 是磁盤的boot扇區(qū),而sections就是各種文件,每種文件自然就有不同屬性如只讀、系統(tǒng)、隱藏、文檔等等。值得我們注意的是 ---- 節(jié)的劃分是基于各組數(shù)據(jù)的共同屬性: 而不是邏輯概念。重要的不是數(shù)據(jù)/代碼是如何使用的,如果PE文件中的數(shù)據(jù)/代碼擁有相同屬性,它們就能被歸入同一節(jié)中。不必關(guān)心節(jié)中類似于"data", "code"或其他的邏輯概念: 如果數(shù)據(jù)和代碼擁有相同屬性,它們就可以被歸入同一個(gè)節(jié)中。(節(jié)名稱僅僅是個(gè)區(qū)別不同節(jié)的符號(hào)而已,類似"data", "code"的命名只為了便于識(shí)別,惟有節(jié)的屬性設(shè)置決定了節(jié)的特性和功能)如果某塊數(shù)據(jù)想付為只讀屬性,就可以將該塊數(shù)據(jù)放入置為只讀的節(jié)中,當(dāng)PE裝載器映射節(jié)內(nèi)容時(shí),它會(huì)檢查相關(guān)節(jié)屬性并置對(duì)應(yīng)內(nèi)存塊為指定屬性。下面是常見(jiàn)的節(jié)名及作用:
節(jié)名 | 作用 |
.arch | 最初的構(gòu)建信息(Alpha Architecture Information) |
.bss | 未經(jīng)初始化的數(shù)據(jù) |
.CRT | C運(yùn)行期只讀數(shù)據(jù) |
.data | 已經(jīng)初始化的數(shù)據(jù) |
.debug | 調(diào)試信息 |
.didata | 延遲輸入文件名表 |
.edata | 導(dǎo)出文件名表 |
.idata | 導(dǎo)入文件名表 |
.pdata | 異常信息(Exception Information) |
.rdata | 只讀的初始化數(shù)據(jù) |
.reloc | 重定位表信息 |
.rsrc | 資源 |
.text | .exe或.dll文件的可執(zhí)行代碼 |
.tls | 線程的本地存儲(chǔ)器 |
.xdata | 異常處理表 |
注意:上面已經(jīng)說(shuō)過(guò)了“節(jié)的劃分是基于各組數(shù)據(jù)的共同屬性: 而不是邏輯概念。重要的不是數(shù)據(jù)/代碼是如何使用的,如果PE文件中的數(shù)據(jù)/代碼擁有相同屬性,它們就能被歸入同一節(jié)中” 所以上面表中列出的節(jié)并不一定單獨(dú)成節(jié),也就是說(shuō)即使存在上面表中的某一節(jié),在節(jié)表(section table)(后面會(huì)講到)中也不一定就有于之對(duì)應(yīng)的項(xiàng),因?yàn)樗赡芎蛣e的具有共同屬性的節(jié)共同組成了一節(jié)。比如 .idata 可以和 .text 合成一節(jié)而命名為 .text,而在節(jié)表中只有和 .text 對(duì)應(yīng)的項(xiàng)。這也就是后面的optional header中數(shù)據(jù)目錄(DataDirectory)存在的作用,因?yàn)楹芏嘤杏玫墓?jié)被合并了,因此加載器無(wú)法通過(guò)節(jié)表來(lái)定位它們,所以這就是數(shù)據(jù)目錄(DataDirectory)發(fā)揮作用的時(shí)候了(具體作用后面會(huì)講到)。
2)虛擬地址:虛擬地址即程序中使用的地址,也就是從程序員的角度看到的地址,有時(shí)也叫邏輯地址;通常使用段地址:偏移量的形式表示,不過(guò)在32位系統(tǒng)中使用的是平坦(Flat)內(nèi)存模式,所以我們可以不用管段地址,只考慮32位的偏移量即可,認(rèn)為32位的偏移量就是虛擬地址,這樣一來(lái)程序員就可以認(rèn)為他是在一個(gè)段中寫程序,這個(gè)段的大小是232 = 4G的容量,當(dāng)然這部分地址空間是程序和OS共享的,程序員可以利用的大約有2G(具體可以參考Win98和WinNT的內(nèi)存布局);所以我們平時(shí)在寫程序申請(qǐng)內(nèi)存的時(shí)候?qū)嶋H上申請(qǐng)的就是這2G的線性地基空間,由于所有的4G線性地址空間都被OS作為資源來(lái)管理(這4G的線性地址空間是通過(guò)頁(yè)表來(lái)表現(xiàn)出來(lái)的,OS分配線性地址空間給進(jìn)程也就是分配相應(yīng)的頁(yè)表給進(jìn)程),所以我們無(wú)論用什么方式使用內(nèi)存最終都是轉(zhuǎn)換為OS為我們分配線性地址空間,至于分配的線性地址空間又如何被映射為真正的物理內(nèi)存完全是有OS負(fù)責(zé)的(更詳細(xì)資料參見(jiàn)“Windows 內(nèi)存管理”),程序員不必操心。
3)相對(duì)虛擬地址:「相對(duì)虛擬地址(Relative VirtualAddress,RVA)」即相對(duì)于上面的基地址的偏移量。PE 文件中的許多字段內(nèi)容都是以RVA 表示,一個(gè)RVA 是某一資料項(xiàng)的offset(偏移)值-- 從文件被映像進(jìn)來(lái)的起點(diǎn)(即基地址)算起。舉個(gè)例子,我們說(shuō)Windows加載器把一個(gè)PE 文件映像到虛擬地址空間的0x400000 處,如果此image 有一個(gè)表格開始于0x401464,那么這個(gè)表格的RVA 就是0x1464:虛擬地址0x401464 - 基地址0x400000 = RVA 0x1464只要把RVA 加上基地址,RVA 就可以被轉(zhuǎn)換為一個(gè)有用的指針。在PE文件中大多數(shù)地址多是RVA 而 RVA只有當(dāng)PE文件被PE裝載器裝入內(nèi)存后才有意義。如果我們直接將文件映射到內(nèi)存而不是通過(guò)PE裝載器載入,那么我們就不能直接使用那些RVA。必須先將那些RVA轉(zhuǎn)換成文件偏移量,RVAToOffset函數(shù)就起到這個(gè)作用。
4)基地址:「基地址(base address)」是一個(gè)重要概念,用來(lái)描述被映像到內(nèi)存中的EXE 或DLL 的起始地址。為了方便,Windows NT 和Windows 95 都以模塊的基地址做為模塊的instance handle(HINSTANCE,實(shí)例句柄)。Windows95加載器把一個(gè)PE 文件映像到虛擬地址空間的0x400000 處;而WindowNT加載器把一個(gè)PE 文件映像到虛擬地址空間的0x10000 處 。
5)文件偏移量:文件中的地址與內(nèi)存中表示不同,它是用偏移量(File offset)來(lái)表示的,文件中的第一個(gè)字節(jié)的偏移量是0,后面的字節(jié)依次遞增。在SoftICE和W32Dasm下顯示的地址值是內(nèi)存線性地址,或稱之為虛擬地址(Virual Address,VA)。而十六進(jìn)制工具里,如:Hiew、Hex Workshop等顯示的地址就是文件地址,稱之為偏移量(File offset) 或物理地址(RAW offset,注意這個(gè)物理地址不是內(nèi)存尋址中說(shuō)到的物理地址 )。
6)模塊:「模塊(module)」一詞表示一個(gè)EXE 或DLL 被加載內(nèi)存后的程序代碼、數(shù)據(jù)和資源(就是被加載到內(nèi)存后的EXE或DLL整體,包括代碼、數(shù)據(jù)和資源,而不是說(shuō)代碼、數(shù)據(jù)、資源分別都是模塊)。除了程序代碼和數(shù)據(jù)是你的程序直接使用的之外,模塊還內(nèi)含一些支持性數(shù)據(jù),Windows 用它來(lái)決定程序代碼和數(shù)據(jù)放在內(nèi)存的什么地方,在Win32,這些信息保留在PE頭部(即圖1中的PE header,實(shí)際上它是一個(gè)IMAGE_NT_HEADERS 結(jié)構(gòu))中。
7)邏輯地址:見(jiàn)“虛擬地址”
8)線性地址:線性地址是由虛擬地址(邏輯地址)轉(zhuǎn)換來(lái)的,轉(zhuǎn)換需要CPU和OS共同合作來(lái)完成;里面涉及到全局描述符表GDT和局部描述符表LDT;不過(guò)由于32位的Window系統(tǒng)采用flat內(nèi)存模式,所以我們可以認(rèn)為虛擬地址就是線性地址,即我們可以認(rèn)為邏輯地址中的32位偏移量就是線性地址。
9)物理地址:即最終發(fā)往地址總線上的地址,它對(duì)應(yīng)著實(shí)際的物理內(nèi)存,在32位的Window存儲(chǔ)管理中它是通過(guò)頁(yè)表由線性地址轉(zhuǎn)換出來(lái)的。
10)實(shí)際地址:即“物理地址”。
其中前面的6個(gè)概念是學(xué)習(xí)PE文件格式需要知道的
不登高山,怎知天高;不臨深溪,焉知地厚!站在堅(jiān)實(shí)的土地上,做著生命中最真實(shí)的事情;像一棵挺拔的大樹,認(rèn)可自己的命運(yùn)并敢于迎接屬于這一方天空的風(fēng)風(fēng)雨雨。
本文題目:幾個(gè)重要的基本概念-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://sd-ha.com/article4/jjpie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站策劃、服務(wù)器托管、建站公司、電子商務(wù)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容