Windows PE 第十二章 PE变形技术
PE變形技術(shù)
? ? 這章東西太多,太細(xì)了。這里我只記錄了一些重點(diǎn)概念。為后面學(xué)習(xí)做鋪墊。
? ? PE變形:改變PE結(jié)構(gòu)之后,PE加載器依然可以成功加載運(yùn)行我們的程序。
一?變形常用技術(shù):
結(jié)構(gòu)重疊技術(shù)、空間調(diào)整技術(shù)、數(shù)據(jù)轉(zhuǎn)移技術(shù)、數(shù)據(jù)壓縮技術(shù)。
下面是相關(guān)概念只是(我只整理重點(diǎn))
1.結(jié)構(gòu)重疊技術(shù):
????結(jié)構(gòu)重疊技術(shù)是指在不影響正常性能的前提下,將某些數(shù)據(jù)結(jié)構(gòu)進(jìn)行重疊的技術(shù)。在縮小PE的變形中將大量使用這種技術(shù)。
重疊能成功通常是以為以下三點(diǎn):
(1)被覆蓋的數(shù)據(jù)可能是另一個(gè)結(jié)構(gòu)中的無(wú)用數(shù)據(jù)。
(2)有用的數(shù)據(jù)可能只對(duì)一個(gè)結(jié)構(gòu)起作用,但是被覆蓋的數(shù)據(jù)在兩個(gè)結(jié)構(gòu)中都用,此種情況下發(fā)生的重疊必須保證重疊的字段在兩個(gè)結(jié)構(gòu)中擁有相同值。
(3)PE加載器并不檢測(cè)所有的字段。
找了一個(gè)helloword隨便把頭前面改了下。
2.空間調(diào)整:
? ? 通過改變一些數(shù)據(jù)塊的大小來個(gè)自己擴(kuò)充空間,然后往里面加代碼或者數(shù)據(jù),但是這種要注意,被擴(kuò)充的節(jié)后面所有的數(shù)據(jù)要相應(yīng)修改相對(duì)偏移位置,這個(gè)比較麻煩。
3.數(shù)據(jù)轉(zhuǎn)移技術(shù):
? ? 在編寫過程中,處于某種考慮,經(jīng)常會(huì)將PE中的一部分?jǐn)?shù)據(jù)轉(zhuǎn)移到另一個(gè)位置。比如,將程序中的變量存儲(chǔ)到文件頭部結(jié)構(gòu)的某個(gè)字段中,將代碼轉(zhuǎn)移到頭部結(jié)構(gòu)的某個(gè)連續(xù)空間中等,這就是數(shù)據(jù)轉(zhuǎn)移技術(shù)。
(1)寫一個(gè)hello輸出HelloPE.
(2)找到數(shù)據(jù)段的這個(gè)字符串改為HelloXX,運(yùn)行發(fā)現(xiàn)是顯示HelloXX.
(3)然后OD加載起來這個(gè)程序,斷點(diǎn)到MessageBox的地方,把push地址的那個(gè)HelloXX地址改為0x1020020相當(dāng)于文件頭0x20.
(4)然后直接二進(jìn)制操作,把文件0x20的地方隨便寫一個(gè)傳,模擬數(shù)據(jù)被轉(zhuǎn)移到了這里。然后雙擊exe顯示的是0x20處的這個(gè)串。具體細(xì)節(jié)操作如下圖。
?
?
?
?
?
?
4.數(shù)據(jù)壓縮技術(shù):
? ? 在編程過程中,如果指令代碼比較長(zhǎng),海爾可以先對(duì)代碼實(shí)施壓縮,然后在PE頭部找一塊比較大的連續(xù)區(qū)域存放加壓縮用的代碼。程序被PE加載器加載后,文件頭就基本不再使用了。這時(shí),可以將存儲(chǔ)的壓縮代碼通過PE頭部的解壓縮程序進(jìn)行解壓,解壓后即可通過跳轉(zhuǎn)指令實(shí)施程序指令的轉(zhuǎn)移。
? ? 由于壓縮后的代碼不便于通過十六進(jìn)制直接地看到,所以這種方法在一些病毒程序代碼中比較常見;另外,在一些加殼程序中會(huì)經(jīng)??吹綌?shù)據(jù)壓縮技術(shù)。
書上分析了一個(gè)病毒,用了簡(jiǎn)單的行程壓縮算法,
這個(gè)很好理解:0000010000壓縮后是05104
二?變形技術(shù)可用的空間:
? ? 要想對(duì)PE進(jìn)行變形,需要掌握PE文件中每個(gè)位置數(shù)據(jù)的可替換特性,即該位置數(shù)據(jù)是否可以被替換成別的值,某段數(shù)據(jù)是否可以被其他用途利用等??傮w上講,PE中可以作用變形的空間有以下三類。
(1)文件頭部未用的字段(用前一定要仔細(xì)測(cè)試)
?
?
(2)大小不固定的數(shù)據(jù)塊:
?
(3)因?qū)R產(chǎn)生的補(bǔ)足空間:
這個(gè)也是大小不固定的,要具具體PE具體分析。
?
三?變形技術(shù)原則:
(1)關(guān)于數(shù)據(jù)目錄表:
數(shù)據(jù)目錄表的個(gè)數(shù)必須大于等于2.如果PE文件的最后一個(gè)字節(jié)位于目錄表之間,如介于第3項(xiàng)資源表定義之間,則文件中無(wú)法定義資源的大小,PE加載器默認(rèn)資源表的大小為0.
(2)關(guān)于節(jié)表:
????PE文件頭中可以沒有節(jié)表的定義,但必須將文件頭部的字段IMAGE_FILE_HEADER.NumberOfSections設(shè)置為1.
(3)關(guān)于導(dǎo)入表:
????導(dǎo)入表是PE的核心。要想在已有的PE中靜態(tài)引入動(dòng)態(tài)鏈接庫(kù)的函數(shù),就必須通過變形技術(shù)構(gòu)造一個(gè)合理的導(dǎo)入表,或者重構(gòu)已有的導(dǎo)入表。
(4)關(guān)于程序數(shù)據(jù):
????數(shù)據(jù)可以存儲(chǔ)在內(nèi)存中的任何位置,可以位于文件頭,可以可以位于其他節(jié)中。
代碼和數(shù)據(jù)一樣,可以在內(nèi)存的任何位置,所在的節(jié),其屬性必須可讀、可寫、可執(zhí)行。將代碼段設(shè)置為可寫屬性主要考慮到某些程序會(huì)將一些變量存儲(chǔ)在代碼段,且在程序中尤為該變量賦值的代碼。
如果所有的數(shù)據(jù)(程序變量、導(dǎo)入表、IAT等)都在文件頭部,也就是說加載進(jìn)內(nèi)存的PE文件只有頭文件存在,假設(shè)大小為一個(gè)頁(yè)面1000h,那么操作系統(tǒng)會(huì)因?yàn)?/span>IAT的緣故自動(dòng)將該頁(yè)面設(shè)置位ERW,即可讀、可寫、可執(zhí)行(之前文件頭默認(rèn)是只讀的)。
(5)關(guān)于對(duì)齊:
????節(jié)的對(duì)齊尺寸必須大于等于文件的對(duì)齊尺寸。由于文件的對(duì)齊尺寸被定義為2的N次冪,所以通常會(huì)將文件對(duì)齊尺寸設(shè)置得更小,并使兩個(gè)值相等,已達(dá)到縮小PE文件的目的。
(6)幾個(gè)關(guān)注的字字段:
?
?
總結(jié)
以上是生活随笔為你收集整理的Windows PE 第十二章 PE变形技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16.PHP_Ajax模拟服务器登录验证
- 下一篇: Windows PE 第十三章 PE补丁