關於PE可執行檔案的修改 2

2021-04-15 17:00:43 字數 2231 閱讀 4615

我們將用「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該塊可寫。如果可執行檔案沒有設定該標誌,裝載程式就會將記憶體映像頁標記為可讀或可執行。 

修改可執行檔案中的資源

修改可執行檔案中的資源 使用過軟體的讀者都知道,軟體一般都有很多種語言,對於一些英文軟體需要將其漢化後才能夠使用,這個漢化的過程就是修改可執行檔案中的資源的過程。對於乙個可執行檔案來說,可以利用visual c 以資源的方式開啟,開啟以後使用者可以修改可執行檔案的各種資源,使用這種方法可以非常方便地...

linux 執行可執行檔案

1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...

Linux的可執行檔案

linux的可執行檔案 用ls f命令,後買帶 的就是可執行檔案。linux下,當你使用.執行乙個程式時,首先是shell來接管你的輸入,然後用fork派生子程序,最後用execv系列將你的那個程式的 交給核心 1。檢查你執行的檔案的屬性,其屬性在它的i節點中描述,如果你的那個檔案不是可執行的屬性,...