PE 學習之路 區塊表

2022-08-19 20:45:13 字數 1238 閱讀 3933

在 nt 頭結束後,緊接著就是區塊表,區塊表包含每個塊在映象中的資訊,分別指向不同的區塊實體。

區塊表是乙個image_section_header結構陣列,這個結構包含區塊的資訊,比如位置、長度、屬性等,區塊的數目是由 nt 頭中的檔案頭里的numberofsections給出。以下為 `image_section_header` 結構:

在上述圖中,有兩個字段比較重要,分別為 `virtualaddress`、`pointertorawdata`,這兩個字段用於將相對虛擬位址或虛擬位址轉換為檔案偏移位址,以下為 rva 轉 foa 函式:

dword rvatofoa(dword dwrva)

}// 如果找不到就返回 -1

return -1;

}

計算公式為:`foa = va - imagebase - (所在區段的 rva - 所在區段的 foa)` 或 `foa = rva - 所在區段的 rva + 所在區段的 foa`。在上述**中,有乙個為 `image_first_section`,我們來看下它的定義,如下:

其實 `image_first_section` 為乙個巨集,它主要由三部分相加組成,作用是獲取到第乙個區段的首位址,引數為 nt 頭。你可以把這個首位址理解成陣列名,陣列的首位址。在獲取到了位址後,下面的 for 迴圈遍歷所有的區段表找到符合要求的區段。這三部分內容具體如下:

其中後兩個加起來的大小恰好就是 image_nt_headers 的大小,再跟第乙個相加就得到區段表的位址了。看到這你可以會問,為什麼不直接加上 `image_nt_headers` 的大小呢?因為 `image_optional_header32` 大小不固定,32 位下該值為 0x00e0h,64 位下該值為 0x00f0h,並且使用者還可以自定義其大小。

擴充套件頭大小是由檔案頭中 `sizeofoptionalheader` 字段給出,`field_offset` 這個是給出 `optionalheader` 在 `image_nt_headers` 結構中的偏移,如下:

(本小節完)

PE檔案詳解之區塊表

趁熱打鐵,今天開始對塊的學習。塊最重要的結構體是 image section header pe檔案中所有節的屬性都被定義在節表中,節表由一系列的 image section header 結構排列而成,每個結構用來描述乙個節,結構的排列順序和它們描述的節在檔案中的排列順序是一致的。節表總是被存放在...

PE檔案詳解之區塊表

趁熱打鐵,今天開始對塊的學習。塊最重要的結構體是 image section header pe檔案中所有節的屬性都被定義在節表中,節表由一系列的 image section header 結構排列而成,每個結構用來描述乙個節,結構的排列順序和它們描述的節在檔案中的排列順序是一致的。節表總是被存放在...

區塊鏈學習之路 持續更新

本文首發在我的個人部落格 大概1週前boss突然跟我說讓我看看 以太坊 區塊鏈 相關的技術,於是我開始進入熱火朝天的區塊鏈開發.2018年5月10日更新 另開一篇寫學習筆記好了,這一篇留著記錄問題.搭建私有鏈時碰見的問題 fatal error starting protocol stack lis...