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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PE文件到内存的映射学习总结

發布時間:2025/4/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PE文件到内存的映射学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PE文件到內存的映射

http://www.cnblogs.com/qintangtao/archive/2013/01/28/2880606.html
在執行一個PE文件的時候,windows 并不在一開始就將整個文件讀入內存的,二十采用與內存映射文件類似的機制。也就是說,windows 裝載器在裝載的時候僅僅建立好虛擬地址和PE文件之間的映射關系。
當且僅當真正執行到某個內存頁中的指令或者訪問某一頁中的數據時,這個頁面才會被從磁盤提交到物理內存,這種機制使文件裝入的速度和文件大小沒有太大的關系。


但是要注意的是,系統裝載可執行文件的方法又不完全等同于內存映射文件。
當使用內存映射文件的時候,系統對“原著”相當忠實,如果將磁盤文件和內存映像比較的話,可以發現不管是數據本身還是數據之間的相對位置它丫丫的都是完全相同的。
而我們知道,在裝載可執行文件的時候,有些數據在裝入前會被預處理,如重定位等,正因此,裝入以后,數據之間的相對位置可能發生微妙的變化。


Windows 裝載器在裝載DOS部分、PE文件頭部分和節表(區塊表)部分是不進行任何特殊處理的,而在裝載節(區塊)的時候則會自動按節(區塊)的屬性做不同的處理。
一般情況下,它會處理以下幾個方面的內容:


內存頁的屬性;
節的偏移地址;
節的尺寸;
不進行映射的節。


內存頁的屬性:


對于磁盤映射文件來說,所有的頁都是按照磁盤映射文件函數指定的屬性設置的。但是在裝載可執行文件時,與節對應的內存頁屬性要按照節的屬性來設置。所以,在同屬于一個模塊的內存


頁中,從不同節映射過來的的內存頁的屬性是不同的。


節的偏移地址:


節的起始地址在磁盤文件中是按照 IMAGE_OPTIONAL_HEADER32 結構的 FileAlignment 字段的值進行對齊的,而當被加載到內存中時是按照同一結構中的 SectionAlignment 字段的值對其的


,兩者的值可能不同,所以一個節被裝入內存后相對于文件頭的偏移和在磁盤文件中的偏移可能是不同的。


注意,節事實上就是相同屬性數據的組合!當節被裝入到內存中的時候,相同一個節所對應的內存頁都將被賦予相同的頁屬性, 事實上,Windows 系統對內存屬性的設置是以頁為單位進行的


,所以節在內存中的對齊單位必須至少是一個頁的大小。(小甲魚溫馨提示:對于32位操作系統來說,這個值一般是4KB==1000H; 對于64位操作系統這個值一般是8KB==2000H)


在磁盤中就沒有這個**,因為在磁盤中排放是以什么為主?肯定是以空間為主導,在磁盤只是存放,不是使用,所以不用設置那么詳細的屬性。試想想看,如果在磁盤中都是以4KB為大小對齊


的話,不夠就用0來填充,那么一個只占20字節的數據就要消耗4KB的空間來存放,是不是浪費?有木有??


節的尺寸:


對節的尺寸的處理主要分為兩個方面:


第一個方面,正如剛剛我們所講的,由于磁盤映像和內存映像中節對齊存儲單位的不同而導致了長度擴展不同(填充的0數量不同嘛~);


第二個方面,是對于包含未初始化數據的節的處理問題。既然是未初始化,那么沒有必要為其在磁盤中浪費空間資源,但在內存中不同,因為程序一運行,之前未初始化的數據便有可能要被


賦值初始化,那么就必須為他們留下空間。


不進行映射的節:


有些節并不需要被映射到內存中,例如.reloc節,重定位數據對于文件的執行代碼來說是透明的,無作用的,它只是提供Windows 裝載器使用,執行代碼根本不會去訪問到它們,所以沒有必


要將他們映射到物理內存中。


========

PE文件與虛擬內存之間的映射

http://blog.chinaunix.net/uid-26898698-id-3181820.html
文件偏移:靜態反匯編工具看到的PE文件中某條指令的位置是相對于磁盤文件的。IDA Pro雖然是靜態反匯編工具,不過出來的是VA。
文件偏移地址(File Offset):數據在PE文件中的地址,是文件在磁盤上存放時想對于文件開頭的偏移。
裝載基址(Image Base):PE文件裝入內存的 基地址。默認情況下,EXE文件的基址為0x00400000,DLL文件的基址為0x10000000。
虛擬內存地址(VA):PE文件中的指令被裝入內存后的地址,OllyDbg動態反匯編產生。
相對虛擬地址(RVA):內存地址相對與映射基址的偏移量。
VA = Image Base + RVA。
PE文件中的數據按照磁盤數據標準存放,以0x200字節為基本單位進行組織。 代碼裝入內存后,將按照內存數據標準存放,以0x1000字節為基本單位進行組織。
========

總結

以上是生活随笔為你收集整理的PE文件到内存的映射学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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