本文章內容大部分來自於對《0day安全:軟體漏洞分析技術(第二版)》的整理pe 檔案是 windows 可執行檔案的格式,pe 檔案按照一定的規定,將**,資料(程式定義的變數和常量),程式資源(等)按照一定的格式儲存在乙個檔案中,方便系統執行程式的時候將**載入到記憶體中。如果沒有這種規定的格式,程式在記憶體中的載入將會相當混亂,計算機系統將很難對程式進行管理。
pe 將程式中的不同的部分分成若干個資料節,**和資料等分別儲存在不同的節中。乙個標準的的pe檔案的格式如下:
windows 的記憶體可以分成兩個層面:物理記憶體和虛擬記憶體。物理記憶體較為複雜,需要進入 windows 核心級別 ring0 才能看到。
intel的x86處理器是通過ring級別來進行訪問控制的,級別共分4層,ring0, ring1, ring2, ring3。windows 只使用其中的兩個級別ring0 和 ring3。ring0 層擁有最高的許可權,ring3 層擁有最低的許可權。所以在使用者模式下,我們用偵錯程式看到的記憶體位址都是虛擬記憶體。
windows 讓所有的程序都「相信」自己擁有獨立的 4gb 記憶體(32位計算機),但是實際的物理記憶體可能只有 512 mb,所以為了讓所有記憶體中的程式都有呼叫 4gb 記憶體的能力,windows 的程式設計師設計了虛擬記憶體管理器
雖然每個記憶體中的程式(也就是程序)能排程 4gb的記憶體,但是由於本身乙個程式並不會時時刻刻使用全部的 4gb 記憶體,所以只要將記憶體合理調配,物理記憶體是可以存下全部的程序的。就像乙個銀行可能本身擁有的鈔票會小於所有使用者的賬戶上的鈔票,但是銀行仍然能夠正常運轉。
1. 檔案偏移位址(file offset)
資料在 pe 檔案中的位址叫檔案偏移位址,這個位址是檔案在硬碟上存放時相對於檔案開頭的偏移
2. 裝載位址(image base)
pe 檔案裝入記憶體時的基位址。預設情況下,exe 檔案在記憶體中的基位址是 0x00400000,dll 檔案是 0x10000000。這些位置可以通過修改編譯選項修改
3. 虛擬記憶體位址(virtual address,va)
pe 檔案裝入記憶體時的位址
4. 相對虛擬位址(relative virtual address,rva)
相對虛擬位址是記憶體位址相對於裝載位址的偏移量。
有下列關係:
\[va = image \ base +rva
\]由於作業系統在進行程式裝載時「基本」上保持 pe 中的各種資料結構,所以檔案偏移位址和 rva 有很大的一致性,但是仍然有細微的區別。
由於這個區別,所以在程序載入記憶體後,每個 pe 節的起始位置會發生變化。但是每節內資料仍然按照原來的方式排列。
PE檔案基礎
參考專案 參考 va是記憶體中的真實的虛擬位址值 rva是va相對於imagebase的相對偏移 而file offset就是在pe映像檔案中相對於檔案開始處的偏移。pe檔案的布局與最終載入到記憶體中的布局是不完全相同的,主要是因為有一些對齊的要求。在載入到記憶體時,粒度是section,也就是說乙...
檔案上傳基礎知識
在http協議資訊頭中,用content type來表示請求和響應中的 型別資訊,用來告訴伺服器端如何處理請求的處理 以及 告訴客戶端如何解析響應的資料 content type type subtype parameter type 主型別 subtype 子型別 parameter 可選引數 例...
python基礎知識 檔案操作
檔案操作 1.開啟檔案 唯讀 open nn r encoding utf 8 清空內容寫檔案 open nn w,encoding utf 8 檔案存在報錯,不存在,建立並寫檔案 open nn x encoding utf 8 追加 open nn a encoding utf 8 若開啟方式帶...