【Windows 小知識】PE Section 大小
我們今天就來看這個 PE 的 Section 中 Raw Size 和 Virtual Size 的差別。
你可能會發現說大部分 Raw Size 會比 Virtual Size 還要大,這是為什麼呢?
要理解這一點,我們要先理解 Alignment 的概念。
每當系統在分配記憶體的時候,都需要進行 Alignment,確保記憶體位址是某個數值的倍數,這樣做不僅可以避免掉不少的麻煩,也讓記憶體管理變得更加簡單且直覺。
PE 的 Optional Header 中有定義兩種 Alignment
- File Alignment: Raw Size 對齊的大小,預設是 0x200
- Section Alignment: Virtual Size 對齊大小,預設是 0x1000
因此,回來看 Section 的大小會發現,PE 裡面寫的 Raw Size 其實是已經經過 File Alignment 處理過的大小,都是 0x200 的倍數。而 Virtual Size 是原始沒有進行 Section Alignment 處理的大小。
舉個上面那張圖的例子來看,程式跑起來的時候,.rdata
實際在記憶體中分配的大小是 0x2000
(0x1242
進行 Section Alignment 對齊 0x1000 完的結果),所以 .rdata 在記憶體的實際大小反而是比 Raw Size 大,而這些多出來的空間其實就是駭客最喜歡放 shellcode 的風水寶地啦xD
【Windows 小知識】PE Section 大小