參考專案:
參考:va是記憶體中的真實的虛擬位址值;
rva是va相對於imagebase的相對偏移;
而file offset就是在pe映像檔案中相對於檔案開始處的偏移。
pe檔案的布局與最終載入到記憶體中的布局是不完全相同的,主要是因為有一些對齊的要求。
在載入到記憶體時,粒度是section,也就是說乙個section裡面的內容會被載入到記憶體中連續的一片區域。
因此,在乙個section內部,所有內容的rva/va/file offset是遵循相同的函式關係的。
這個函式關係的資訊,是儲存在pe檔案的section header結構中的。
pe內部的位址都是以rva形式儲存的,從rva轉換到va很簡單,只需要獲取到pe載入到記憶體中的imagebase。
雖然pe頭部也會指定其「鍾意」的基位址,但是很有可能最終沒有被載入到這裡。
從rva到file offset的轉換就是與具體的section相關的了。
pe bliss對於rva到file offset的轉換**如下:
uint32_t pe_base::rva_to_file_offset(uint32_t rva) const
因為乙個section裡的內容的file offset與rva之間的偏移關係是相同的,即
即將b選取為這個section的頭部,而a是該section中的任意一點,那麼a.offset就可以通過上面的公式求出。
匯入表揭示了pe檔案對於其他pe檔案的依賴關係。
當乙個pe檔案需要使用其他pe檔案定義的函式或者變數時,需要知道這些內容在記憶體中的具體載入位址。
這個資訊是在鏈結過程中寫入到pe檔案中,要保證這個資訊的正確,必須對依賴的那些pe檔案的布局有了解,這也是為什麼乙個pe檔案在鏈結時,需要指明它所依賴的其他pe檔案的lib檔案,因為lib檔案就提供了這些相對位置的資訊。
這些相對位置,其實就是函式或者變數在其他pe檔案中的rva。
因為pe真正關心的是當它自己被拉起來執行時,它需要的內容要到記憶體中的哪個位置去找,而不是要到檔案中的哪個位置去找。因此它關心其實是va,而一旦相關映像被載入到記憶體中了,那麼它們的imagebase也就確定了,所以知道了rva,就知道了va。
PE 檔案基礎知識
本文章內容大部分來自於對 0day安全 軟體漏洞分析技術 第二版 的整理 pe 檔案是 windows 可執行檔案的格式,pe 檔案按照一定的規定,將 資料 程式定義的變數和常量 程式資源 等 按照一定的格式儲存在乙個檔案中,方便系統執行程式的時候將 載入到記憶體中。如果沒有這種規定的格式,程式在記...
PE檔案詳解之PE檔案頭
1,pe檔案頭 pe header 緊挨著 dos stub 2,pe header 是pe相關結構nt映像頭 image nt header 的簡稱。裡面包含著許多pe裝載器用到的重要字段。3,執行體在支援pe檔案結構的作業系統中執行時,pe裝載器將從 image dos header 結構中的 ...
PE檔案詳解之PE檔案頭
1,pe檔案頭 pe header 緊挨著 dos stub 2,pe header 是pe相關結構nt映像頭 image nt header 的簡稱。裡面包含著許多pe裝載器用到的重要字段。3,執行體在支援pe檔案結構的作業系統中執行時,pe裝載器將從 image dos header 結構中的 ...