pe 檔案是一種格式 :dos頭 pe頭 區塊 這些組成了pe檔案
傳送門:c++**解析dos頭和nt頭
指某一種格式的檔案
,可執行檔案 exe 動態鏈結庫(dll)驅動檔案(sys) 都是pe檔案格式
dos頭部
為了相容dos程式設計
nt頭部
儲存pe檔案的全部屬性,初始資訊化等
區段頭表
對於pe檔案主體屬性的分段描述,個數不定
各個區段
pe檔案的主題,分段儲存著可執行**,各個資料資源等
在dos頭中 有用的只有 e_mageic來比對此檔案是否位 pe檔案 而 e_lfanew用來指向nt頭的偏移
4d 5a 是在檔案的儲存方式 ,而在記憶體中儲存的方式小端 為 5a 4d 對應ascii碼 z m,而 00 01 00 00 對應結構體裡的 e_lfnew ,指向的是 nt頭的檔案偏移
然後做乙個小實驗,除了標識和e_lfnew全部歸0
發現還是可以執行的
繼續把標誌也給擦除
這時候圖示就變了,檔案閃退,(太快了沒辦法截圖 大家可以自己試一下)
所以windows,分別是否是可執行程式,就是讀取了pe結構的資訊。一些隱寫,就是利用了字段的無用或者是檔案對齊的填充在其中覆蓋自己的資料,達到了不影響檔案大小的前提下 對檔案修改
nt 頭儲存著pe頭的全部屬性
在有些時候 可以利用dos頭距離nt頭的空間(因為這些資料存在的意義不大),可以將nt頭重疊到dos塊中
和dos中的e_magic 一樣 判斷是否是pe檔案
如上圖 50 45 對應 ascii 中 的pe
一共20個位元組
按照c++中的可以對應
word = 2位元組 dword = 4位元組
檔案頭沒有什麼說的,這裡有個sizeofoptionalheader 變數指的是optional_handle頭的大小
敲黑板:擴充套件儲存著非常有用的資訊 可以在裡面找到非常有用的資訊
資料目錄表在下面
imagebase預設的載入位址(預設400000位址上!但是每個程式都會爭搶這個位址所以會發生重定位,很大概率會載入到別的位址上)
addressofentrypoint
程式開始執行的相對虛擬位址
imagebase
預設載入位址(未載入發生重定位
sectionalignment
塊對其,對映到記憶體中的區段對齊,必須大於檔案對其書 0x1000
filealignment
檔案對其數,就是在硬碟中的檔案區段對齊。0x200
sizeofimage
資料夾在記憶體,所需要的記憶體大小 ,對齊後的
sizeifheader
所有頭部大小,檔案主體相對檔案起始發生偏移 dos nt + 區段
下面是幾個常用的表:
匯出表:提供的函式,可以供別的程式呼叫【exe檔案中很少有匯出表的,大多數dll都有匯出表,某些存放資源檔案的dll就沒有匯出表】
匯入表:記錄了乙個exe或者乙個dll所用到的其他模組匯出的函式
資源表:windows程式的各種介面稱為資源,包括加速鍵,位圖,游標,對話方塊,圖示,選單,串表,工具欄和版本資訊等。
資源對於可執行檔案而言是乙個非常重要的存在,例如乙個視窗,乙個選單都是一項資源資訊,在pe檔案的所有結構中。
重定位表
生成程式的時候,很多涉及到位址的**,都使用乙個絕對的虛擬記憶體位址(這個虛擬記憶體位址是假設程式載入到0x400000的地方時才能夠使用的),但是當程式的載入基址產生變化的時候,載入基址和預設的載入基址就不一樣了,那些涉及到位址的**就不能執行了,此時就需要將那些涉及到位址的**,把他們的運算元修改(去掉預設載入基址,再加上新的載入基址)才能夠使程式執行起來。而重定位表就是記錄了重定位之後的資訊
暫時介紹這麼幾個表後續會更新
詳解PE檔案
筆者在某安全公司實習,第一天被要求了解pe結構,好吧,因為基礎不紮實,經過一天的時間了解的啥都不是,受到了導師的特殊關照,推薦了我一本沒推薦給別人的書 windows32位匯程式設計序 羅雲彬著 嘿嘿,匿名感謝導師,清明三天的pe之旅。1.1pe檔案的結構 pe就是在windows下最常用的可執行檔...
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 結構中的 ...