趁熱打鐵,今天開始對塊的學習。
塊最重要的結構體是:_image_section_header 。
pe檔案中所有節的屬性都被定義在節表中,節表由一系列的
image_section_header
結構排列而成,每個結構用來描述乙個節,結構的排列順序和它們描述的節在檔案中的排列順序是一致的。
節表總是被存放在緊接在pe檔案頭的地方;
節表中image_section_header
結構的總數總是由pe檔案頭
image_nt_headers
結構中的
fileheader.numberofsections
欄位來指定的。
此結構體大小為40位元組.
[cpp]
view plain
copy
typedef
struct
_image_section_header
misc;
+ch dword
virtualaddress;
// 節區的 rva 位址
+10h dword
sizeofrawdata;
// 在檔案中對齊後的尺寸
+14h dword
pointertorawdata;
// 在檔案中的偏移量
+18h dword
pointertorelocations;
// 在obj檔案中使用,重定位的偏移
+1ch dword
pointertolinenumbers;
// 行號表的偏移(供除錯使用地)
+1eh word
numberofrelocations;
// 在obj檔案中使用,重定位項數目
+20h word
numberoflinenumbers;
// 行號表中行號的數目
+24h dword
characteristics;
// 節屬性如可讀,可寫,可執行等} image_section_header, *pimage_section_header;
}
重要引數詳解:
name:區塊名。這是乙個由8位的ascii 碼名,用來定義區塊的名稱。多數區塊名都習慣性以乙個「.」作為開頭(例如:.text),這個「.」 實際上是不是必須的。值得我們注意的是:如果區塊名超過 8 個位元組,則沒有最後的終止標誌「null」 位元組,並且前邊帶有乙個「$」 的區塊名字會從聯結器那裡得到特殊的待遇,前邊帶有「$」 的相同名字的區塊在載入時候將會被合併,在合併之後的區塊中,他們是按照「$」 後邊的字元的字母順序進行合併的。另外,每個區塊的名稱都是唯一的,不能有同名的兩個區塊。但事實上節的名稱不代表任何含義,它的存在僅僅是為了正規統一程式設計的時候方便程式設計師檢視方便而設定的乙個標記而已。所以將包含**的區塊命名為「.data」 或者說將包含資料的區塊命名為「.code」 都是合法的。當我們要從pe 檔案中讀取需要的區塊時候,不能以區塊的名稱作為定位的標準和依據,正確的方法是按照
image_optional_header32
結構中的資料目錄字段結合進行定位。
virtual size:該區塊表對應的區塊的大小,這是區塊的資料在沒有進行對齊處理前的實際大小。
virtual address
:該區塊裝載到記憶體中的rva 位址。這個位址是按照記憶體頁來對齊的,因此它的數值總是
sectionalignment
的值的整數倍。在microsoft 工具中,第乙個快的預設 rva 總為
1000h
。在obj 中,該欄位沒有意義地,並被設為0。
sizeofrawdata
:該區塊在磁碟中所佔的大小。在可執行檔案中,該字段是已經被
filealignment
潛規則處理過的長度。
pointertorawdata
:該區塊在
磁碟中的偏移。這個數值是從檔案頭開始算起的偏移量。
pointertorelocations
:在exe檔案中沒有意義,在obj 檔案中,表示本區塊重定位資訊的偏移值。(在obj 檔案中如果不是零,它會指向乙個image_relocation 結構的陣列)。
pointertolinenumbers
:行號表在檔案中的偏移值,檔案的除錯資訊。
numberofrelocations
:在exe檔案中也沒有意義,在obj 檔案中,是本區塊在重定位表中的重定位數目來著。
numberoflinenumbers
:該區塊在行號表中的行號數目。
characteristics
:該區塊的屬性。該字段是按位來指出區塊的屬性(如**/資料/可讀/可寫等)的標誌。
PE檔案詳解之區塊表
趁熱打鐵,今天開始對塊的學習。塊最重要的結構體是 image section header pe檔案中所有節的屬性都被定義在節表中,節表由一系列的 image section header 結構排列而成,每個結構用來描述乙個節,結構的排列順序和它們描述的節在檔案中的排列順序是一致的。節表總是被存放在...
PE檔案詳解五 PE詳解之輸入表(匯入表)詳解1
首先,我們知道pe 檔案中的資料被載入記憶體後根據不同頁面屬性被劃分成很多區塊 節 並有區塊表 節表 的資料來描述這些區塊。這裡我們需要注意的問題是 乙個區塊中的數 據僅僅只是由於屬性相同而放在一起,並不一定是同一種用途的內容。例如輸入表 輸出表等就有可能和唯讀常量一起被放在同乙個區塊中,因為他們的...
PE檔案詳解五 PE詳解之輸入表(匯入表)詳解1
首先,我們知道pe 檔案中的資料被載入記憶體後根據不同頁面屬性被劃分成很多區塊 節 並有區塊表 節表 的資料來描述這些區塊。這裡我們需要注意的問題是 乙個區塊中的數 據僅僅只是由於屬性相同而放在一起,並不一定是同一種用途的內容。例如輸入表 輸出表等就有可能和唯讀常量一起被放在同乙個區塊中,因為他們的...