PE知识复习之PE的两种状态
PE知識復習之PE的兩種狀態
一丶熟悉PE的整體結構
從下面依次網上看.可以得出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頭
根據上面得到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
Dos stub 大小是不確定的,他的大小是 PE頭減掉 DOS頭大小.其中成員都是Dos stub.?
四丶確定文件頭
根據我們文件頭大小. 0x14 大小.那么PE后面就是文件頭
五丶確定擴展頭
我們的擴展頭很大.32位64不一樣.我們文件頭下面就是這個擴展頭.
注意,我們這個頭的大小也在文件頭中存儲著. 我們可以更改的.如果更改.那么我們的擴展頭就要更改.
例如文件頭中存儲著擴展頭大小
而文件頭下面的這些成員都是擴展頭
六丶節表
節表是很重要的.我們真正的數據就是存在節表里面.
節表大小 十進制 40個字節,十六進制 0x28
可以看出節表大小. 里面第一個是text節.第二個是rdata節...
在我們的擴展頭中.有一個成員是記錄著 DOS頭 + NT頭(文件+擴展 在一起稱為NT)? + 節表的大小. 按照文件對齊存放著.
sizeofHeaders 按照文件對齊.存儲著 頭+ 節表的大小.
fileAlignment 是擴展頭中的文件對齊值.?
具體屬性后面會詳解.
?
七丶節數據
我們的節表存放著節數據的信息.比如節在哪里開始.數據在哪里存放. 而我們的 頭+ 節表 按照文件對齊過后.下面就是節數據了.
例如:
填寫AAAA的地方是對其后沒有使用的.所以我們如果熟悉PE可以添加任何成員進去.
八丶PE中的兩種狀態
根據上面簡單了介紹了一下PE的存儲結構.也知道了節數據跟節數據之間.都是根據文件對齊存放的.
但是我們的PE是可以運行的.(exe. dll也是.sys也是...這里指EXE) 所以在內存中狀態也會改變.也就是偏移會改變.
例如下圖:
?
?在文件中我們的對齊是按照 0x200存放的. 而在內存中就是按照0x1000.假設是1000. 多余的地方補0
我們 的DOS頭 + NT頭 + 節表.按照文件對齊之后存放著. 節的數據是從400開始.也就是上圖.
但是在內存中就不一樣了. 如果按照0x1000對齊.那么在內存中就是1000位置開始是節數據了.
首先內存中的位置不一樣
PE中 DOS頭 + NT頭 + 節表. 不管內存中還是文件中成員都是一樣的.而因為對齊值不同.節數據開始位置也不同.
因為一個在文件中存放.一個在內存中展開.
比如我們在文件中 偏移 0x400位置.是節數據.在內存中就不會有了.
如下圖所示:
因為內存是按照0x1000進行對齊的 對齊方式0x1000也會有成員存儲著.下面幾講復習的時候會講到.
所以在內存中1000偏移位置才是節數據.如下圖
九丶總結PE中的兩種狀態.
?PE分為文件狀態.跟內存狀態.
文件狀態下. 根據擴展頭下面的文件對齊值. 以及記錄對其頭的大小進行存放的.
內存狀態下.根據擴展頭中內存對齊值.以及對其頭大小進行存放的.
比如:
文件對齊值為0x200? DOS頭 + NT頭 + 節表 = 0x301大小. 但是文件對齊值是200.比如要整除200. 所以 對齊頭打下不是0x301. 而是 0x400. 也就是0x400位置存放的是節數據.
內存同上.只不過對齊值不同.
轉載于:https://www.cnblogs.com/iBinary/p/9711028.html
總結
以上是生活随笔為你收集整理的PE知识复习之PE的两种状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过 python-xmp-toolki
- 下一篇: 面试题16: 数值的整数次方