從下面依次網上看.可以得出pe結構
其中dos頭有dos頭結構 也就是 image_dos_header
關於結構體的各項屬性.前邊已經寫過了.本系列部落格就是加深pe印象.理解複雜的原理.
image_dos_header 大小 64個位元組 十六進製制 0x40位元組
image_file_header 大小 20個位元組 十六進製制 0x14位元組
iamge_optional_header 224個位元組 十六進製制 0xe0
image_section_header 40個位元組 十六進製制 0x28
根據上面得到dos頭所占用大小是0x40. 也就是說乙個按照16進製為一行的pe檔案.4行正好就是乙個dos頭大小.
例如: 使用winhex檢視.
dos結構體重要的成員就兩個.
1.mz頭
2.指向pe偏移.
mz頭就是標出來的 4d 5a 大小是兩個位元組. 作業系統會以檢查這個標識.判斷是否是pe檔案.
pe偏移 0x00000138 大小是4個位元組.指向pe頭. nt頭中的pe標識.作業系統不光檢查mz 也檢查pe.
dos stub 大小是不確定的,他的大小是 pe頭減掉 dos頭大小.其中成員都是dos stub.
根據我們檔案頭大小. 0x14 大小.那麼pe後面就是檔案頭
我們的擴充套件頭很大.32位64不一樣.我們檔案頭下面就是這個擴充套件頭.
注意,我們這個頭的大小也在檔案頭中儲存著. 我們可以更改的.如果更改.那麼我們的擴充套件頭就要更改.
例如檔案頭中儲存著擴充套件頭大小
而檔案頭下面的這些成員都是擴充套件頭
節表是很重要的.我們真正的資料就是存在節表裡面.
節表大小 十進位制 40個位元組,十六進製制 0x28
可以看出節表大小. 裡面第乙個是text節.第二個是rdata節...
在我們的擴充套件頭中.有乙個成員是記錄著 dos頭 + nt頭(檔案+擴充套件 在一起稱為nt) + 節表的大小. 按照檔案對齊存放著.
sizeofheaders 按照檔案對齊.儲存著 頭+ 節表的大小.
filealignment 是擴充套件頭中的檔案對齊值.
具體屬性後面會詳解.
我們的節表存放著節資料的資訊.比如節在**開始.資料在**存放. 而我們的 頭+ 節表 按照檔案對齊過後.下面就是節資料了.
例如:
填寫aaaa的地方是對其後沒有使用的.所以我們如果熟悉pe可以新增任何成員進去.
根據上面簡單了介紹了一下pe的儲存結構.也知道了節資料跟節資料之間.都是根據檔案對齊存放的.
但是我們的pe是可以執行的.(exe. dll也是.sys也是...這裡指exe) 所以在記憶體中狀態也會改變.也就是偏移會改變.
例如下圖:
在檔案中我們的對齊是按照 0x200存放的. 而在記憶體中就是按照0x1000.假設是1000. 多餘的地方補0
我們 的dos頭 + nt頭 + 節表.按照檔案對齊之後存放著. 節的資料是從400開始.也就是上圖.
但是在記憶體中就不一樣了. 如果按照0x1000對齊.那麼在記憶體中就是1000位置開始是節資料了.
首先記憶體中的位置不一樣
pe中 dos頭 + nt頭 + 節表. 不管記憶體中還是檔案中成員都是一樣的.而因為對齊值不同.節資料開始位置也不同.
因為乙個在檔案中存放.乙個在記憶體中展開.
比如我們在檔案中 偏移 0x400位置.是節資料.在記憶體中就不會有了.
如下圖所示:
因為記憶體是按照0x1000進行對齊的 對齊方式0x1000也會有成員儲存著.下面幾講複習的時候會講到.
所以在記憶體中1000偏移位置才是節資料.如下圖
pe分為檔案狀態.跟記憶體狀態.
檔案狀態下. 根據擴充套件頭下面的檔案對齊值. 以及記錄對其頭的大小進行存放的.
記憶體狀態下.根據擴充套件頭中記憶體對齊值.以及對其頭大小進行存放的.
比如:檔案對齊值為0x200 dos頭 + nt頭 + 節表 = 0x301大小. 但是檔案對齊值是200.比如要整除200. 所以 對齊頭打下不是0x301. 而是 0x400. 也就是0x400位置存放的是節資料.
記憶體同上.只不過對齊值不同.
PE知識複習之PE的節表
確定節表位置 dos nt頭下面就是節表.確定節表數量 節表數量在檔案頭中存放著.可以準確知道節表有多少個.節表是乙個結構體陣列.沒乙個節表表示了資料在哪,怎麼儲存.下方是節的結構體 typedef struct image section header misc dword virtualaddr...
2021 01 11 PE檔案的兩種狀態
pe檔案靜態 不執行 和動態 執行 是有差異的。結構體大小 十進位制 image dos header 64位元組 dos stub 注意這個不是結構體,只是為了方便寫在這裡 不確定 鏈結器插入的資料,可以修改 刪除,不影響程式執行 image file header 20位元組 image opt...
整理 狀態機的兩種寫法對比
狀態機可以用兩種方法實現 豎著寫 在狀態中判斷事件 和橫著寫 在事件中判斷狀態 這兩種實現在本質上是完全等效的,但在實際操作中,效果卻截然不同。豎著寫 在狀態中判斷事件 c 片段 cur state nxt state switch cur state else if e1 event else i...