自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

網(wǎng)絡(luò)安全編程:PE結(jié)構(gòu)的地址與地址的轉(zhuǎn)換

安全
程序在內(nèi)存中與在文件中有著不同的地址形式,而且PE相關(guān)的地址不只有這兩種形式。與PE結(jié)構(gòu)相關(guān)的地址形式有3種,且這3種地址形式可以進(jìn)行轉(zhuǎn)換。

 [[394959]]

用OD調(diào)試器調(diào)試程序時(shí)看到的地址與使用C32Asm以十六進(jìn)制形式查看程序時(shí)的地址形式有所差異。程序在內(nèi)存中與在文件中有著不同的地址形式,而且PE相關(guān)的地址不只有這兩種形式。與PE結(jié)構(gòu)相關(guān)的地址形式有3種,且這3種地址形式可以進(jìn)行轉(zhuǎn)換。

1. 與PE結(jié)構(gòu)相關(guān)的3種地址

與PE結(jié)構(gòu)相關(guān)的3種地址是VA(虛擬地址)、RVA(相對(duì)虛擬地址)和FileOffset(文件偏移地址)。

VA(虛擬地址):PE 文件映射到內(nèi)存后的地址。

RVA(相對(duì)虛擬地址):內(nèi)存地址相對(duì)于映射基地址的偏移地址。

FileOffset(文件偏移地址):相對(duì) PE 文件在磁盤上的文件開頭的偏移地址。

PE文件在磁盤上和在內(nèi)存中的結(jié)構(gòu)是一樣的。所不同的是,在磁盤上,文件是按照IMAGE_OPTIONAL_HEADER的FileAlignment值進(jìn)行對(duì)齊的。而在內(nèi)存中,映像文件是按照IMAGE_OPTIONAL_HEADER的SectionAlignment進(jìn)行對(duì)齊的。FileAlignment是以磁盤上的扇區(qū)為單位的,也就是說,F(xiàn)ileAlignment最小為512字節(jié),十六進(jìn)制的0x200字節(jié)。而SectionAlignment是以內(nèi)存分頁(yè)為單位來(lái)對(duì)齊的,通常Win32平臺(tái)一個(gè)內(nèi)存分頁(yè)為4KB,也就是十六進(jìn)制的0x1000字節(jié)。一般情況下,F(xiàn)ileAlignment的值會(huì)與SectionAlignment的值相同,這樣磁盤文件和內(nèi)存映像的結(jié)構(gòu)是完全一樣的。當(dāng)FileAlignment的值和SectionAlignment的值不相同的時(shí)候,就存在一些細(xì)微的差異了,其主要區(qū)別在于,根據(jù)對(duì)齊的實(shí)際情況而多填充了很多0值。PE文件映射如圖1所示。

圖1  PE文件映射圖

除了文件對(duì)齊與內(nèi)存對(duì)齊的差異以外,文件的起始地址從0地址開始,用C32Asm的十六進(jìn)制模式查看PE文件時(shí)起始位置是0x00000000。而在內(nèi)存中,它的起始地址為IMAGE_OPTIONAL_HEADER結(jié)構(gòu)體的ImageBase字段(該說法只針對(duì)EXE文件,DLL文件的映射地址不一定固定,但是絕對(duì)不會(huì)是0x00000000地址)。

2. 3種地址的轉(zhuǎn)換

當(dāng)FileAlignment和SectionAlignment的值不相同時(shí),磁盤文件與內(nèi)存映像的同一節(jié)表數(shù)據(jù)在磁盤和內(nèi)存中的偏移也不相同,這樣兩個(gè)偏移就發(fā)生了一個(gè)需要轉(zhuǎn)換的問題。當(dāng)知道某數(shù)據(jù)的RVA,想要在文件中讀取同樣的數(shù)據(jù)的時(shí)候,就必須將RVA轉(zhuǎn)換為FileOffset。反之,也是同樣的情況。

下面用一個(gè)例子來(lái)介紹如何進(jìn)行轉(zhuǎn)換。一個(gè)用MessageBox()輸出“Hello World”的例子程序,用PEID打開它,查看它的節(jié)表情況,如圖2所示。

圖2  PEID顯示的節(jié)表內(nèi)容

從圖2的標(biāo)題欄可以看到,這里不叫“節(jié)表”,而叫“區(qū)段”。還有別的資料上稱之為“區(qū)塊”或“節(jié)區(qū)”,只是叫法不同,內(nèi)容都是一樣的。

