图解PE文件实例研究
一 使用Win32匯編的PE信息查看小工具查看和研究PE文件
? ? PE信息查看工具有多種。下面先使用在《Windows PE權威指南》中所附帶的用Win32匯編編寫的PE信息查看小工具來查看PE信息。此處可下載《Windows PE權威指南》所附帶源碼:
http://pan.baidu.com/s/1o6Odgl8
? ? 該程序用Win32匯編寫成,可執行文件僅有9K,當作一個PE信息查看工具挺不錯的;
以下用上面說的peinfonor.exe打開PE文件;
1 查看一個Win32匯編寫的窗口程序,該程序有窗口和菜單;
? ? PE文件結構中區段表也稱節表,其作用相當于一本書中的目錄;此程序有四個節;.text為代碼段;.rdata為只讀數據區段;.data為可讀寫的數據段;.rsrc為資源區段。
導入了Windows自身的動態鏈接庫user32和kernel32;導入表在.rdata節;
2 打開一個純SDK所寫的窗口程序,該程序實現了簡單鍵盤鉤子功能,有菜單;
? ? 節的數量為6;.idata為導入數據區段;.reloc區段包含重定位信息;
? ? 導入表在.idata節;導入了Windows的三個核心動態庫:user32, kernel32,gdi32;
PE文件基址重定位(Base Relocation),程序編譯時每個模塊有一個優先加載地址ImageBase,這個值是連接器給出的,因此連接器生成的指令中的地址是在假設模塊被加載到ImageBase前提之下生成的,那么一旦程序沒有將模塊加載到ImageBase時,那么程序中 的指令地址就需要重新定位,例如:假設一個可執行文件,基址是0x400000,在這個image偏移0x1234處是一個指針,指向一個字符串,字符串始于實際地址0x404002處,所以指針應該是0x404002,加載文件時,由于種種原因,加載器決定把他加載到0x600000處,連接器假設的地址和實際的地址之差成為delta,上例delta為0x200000,整個位置提高了0x200000,那么字符串位置應該為0x604002,原來指向字符串的指針就錯誤了,所以要把delta加到指針值中,為了讓加載器有這樣的能力做調整,可執行文件內含許多個"基址重定位項",給那些存放指針的位置使用,加載器必須把delta加載到各個基址上。本例中應該把0x200000加給原來的指針值,0x404002,并將0x604002寫回原處。
3 打開一個VC++的簡單單文檔程序;編譯為debug版本;
? ? 節的數量為7;.textbss - 這節是和微軟Incremental Linking(增量鏈接)特性相關的;
? ? 導入了兩個MFC的DLL;
? ? 導入了Windows自帶的DLL;
? ? 很多的重定位項。
4 打開一個.Net所寫的簡單程序,一個窗口上面有幾個控件;編譯為Debug;
? ? 節的數量-3;
? ? 導入一個mscoree.dll,導入表所處節為.text;沒有其他的導入庫;這個mscoree.dll應該是和.net運行時相關的; ? ?
? ??一旦沒有MSCOREE.DLL,.net程序,就算是最簡單的Hello World也無法運行;
? ? 上述3中打開的VC所寫的程序中導入的Windows自身的三個核心動態庫所實現的功能,應該是由.Net運行時實現的。
由上述可見,實現大體相同的功能,Win32匯編所寫程序最小,SDK寫的變大,VC++寫的更大;VC++所寫除了導入Windows自身的動態庫,還導入MFC的動態庫;.Net所寫的.exe文件雖不太大,但是必須要有.Net運行時的支持;很多的功能由.Net運行時代替實現。
總結
以上是生活随笔為你收集整理的图解PE文件实例研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解使用CygWin进行Linux操作和
- 下一篇: 关于反射GetType().GetPro