PE解析器的編寫(三) 區塊表的解析

2022-06-24 19:15:12 字數 2332 閱讀 3743

pe檔案中所有節的屬性都被定義在節表中,節表由一系列的image_section_header結構排列而成,每個結構用來描述乙個節,結構的排列順序和它們描述的節在檔案中的排列順序是一致的。

具有相同屬性的資料被安排到同乙個區塊中。

區塊表的結構為image_section_header,在pe檔案中存在乙個該結構的陣列,用來儲存各個區塊的資訊,這個陣列的大小在pe頭的結構 image_nt_headers 的成員numberofsections描述。

區塊表結構image_section_header結構如下:

typedef

struct _image_section_header

misc;

dword virtualaddress; // 節區的 rva 位址

dword sizeofrawdata; // 在檔案中對齊後的尺寸

dword pointertorawdata; // 在檔案中的偏移量

dword pointertorelocations; // 在obj檔案中使用,重定位的偏移

dword pointertolinenumbers; // 行號表的偏移(供除錯使用地)

word numberofrelocations; // 在obj檔案中使用,重定位項數目

word numberoflinenumbers; // 行號表中行號的數目

dword characteristics; // 節屬性如可讀,可寫,可執行等

} image_section_header, *pimage_section_header;

在程式中我們主要列出了,區塊名稱、rva、在進行記憶體對齊後的尺寸,在磁碟中的大小,在檔案中的偏移,節屬性。

在介面中,定義了乙個listctrl來顯示這些資訊。

在cpefileinfo類中定義了乙個vector m_sectiontable;專門用來儲存區塊表的屬性資訊。獲取這個資訊。

在這個類中與區塊表有關的函式主要有兩個:

getsectionheader : 用來獲取指向表的指標

initsectiontable:初始化上面定義的結構

下面來一一說明這兩個函式

pimage_section_header cpefileinfo::getsectionheader()

pimage_optional_header poptionheader = getoptionalheader();

psectionheader = (pimage_section_header)((dword)(poptionheader) + pfileheader->sizeofoptionalheader);

return psectionheader;

// pimage_nt_headers pntheader = getntheaders();

// return (pimage_section_header)((dword)pntheader + sizeof(image_nt_headers));

}

在pe檔案中區塊表的屬性資訊是緊密排列在pe頭結構後面的,所以我們只要知道optionheader結構的指標,然後加上這個結構的大小就可以獲取到區塊表的位址,上面的**也是這樣做的,首先獲取了fileheader的指標,這個結構中的sizeofoptionalheader定義了optionheader這個結構的大小,我們利用fileheader + sizeofoptionalheader這樣就偏移到了區塊表所在的位置。

或者更簡單的方式是利用pe檔案頭的位址 + 檔案頭的大小也一樣可以獲取到區塊表的位址

void cpefileinfo::initsectiontable()

pimage_section_header psectionheader = getsectionheader();

pimage_file_header pfileheader = getfileheader();

if (null != psectionheader && null != pfileheader)

}}

後面就是迴圈遍歷將所有資訊寫入m_sectiontable這個動態陣列中。在這份**中我們首先利用fileheader的numberofsections成員獲取區塊表的個數,然後在迴圈中以這個個數作為條件,以此往後定址,將資訊寫入到對應的陣列中,最後在輸出的時候只需要根據需求輸出我們感興趣的內容即可

PE解析器的編寫(三) 區塊表的解析

pe檔案中所有節的屬性都被定義在節表中,節表由一系列的image section header結構排列而成,每個結構用來描述乙個節,結構的排列順序和它們描述的節在檔案中的排列順序是一致的。具有相同屬性的資料被安排到同乙個區塊中。區塊表的結構為image section header,在pe檔案中存在...

PE解析器的編寫(一) 總體說明

之前自己學習了pe檔案的格式,後來自己寫了個pe檔案的解析器,這段時間工作上剛好要用到它,老闆需要能檢視某個exe中載入的dll的乙個工具,我在使用之前自己寫的這個東西的時候,發現很多東西都忘記了,所以,我在這回顧下當時的思路,並記錄下來,方便以後直接使用。也算是回顧下之前學習的內容,將學的東西學以...

編寫簡單的shell命令解析器

編寫簡單的shell命令解析器 環境 redhat 9.0 核心 2.4.20 vi 文書編輯器 6.1.320 gcc 3.2.2 5 實現步驟 第0步 寫乙個最簡單的shell命令直譯器,本程式取自apue例1 5,命令不能帶引數。需要完成的內容如下 命令直譯器首先是乙個死迴圈。列印乙個命令提示...