從圖2中可以看到,節(jié)表的第一個(gè)節(jié)區(qū)的節(jié)名稱為“.text”。通常情況下,第一個(gè)節(jié)表項(xiàng)都是代碼區(qū),入口點(diǎn)也通常落在這個(gè)節(jié)表項(xiàng)。在早期殼不流行時(shí),通過判斷入口點(diǎn)是否在第一個(gè)節(jié)區(qū)就可以判斷該程序是否被病毒感。如今,由于殼的流行,這種判斷方法就不可靠了。關(guān)鍵要看的是“R.偏移”,表明了該節(jié)區(qū)在文件中的起始位置。PE頭部包括DOS頭、PE頭和節(jié)表,通常不會(huì)超過512字節(jié),也就是說,不會(huì)超過0x200的大小。如果這個(gè)“R.偏移”為0x00001000,那么通常情況下可以確定該文件的磁盤對(duì)齊大小為0x1000。測(cè)試驗(yàn)證一下這個(gè)程序,看到“V.偏移”與“R.偏移”相同,則說明磁盤對(duì)齊與內(nèi)存對(duì)齊是一樣的,這樣就沒辦法完成演示轉(zhuǎn)換的工作了。不過,可以人為地修改文件對(duì)齊大小。也可以通過工具來(lái)修改文件對(duì)齊的大小。這里借助LordPE來(lái)修改其文件對(duì)齊大小。修改方法很簡(jiǎn)單,先將要修改的測(cè)試文件復(fù)制一份,以與修改后的文件做對(duì)比。打開LordPE,單擊“重建PE”按鈕,然后選擇剛才復(fù)制的那個(gè)測(cè)試文件,如圖3和圖4所示。

圖3  LordPE界面

圖4  重建PE功能結(jié)果

PE重建功能中有壓縮文件大小的功能,這里的壓縮也就是修改磁盤文件的對(duì)齊值,避免過多地因?qū)R而進(jìn)行補(bǔ)0,使其少占用磁盤空間。用PEID查看這個(gè)進(jìn)行重建的PE文件的節(jié)表,如圖5所示。

圖5  重建PE文件后的節(jié)表

現(xiàn)在可以看到“V.偏移”與“R.偏移”的值不相同了,它們的對(duì)齊值也不相同了,大家可以自己驗(yàn)證一下FileAlignment和SectionAlignment的值是否相同。

現(xiàn)在有兩個(gè)功能完全一樣,而且PE結(jié)構(gòu)也一樣的兩個(gè)文件了,唯一的不同就是其磁盤對(duì)齊大小不同。現(xiàn)在在這兩個(gè)程序中分別尋找一個(gè)節(jié)表中的數(shù)據(jù),學(xué)習(xí)不同地址之間的轉(zhuǎn)換。

先用OD打開未進(jìn)行重建PE結(jié)構(gòu)的測(cè)試程序,找到反匯編中調(diào)用MessageBox()處要彈出對(duì)話框的兩個(gè)字符串參數(shù)的地址,如圖6和圖7所示。

圖6  MessageBox()函數(shù)中使用的字符串地址

圖7  兩個(gè)字符串的地址在數(shù)據(jù)窗口的顯示

從圖6和圖7中可以看到,字符串“hello world !”的地址為0x00406030,字符串“hello”的地址為0x00406040。這兩個(gè)地址都是虛擬地址,也就是VA。

將VA(虛擬地址)轉(zhuǎn)換為RVA(相對(duì)虛擬地址)是很容易的,RVA(相對(duì)虛擬地址)為VA(虛擬地址)減去IMAGE_OPTIONAL_HEADER結(jié)構(gòu)體中的ImageBase(映像文件的裝載虛擬地址)字段的值,即RVA = VA – ImageBase = 0x00406030 – 0x00400000 = 0x0000 6030。由于IMAGE_OPTIONAL_HEADER中的SectionAlignment和FileAlignment的值相同,因此其FileOffset的值也為0x00006030。用C32Asm打開該文件查看文件偏移地址0x00006030處的內(nèi)容,如圖8所示。

圖8  文件偏移0x00006030處的內(nèi)容為“hello world!”字符串

從這個(gè)例子中可以看出,當(dāng)SectionAlignment和FileAlignment相同時(shí),同一節(jié)表項(xiàng)中數(shù)據(jù)的RVA(相對(duì)虛擬地址)和FileOffset(文件偏移地址)是相同的。RVA的值是用VA – ImageBase計(jì)算得到的。

