您好,登錄后才能下訂單哦!
1基礎(chǔ)知識(shí)介紹
運(yùn)行時(shí)壓縮器是軟件逆向工程中常見課題;了解運(yùn)行時(shí)壓縮,需要掌握基本的PE文件格式,操作系統(tǒng)的基本知識(shí)等。
理解本文內(nèi)容最好有PE文件基礎(chǔ)知識(shí),對(duì)PE文件加載器有一定了解。本文會(huì)穿插介紹PE文件基礎(chǔ)知識(shí)但重點(diǎn)不在于此。
下圖是PE文件結(jié)構(gòu)部分及在磁盤和加載到內(nèi)存中的對(duì)比,其文件的總體結(jié)構(gòu)未發(fā)生變化,但是文件在磁盤和內(nèi)存中的相對(duì)偏移發(fā)生了變化。
運(yùn)行時(shí)壓縮器是針對(duì)可執(zhí)行文件而言,可執(zhí)行文件內(nèi)部含有解壓縮代碼,文件在運(yùn)行瞬間于內(nèi)存中解壓縮后執(zhí)行。
普通壓縮與運(yùn)行時(shí)壓縮比較
項(xiàng)目 | 運(yùn)行時(shí)壓縮 | 普通壓縮 |
對(duì)象 | PE文件(exe,dll,sys) | 所有文件 |
壓縮結(jié)果 | PE文件(exe,dll,sys) | 壓縮文件(rar,zip) |
解壓方式 | 內(nèi)部自解壓程序 | 專門解壓程序 |
可否執(zhí)行 | 本身可執(zhí)行 | 本身不可執(zhí)行 |
特點(diǎn) | 無需專門解壓程序可直接執(zhí)行 | 對(duì)所有文件壓縮 |
可執(zhí)行文件的壓縮器稱為“運(yùn)行時(shí)壓縮器”,它是PE文件的專用壓縮器。
PE壓縮器使用的目的主要集中于兩個(gè)方面:
縮減PE文件的大小
隱藏PE文件內(nèi)部代碼與資源
PE壓縮器種類:
單純用于壓縮普通PE文件,比如UPX,ASPack等
對(duì)源文件(PE文件)進(jìn)行較大變形、嚴(yán)重破壞PE頭、意圖不純的壓縮器,例如用于惡意程序(virtus,Trojan,worm等),比如UPack,PESpin等。
UPack的制作者對(duì)PE頭有深刻認(rèn)識(shí),UPack以對(duì)PE頭的獨(dú)特變形技法而聞名。UPack在剛出現(xiàn)時(shí),許多PE實(shí)用程序無法正常運(yùn)行。導(dǎo)致許多惡意代碼制作者使用UPack壓縮惡意代碼發(fā)布。
本文以UPack 0.39版本壓縮的notepad.exe為例,詳細(xì)介紹UPack對(duì)PE文件的壓縮過程,尤其對(duì)PE頭部及代碼重置的關(guān)鍵技術(shù)做了詳細(xì)介紹。
UPack對(duì)notepad.exe做運(yùn)行時(shí)壓縮,如下圖所示
由上圖可知notepad.exe程序有原來的66560個(gè)字節(jié)變成了44908個(gè)字節(jié),文件大小有了變化,同時(shí)由圖中輸出信息可知文件的輸入表,資源信息等也發(fā)生了變化。
被UPack壓縮后的文件,文件頭部和文件內(nèi)容發(fā)生了變化,對(duì)導(dǎo)致許多安全軟件認(rèn)為壓縮文件有可能包含病毒特征,會(huì)直接報(bào)毒,下圖是利用QQ傳輸原始notepad文件和壓縮notepad文件時(shí),QQ自檢會(huì)認(rèn)為被UPack壓縮后的文件包含病毒特征。
下圖是利用IE瀏覽器下載壓縮文件和正常文件,IE插件給出的提示信息。
下圖是利用多掃描引擎對(duì)壓縮文件進(jìn)行檢測,國內(nèi)很多安全廠商的病毒引擎都認(rèn)為被UPack壓縮的文件含有病毒特征。
由于UPack對(duì)PE文件頭部做了特殊處理,這樣就會(huì)使一些PE實(shí)用程序無法正常運(yùn)行,PEView使用工具加載壓縮notepad文件和原始notepad文件時(shí),對(duì)文件識(shí)別也表現(xiàn)不同;由于UPack對(duì)notepad頭部做了變形,導(dǎo)致PEView在對(duì)壓縮notepad解析時(shí)找不到正常的文件結(jié)構(gòu)而加載失敗。
經(jīng)過UPack壓縮后的文件,其頭部和節(jié)部分的內(nèi)容都發(fā)生了變化,貌似已經(jīng)不再符合PE文件格式要求。
典型的PE文件頭,其中數(shù)據(jù)按照IMAGE_DOS_HEADER、DOS Stub、IMAGE_NT_HEADERS、IMAGE_SECTION_HEADER順序排列。
單獨(dú)二進(jìn)制文件對(duì)比發(fā)現(xiàn),文件的大小和文件內(nèi)容都發(fā)生了變化,壓縮后的文件表面上看已經(jīng)不在符合PE文件規(guī)范。如下圖所示,更直觀的對(duì)比,文件結(jié)構(gòu)的很多字段都發(fā)生了變化,對(duì)于一般的實(shí)用工具或是調(diào)試工具,很難識(shí)別出壓縮后文件的文件結(jié)構(gòu)。
UPack以頭部壓縮著稱,將PE文件頭部變化的面目全非,宛如去韓國整了一次容。
有PE結(jié)構(gòu)可知PE頭部包括了IMAGE_DOS_HEADER、DOS Stub、IMAGE_NT_HEADERS、IMAGE_SECTION_HEADER五部分組成,其中IMAGE_NT_HEADERS有magic、IMAGE_FILE_HEADER、IMAGE_OPTIONAL_HEADER三部分組成。
重疊文件頭將MZ文件頭(IMAGE_DOS_HEADER)與PE文件頭(IMAGE_NT_HEADERS)巧妙重疊一起,節(jié)約文件頭空間。
由PE文件頭部結(jié)構(gòu)可知(需要知道PE文件頭部基礎(chǔ)結(jié)構(gòu)),IMAGE_DOS_HEADER結(jié)構(gòu)中兩個(gè)重要字段e_magic和e_lfanew,第一個(gè)字段一般為“MZ”是PE文件最開始的標(biāo)志,第二個(gè)字段標(biāo)志的是除去IMAGE_DOS_HEADER頭部和DOS Stub部分后IMAGE_FILE_HEADER結(jié)構(gòu)的開始位置。
一般情況下e_lfanew =IMAGE_DOS_HEADER(40)+DOS Stub(vc下A0)=0XE0,也就是說一般e_lfanew字段的值為0XE0,對(duì)比UPack壓縮后的文件e_lfanew字段的值變?yōu)?/span>0X10,如下圖
下圖是一個(gè)示意圖文件的DOS頭部壓縮前后發(fā)生的變化。文件壓縮后,DOS Stub部分已經(jīng)消失,被IMAGE_FILE_HEADER結(jié)構(gòu)占據(jù)。
在IMAGE_FILE_HEADER有一重要字段就是SizeOfOptionHeader;SizeOfOptionHeader表示IMAGE_OPTIONAL_HEADER的大??;修改該值,改變IMAGE_OPTIONAL_HEADER頭部的大小,可插入解碼代碼等內(nèi)容。
在一般的PE文件中,IMAGE_OPTIONAL_HEADER結(jié)構(gòu)的大小是固定,所以SizeOfOptionHeader字段的值也是固定的,為0XE0,如下圖notepad_origin.exe所示
在經(jīng)過UPack壓縮后,文件頭部的SizeOfOptionHeader變成了0x148,如下圖所示
比正常值0XE0要大的多。SizeOfOptionHeader的另一層含義是確定節(jié)區(qū)頭(IMAGE_SECTION_HEADER)的起始偏移,將該字段的值由0XE0擴(kuò)大到0x148,無疑增大了IMAGE_OPTIONAL_HEADER結(jié)構(gòu)的大小。
UPack的基本特征就是把PE文件頭變形,像非洲人的頭發(fā)一樣擰麻花,向文件頭適當(dāng)插入解碼需要的的代碼。增大SizeOfOptionHeader的值后,就在IMAGE_OPTIONAL_HEADER與IMAGE_SECTION_HEADER之間添加了額外空間。向這個(gè)額外區(qū)域添加解碼代碼,是一種超越文件頭常規(guī)理解的巧妙方法。
二進(jìn)制查看該額外區(qū)域的數(shù)據(jù),該區(qū)域的起始位置在IMAGE_OPTIONAL_HEADER的結(jié)束位置0XD7(為什么是D7位置,后面會(huì)介紹),該區(qū)域的結(jié)束位置是0x170。
利用調(diào)試器查看該區(qū)域的部分反匯編代碼如下圖
下圖是IMAGE_FILE_HEADER壓縮前后的格式對(duì)比,壓縮后的文件頭部增大。
對(duì)比壓縮前后的文件可知,IMAGE_OPTIONAL_HEADER結(jié)構(gòu)中的NumberOfRvaAndSizes字段的值也變化,該字段表示的是數(shù)據(jù)目錄的大小,改變?cè)撝狄彩菫榱讼蛭募^插入自身代碼。正常文件該字段的大小是0x10,也就是IMAGE_OPTIONAL_HEADER結(jié)構(gòu)中最后一部分有有0x10個(gè)IMAGE_DATA_DIRECTORY數(shù)組,但是在UPack壓縮有該值變成了0x0A,也就是說少了6個(gè)IMAGE_DATA_DIRECTORY結(jié)構(gòu)數(shù)組,每個(gè)數(shù)組占8個(gè)字節(jié)。從下圖可以看出IMAGE_OPTIONAL_HEADER結(jié)構(gòu)的后半部分IMAGE_DATA_DIRECTORY結(jié)構(gòu)剛好到0Xd7的位置,也即是說從0XD8一直到0x170之間都是作為空閑區(qū)域插入代碼。
下圖是IMAGE_FILE_HEADER壓縮前后的格式對(duì)比,壓縮后的DATA_DIRECTORY結(jié)構(gòu)變小。
前面介紹了文件圖的IMAGE_DOS_HEADER、DOS Stub、IMAGE_FILE_HEADER、IMAGE_OPTIONAL_HEADER、DATA_DIRECTORY的變形,接下來就是IMAGE_SECTION_HEADER的變形。
IMAGE_SECTION_HEADER是文件頭部的最后的一部分。節(jié)區(qū)的變化包括了節(jié)區(qū)區(qū)域的增加,節(jié)區(qū)區(qū)域的減少,節(jié)區(qū)數(shù)量的增加等。UPack對(duì)PE文件的節(jié)區(qū)也做了變化,下圖是原始notepad文件與壓縮后的notepad文件節(jié)區(qū)對(duì)比
對(duì)比兩幅圖,變化前后節(jié)區(qū)的名稱,虛擬大小,偏移,文件大小,文件起始偏移等都發(fā)生了變化。
查看壓縮后的notepad文件的節(jié)區(qū),發(fā)現(xiàn)第一個(gè)節(jié)區(qū)與第三節(jié)區(qū)的文件起始偏移與在文件中的大小完全一致。但是節(jié)區(qū)內(nèi)存的起始RVA(VirtualOffset)項(xiàng)與內(nèi)存大?。?/span>VirtualSize)值確不同。根據(jù)PE規(guī)范,這樣做不會(huì)有什么問題(更準(zhǔn)確的說,PE規(guī)范并未明確指出這樣做不行)。UPck會(huì)對(duì)PE文件頭、第一節(jié)區(qū)、第三節(jié)區(qū)進(jìn)行重疊。
根據(jù)節(jié)區(qū)頭中定義的值,PE裝載器會(huì)將文件偏移0x10-0x200的區(qū)域分別映射到內(nèi)存中的第一、第三節(jié)區(qū)。也就是說用相同的文件分別創(chuàng)建出不同位置的、大小不同的內(nèi)存映像。
觀察壓縮的節(jié)區(qū),文件的頭部區(qū)域大小為200字節(jié)。相反,第二個(gè)節(jié)區(qū)大?。?/span>AD6C)非常大,原文件就壓縮與此。另外需要注意的部分是內(nèi)存中的第一個(gè)節(jié)區(qū)區(qū)域,它的內(nèi)存尺寸為13000,與原文件的sizeofImage相同。
文件節(jié)區(qū)壓縮示意圖
也就是說,壓縮在第二個(gè)節(jié)區(qū)的文件映像很可能會(huì)解壓縮到第一個(gè)節(jié)區(qū)。文件開始裝入內(nèi)存后的示意圖如下圖。
http://blog.nsfocus.net/upack-works-case-analysis1/
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。