日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图解PE文件实例研究

發布時間:2025/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解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文件实例研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。