再用OD打開“重建PE”后的測(cè)試程序,同樣找到反匯編中調(diào)用MessageBox()函數(shù)使用的那個(gè)字符串“hello world !”,看其虛擬地址是多少。它的虛擬地址仍然是0x00406030。同樣,用虛擬地址減去裝載地址,相對(duì)虛擬地址的值仍然為0x00006030。不過用C32Asm打開該文件查看的話會(huì)有所不同。用C32Asm看一下0x00006030地址處的內(nèi)容,如圖9所示。

圖9  文件偏移0x00006030處沒有“hello world!”字符串

從圖9中可以看到,用C32Asm打開該文件后,文件偏移0x00006030處并沒有“hello world!”和“hello”字符串。這就是由文件對(duì)齊與內(nèi)存對(duì)齊的差異所引起的。這時(shí)就要通過一些簡(jiǎn)單的計(jì)算把RVA轉(zhuǎn)換為FileOffset。

把RVA轉(zhuǎn)換為FileOffset的方法很簡(jiǎn)單,首先看一下當(dāng)前的RVA或者是FileOffset屬于哪個(gè)節(jié)。0x00006030這個(gè)RVA屬于.data節(jié)。0x00006030這個(gè)RVA相對(duì)于該節(jié)的起始RVA地址0x00006000來(lái)說偏移0x30字節(jié)。再看.data節(jié)在文件中的起始位置為0x00004000,以.data節(jié)的文件起始偏移0x00004000加上0x30字節(jié)的值為0x00004030。用C32Asm看一下0x00004030地址處的內(nèi)容,如圖10所示。

圖10  0x00004030文件偏移處的內(nèi)容

從圖10中可以看出,該文件偏移處保存著“hello world !”字符串,也就是說,將RVA轉(zhuǎn)換為FileOffset是正確的。通過LordPE工具來(lái)驗(yàn)證一下,如圖11所示。

圖11  用LordPE計(jì)算RVA為0x00006030的文件偏移

再來(lái)回顧一下這個(gè)過程。

某數(shù)據(jù)的文件偏移 = 該數(shù)據(jù)所在節(jié)的起始文件偏移 + (某數(shù)據(jù)的RVA –該數(shù)據(jù)所在節(jié)的起始RVA)。

除了上面的計(jì)算方法以外,還有一種計(jì)算方法,即用節(jié)的起始RVA值減去節(jié)的起始文件偏移值,得到一個(gè)差值,再用RVA減去這個(gè)得到的差值,就可以得到其所對(duì)應(yīng)的FileOffset??梢允褂美映绦蜻M(jìn)行手工計(jì)算,然后通過LordPE進(jìn)行驗(yàn)證。

知道如何通過RVA轉(zhuǎn)換為文件偏移,那么通過文件偏移轉(zhuǎn)換為RVA的方法也就不難了。這3種地址相互的轉(zhuǎn)換方法就介紹完了。如果沒有理解,就可以反復(fù)地按照公式進(jìn)行學(xué)習(xí)和計(jì)算。只要在頭腦中建立關(guān)于磁盤文件和內(nèi)存映像的結(jié)構(gòu),那么理解起來(lái)就不會(huì)太吃力。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 計(jì)算機(jī)與網(wǎng)絡(luò)安全
相關(guān)推薦

2021-04-28 14:35:48

網(wǎng)絡(luò)安全PE編程代碼

2021-04-19 10:26:41

網(wǎng)絡(luò)安全PE文件

2021-04-25 21:25:09

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程PE編程

2021-04-26 10:32:38

網(wǎng)絡(luò)安全PE編程工具

2021-04-30 18:50:44

網(wǎng)絡(luò)安全PE編程添加節(jié)區(qū)

2021-03-01 11:38:15

網(wǎng)絡(luò)安全進(jìn)程代碼

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2019-07-30 08:42:54

網(wǎng)絡(luò)訪問控制網(wǎng)絡(luò)地址轉(zhuǎn)換網(wǎng)絡(luò)

2010-12-02 11:27:07

NAT網(wǎng)絡(luò)地址轉(zhuǎn)換

2019-03-25 20:31:58

IP地址轉(zhuǎn)換數(shù)字

2021-04-13 11:15:54

網(wǎng)絡(luò)安全C語(yǔ)言循環(huán)結(jié)構(gòu)

2021-04-08 11:10:22

網(wǎng)絡(luò)安全C語(yǔ)言if…else…

2022-01-09 17:36:26

網(wǎng)絡(luò)代碼安全

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠(yuǎn)程線程

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進(jìn)程代碼

2011-03-24 11:47:24

網(wǎng)絡(luò)安全實(shí)名認(rèn)證IP

2009-09-24 11:21:03

2011-03-14 16:01:44

路由器NAT

2016-10-10 00:18:27

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)