如果在DOS下執(zhí)行PE格式文件就會執(zhí)行后面的DOS Stub,顯示字符串"This program cannot run in DOS mode",如果在Window下執(zhí)行PE格式文件,PE加載器就會根據(jù)DOS MZ header中的最后一個域 e_lfnew跳過DOS Stub直接轉(zhuǎn)到PE Header , DOS MZ header 和 DOS Stub的貢獻僅此而已。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了惠水免費建站歡迎大家使用!2. PE Header:
當加載器跳到PE Header后,根據(jù)里面的各個域首先檢查這是不是有效的PE文件格式,能否在當前的CPU架構(gòu)下運行,優(yōu)先加載基址是多少,一共有幾個節(jié)(section),這是一個EXE文件還是DLL文件等總體信息,有了這些總體信息之后加載器就會跳到下面的Section table。
3.Section table:
有了上面從PE Header獲得的總體信息后,加載器并不能準確的加載文件,因為要準確的加載文件,加載器還需要一些關(guān)于每一節(jié)的更具體的信息,比如:每一節(jié)在磁盤文件上的起始位置、大小,應(yīng)該被加載的線性地址空間的哪一部分,這一節(jié)是代碼還是數(shù)據(jù),讀寫屬性如何等等。所有這些信息都保存在Section table里面,Section table是一個結(jié)構(gòu)數(shù)組,數(shù)組里面的每一個結(jié)構(gòu)對應(yīng)PE文件中的一個節(jié)。PE加載器就會遍歷這個結(jié)構(gòu)數(shù)組把PE文件的每一節(jié)準確的加載到線性地址空間。(這里還要注意兩點:一是PE加載器把PE文件的每一節(jié)加載到線性地址空間并不是說把磁盤上的文件調(diào)入物理內(nèi)存;而只是為它分配線性地址空間,分配線性地址空間意味著申請本進程需要的頁表,并把相應(yīng)的信息添入頁表中。線性地址空間也可以看作是一種資源,它是通過頁表來體現(xiàn)的,當一個頁表被添入相應(yīng)的信息被占用之后那么這個頁表對應(yīng)的那塊線性地址空間也就被分配出去了。需要注意的另一點是PE加載器對每一節(jié)采用文件映射的方式把相應(yīng)的磁盤文件映射到內(nèi)存,而不是把整個PE文件采用文件映射的方法把磁盤文件映射到內(nèi)存。更具體的解釋我會在“Windows 內(nèi)存管理”中提到。)
4.Sections:
PE文件最后的部分就是各個節(jié)了,比如.text , .data , .idata等等,各種節(jié)的作用后面會有一個簡要介紹。
思考一下:既然加載器不一定把程序加載到PE頭中指定的優(yōu)先加載基址,那么如果在沒有加載到PE頭中指定的優(yōu)先加載基址的情況下,指令中的地址是不是都要依次修改呢?首先我們要明確的一點是程序指令中的地址分兩大類,其中一類是在編譯過程就可以確定的,這類地址采用的是相對虛擬地址(RVA),所以即使程序沒有被加載到希望的基址這些地址也無需修改。另一類地址是編譯過程和連接過程都無法確定的,比如那些引用外部庫的函數(shù)地址,因為外部庫之后在被加載器加載后里面的函數(shù)地址才能確定下來,所以程序中的這類地址要在程序被加載后進行修改。那么編譯器和連接器對這類無法確定的地址是如何處理的呢?加載器又是根據(jù)什么如何來對它們進行修改的呢?個人感覺PE文件格式學(xué)習(xí)中這一部分內(nèi)容有些繁雜,所以希望大家讀后面各節(jié)的時候最好時常思考一下這兩個問題。從下一節(jié)開始我們將對PE文件的各個部分作更為詳盡的講解。重點部分會放在對上面兩個問題的解決上。
不登高山,怎知天高;不臨深溪,焉知地厚!站在堅實的土地上,做著生命中最真實的事情;像一棵挺拔的大樹,認可自己的命運并敢于迎接屬于這一方天空的風(fēng)風(fēng)雨雨。
當前文章:PE格式總覽-創(chuàng)新互聯(lián)
標題鏈接:http://muchs.cn/article0/depiio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、電子商務(wù)、網(wǎng)站改版、ChatGPT、移動網(wǎng)站建設(shè)、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容