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