關於PE可執行檔的修改(2)

來源:互聯網
上載者:User
我們將用“Module”這一術語來表示已裝入記憶體的可執行檔或DLL的代碼、資料及資源。除了程式中直接用到的代碼和資料以外,一個Module也指Windows中用於判斷代碼及資料在記憶體中位置的支撐資料結構。在16位Windows中,支撐資料結構在Module Database中(Hmodule指向這個段)。而在32位Windows中,這些資料結構放在了PE部首中。
對於PE檔案,首先應該知道,磁碟中的執行檔案與其被Windows裝載程式裝入後的Module看起來非常相似。Windows裝載程式把磁碟檔案編程實際執行代碼的中作相當簡單,裝載程式使用檔案記憶體映象機制將磁碟檔案對應到虛擬位址空間。打個比方,PE檔案象一個活動地房子,裝載時只需將某個塊放在某個地方,在把它和其它部分擰好即可(比如說,把它和DLL連結在一起)。載入PE檔案格式的DLL同樣的簡單。一旦Module被裝入,在Windows中就同其它已經裝入的檔案一樣了。
這種方式與16位的Windows 3.1明顯的不同。16位的NE格式檔案裝載程式讀取部分磁碟檔案,並產生一個完全不同的資料結構,在記憶體中建立Module。當代碼或資料需要裝入時,裝載程式必須從全域記憶體中分配出一塊,尋找未經處理資料在檔案的什麼地方,找到位置後再讀取原始的資料,最後再進行一些修整。還有,每一個16位的Module要負責記住現在使用的所有selector(段選擇符),該selector表示該段是否已經被拋棄等等。
對於Win32,某Module中的代碼、資料、資源、輸入表、輸出表及其他有用的資料結構等使用的記憶體都放在一個連續的記憶體塊中,編程人員只要知道裝載程式檔案映像到記憶體後的地址即可。通過映像後面的各種指標可以輕易找到Module中所有內容。
我們還應該熟悉Win32中的“相對虛擬位址”(Relative Virual Address,RVA)這個名詞。PE檔案中的許多項都是以RVA方式指定的,RVA就是某個項相對於檔案映象地址的位移。例如:裝載程式將一個PE檔案裝入到虛擬位址空間中,從10000h開始的記憶體中,如果PE中某個表在映像中的起始地址是10464h,那麼該表的RVA就是464h。將RVA裝換為可用的指標,只要將RVA的值加上Module的基址即可。基地址是指裝入到記憶體中的EXE或DLL程式的開始地址,它是Win32中的一個重要概念。為了方便起見,Windows NT或Windows 95將Module的基地址作為Module的執行個體控制代碼Instance Handle(Hinstance)。在Win32中稱基地址為Hintance,似乎有些混淆,因為Instance Handle一詞來源於16為的Windows 3.1,其中每一個執行執行個體都有自己的資料區段,依此來互相區分,這就是Instance Handle的來曆。在Win32中,以為不存在共用地址空間,所以已用程式無需加以區別。當然,Win16和Win32中的Hinstance還有些聯絡:在Win32中可以直接調用GetModuleHandle以取得指向DLL的指標,通過指標訪問該DLL Module的內容。
我們還需要知道PE檔案中“section”(塊)。在PE檔案中section大致相當於NE格式中的段或資源。塊中包含代碼或資料,與段不同的是,塊沒有大小限制,是一個連續記憶體塊。有些塊中包含程式中聲明及直接使用的代碼和資料,而另外一些資料區塊由連接器或庫管理程式產生,包含對*作系統極其重要的資訊。有人把section稱為object,但object具有太多的意義。

PE可執行檔的邏輯結構是段,比如程式碼片段“.text”、資料區段“.data”、資源段“.rscs”等等。這些段大小都是按檔案對齊,也就是說段大小 至少會按10h對齊,一般是1000h(4096位元組),這由檔案頭中指定(連結的時候確定)。但是代碼也好資料也好,不可能做到長度剛好是對齊的。也就是說,段的大小是大於段 中代碼或資料實際大小的。他們之間的差值就是該段冗餘的空間,這個空間被稱為“空隙”。
//--------------------------------------
SFlags     DD        ? ; 塊屬性  
該欄位是一組指出塊屬性(如代碼/資料/可讀/可寫等等)的標誌。比較重要的標誌如下:
00000020h該塊包含代碼,通常與可執行標誌(10000000h)一起設定。
00000040h該塊包含已初始化的資料。
00000080h該塊包含未初始化的資料。
02000000h該塊可被丟棄,因為它一旦被裝入後,進程就不再需要它了。常見的可丟棄的是.reloc(重定位塊)
10000000h 該塊為共用塊
20000000h該塊可以執行。通常當00000020h標誌被設定時,該標誌也被設定。
40000000h 該塊可讀。可執行檔中的塊總是設定該標誌。
80000000h該塊可寫。如果可執行檔沒有設定該標誌,裝載程式就會將記憶體映像頁標記為可讀或可執行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.