PE文件到内存的映射学习总结
生活随笔
收集整理的這篇文章主要介紹了
PE文件到内存的映射学习总结
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
PE文件到內(nèi)存的映射
http://www.cnblogs.com/qintangtao/archive/2013/01/28/2880606.html在執(zhí)行一個(gè)PE文件的時(shí)候,windows 并不在一開(kāi)始就將整個(gè)文件讀入內(nèi)存的,二十采用與內(nèi)存映射文件類似的機(jī)制。也就是說(shuō),windows 裝載器在裝載的時(shí)候僅僅建立好虛擬地址和PE文件之間的映射關(guān)系。
當(dāng)且僅當(dāng)真正執(zhí)行到某個(gè)內(nèi)存頁(yè)中的指令或者訪問(wèn)某一頁(yè)中的數(shù)據(jù)時(shí),這個(gè)頁(yè)面才會(huì)被從磁盤提交到物理內(nèi)存,這種機(jī)制使文件裝入的速度和文件大小沒(méi)有太大的關(guān)系。
但是要注意的是,系統(tǒng)裝載可執(zhí)行文件的方法又不完全等同于內(nèi)存映射文件。
當(dāng)使用內(nèi)存映射文件的時(shí)候,系統(tǒng)對(duì)“原著”相當(dāng)忠實(shí),如果將磁盤文件和內(nèi)存映像比較的話,可以發(fā)現(xiàn)不管是數(shù)據(jù)本身還是數(shù)據(jù)之間的相對(duì)位置它丫丫的都是完全相同的。
而我們知道,在裝載可執(zhí)行文件的時(shí)候,有些數(shù)據(jù)在裝入前會(huì)被預(yù)處理,如重定位等,正因此,裝入以后,數(shù)據(jù)之間的相對(duì)位置可能發(fā)生微妙的變化。
Windows 裝載器在裝載DOS部分、PE文件頭部分和節(jié)表(區(qū)塊表)部分是不進(jìn)行任何特殊處理的,而在裝載節(jié)(區(qū)塊)的時(shí)候則會(huì)自動(dòng)按節(jié)(區(qū)塊)的屬性做不同的處理。
一般情況下,它會(huì)處理以下幾個(gè)方面的內(nèi)容:
內(nèi)存頁(yè)的屬性;
節(jié)的偏移地址;
節(jié)的尺寸;
不進(jìn)行映射的節(jié)。
內(nèi)存頁(yè)的屬性:
對(duì)于磁盤映射文件來(lái)說(shuō),所有的頁(yè)都是按照磁盤映射文件函數(shù)指定的屬性設(shè)置的。但是在裝載可執(zhí)行文件時(shí),與節(jié)對(duì)應(yīng)的內(nèi)存頁(yè)屬性要按照節(jié)的屬性來(lái)設(shè)置。所以,在同屬于一個(gè)模塊的內(nèi)存
頁(yè)中,從不同節(jié)映射過(guò)來(lái)的的內(nèi)存頁(yè)的屬性是不同的。
節(jié)的偏移地址:
節(jié)的起始地址在磁盤文件中是按照 IMAGE_OPTIONAL_HEADER32 結(jié)構(gòu)的 FileAlignment 字段的值進(jìn)行對(duì)齊的,而當(dāng)被加載到內(nèi)存中時(shí)是按照同一結(jié)構(gòu)中的 SectionAlignment 字段的值對(duì)其的
,兩者的值可能不同,所以一個(gè)節(jié)被裝入內(nèi)存后相對(duì)于文件頭的偏移和在磁盤文件中的偏移可能是不同的。
注意,節(jié)事實(shí)上就是相同屬性數(shù)據(jù)的組合!當(dāng)節(jié)被裝入到內(nèi)存中的時(shí)候,相同一個(gè)節(jié)所對(duì)應(yīng)的內(nèi)存頁(yè)都將被賦予相同的頁(yè)屬性, 事實(shí)上,Windows 系統(tǒng)對(duì)內(nèi)存屬性的設(shè)置是以頁(yè)為單位進(jìn)行的
,所以節(jié)在內(nèi)存中的對(duì)齊單位必須至少是一個(gè)頁(yè)的大小。(小甲魚溫馨提示:對(duì)于32位操作系統(tǒng)來(lái)說(shuō),這個(gè)值一般是4KB==1000H; 對(duì)于64位操作系統(tǒng)這個(gè)值一般是8KB==2000H)
在磁盤中就沒(méi)有這個(gè)**,因?yàn)樵诖疟P中排放是以什么為主?肯定是以空間為主導(dǎo),在磁盤只是存放,不是使用,所以不用設(shè)置那么詳細(xì)的屬性。試想想看,如果在磁盤中都是以4KB為大小對(duì)齊
的話,不夠就用0來(lái)填充,那么一個(gè)只占20字節(jié)的數(shù)據(jù)就要消耗4KB的空間來(lái)存放,是不是浪費(fèi)?有木有??
節(jié)的尺寸:
對(duì)節(jié)的尺寸的處理主要分為兩個(gè)方面:
第一個(gè)方面,正如剛剛我們所講的,由于磁盤映像和內(nèi)存映像中節(jié)對(duì)齊存儲(chǔ)單位的不同而導(dǎo)致了長(zhǎng)度擴(kuò)展不同(填充的0數(shù)量不同嘛~);
第二個(gè)方面,是對(duì)于包含未初始化數(shù)據(jù)的節(jié)的處理問(wèn)題。既然是未初始化,那么沒(méi)有必要為其在磁盤中浪費(fèi)空間資源,但在內(nèi)存中不同,因?yàn)槌绦蛞贿\(yùn)行,之前未初始化的數(shù)據(jù)便有可能要被
賦值初始化,那么就必須為他們留下空間。
不進(jìn)行映射的節(jié):
有些節(jié)并不需要被映射到內(nèi)存中,例如.reloc節(jié),重定位數(shù)據(jù)對(duì)于文件的執(zhí)行代碼來(lái)說(shuō)是透明的,無(wú)作用的,它只是提供Windows 裝載器使用,執(zhí)行代碼根本不會(huì)去訪問(wèn)到它們,所以沒(méi)有必
要將他們映射到物理內(nèi)存中。
========
PE文件與虛擬內(nèi)存之間的映射
http://blog.chinaunix.net/uid-26898698-id-3181820.html文件偏移:靜態(tài)反匯編工具看到的PE文件中某條指令的位置是相對(duì)于磁盤文件的。IDA Pro雖然是靜態(tài)反匯編工具,不過(guò)出來(lái)的是VA。
文件偏移地址(File Offset):數(shù)據(jù)在PE文件中的地址,是文件在磁盤上存放時(shí)想對(duì)于文件開(kāi)頭的偏移。
裝載基址(Image Base):PE文件裝入內(nèi)存的 基地址。默認(rèn)情況下,EXE文件的基址為0x00400000,DLL文件的基址為0x10000000。
虛擬內(nèi)存地址(VA):PE文件中的指令被裝入內(nèi)存后的地址,OllyDbg動(dòng)態(tài)反匯編產(chǎn)生。
相對(duì)虛擬地址(RVA):內(nèi)存地址相對(duì)與映射基址的偏移量。
VA = Image Base + RVA。
PE文件中的數(shù)據(jù)按照磁盤數(shù)據(jù)標(biāo)準(zhǔn)存放,以0x200字節(jié)為基本單位進(jìn)行組織。 代碼裝入內(nèi)存后,將按照內(nèi)存數(shù)據(jù)標(biāo)準(zhǔn)存放,以0x1000字節(jié)為基本單位進(jìn)行組織。
========
總結(jié)
以上是生活随笔為你收集整理的PE文件到内存的映射学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Fiddler 环境和过滤规则详解
- 下一篇: 创建和准备Oracle样例数据库