溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

發(fā)布時(shí)間:2020-06-25 14:33:03 來源:網(wǎng)絡(luò) 閱讀:514 作者:homedesk 欄目:安全技術(shù)

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í)壓縮器UPack工作原理及實(shí)例分析(上)

1.1運(yùn)行時(shí)壓縮器定義

運(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文件的專用壓縮器。

1.2運(yùn)行時(shí)壓縮器用途及種類

PE壓縮器使用的目的主要集中于兩個(gè)方面:

  1. 縮減PE文件的大小

  2. 隱藏PE文件內(nèi)部代碼與資源

PE壓縮器種類:

  1. 單純用于壓縮普通PE文件,比如UPX,ASPack

  2. 對(duì)源文件(PE文件)進(jìn)行較大變形、嚴(yán)重破壞PE頭、意圖不純的壓縮器,例如用于惡意程序(virtus,Trojan,worm等),比如UPack,PESpin等。

2 初探UPack壓縮文件

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í)壓縮,如下圖所示

        庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

  由上圖可知notepad.exe程序有原來的66560個(gè)字節(jié)變成了44908個(gè)字節(jié),文件大小有了變化,同時(shí)由圖中輸出信息可知文件的輸入表,資源信息等也發(fā)生了變化。

2.1壓縮文件檢測

  UPack壓縮后的文件,文件頭部和文件內(nèi)容發(fā)生了變化,對(duì)導(dǎo)致許多安全軟件認(rèn)為壓縮文件有可能包含病毒特征,會(huì)直接報(bào)毒,下圖是利用QQ傳輸原始notepad文件和壓縮notepad文件時(shí),QQ自檢會(huì)認(rèn)為被UPack壓縮后的文件包含病毒特征。

        庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

下圖是利用IE瀏覽器下載壓縮文件和正常文件,IE插件給出的提示信息。 

      庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上) 

下圖是利用多掃描引擎對(duì)壓縮文件進(jìn)行檢測,國內(nèi)很多安全廠商的病毒引擎都認(rèn)為被UPack壓縮的文件含有病毒特征。

      庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

2.2實(shí)用工具識(shí)別

由于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)而加載失敗。

       庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

3深度剖析UPack壓縮原理

經(jīng)過UPack壓縮后的文件,其頭部和節(jié)部分的內(nèi)容都發(fā)生了變化,貌似已經(jīng)不再符合PE文件格式要求。

3.1二進(jìn)制文件對(duì)比

典型的PE文件頭,其中數(shù)據(jù)按照IMAGE_DOS_HEADER、DOS Stub、IMAGE_NT_HEADERS、IMAGE_SECTION_HEADER順序排列。

      庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

單獨(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)。

       庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

3.2重災(zāi)區(qū)---壓縮文件頭

UPack以頭部壓縮著稱,將PE文件頭部變化的面目全非,宛如去韓國整了一次容。

PE結(jié)構(gòu)可知PE頭部包括了IMAGE_DOS_HEADER、DOS Stub、IMAGE_NT_HEADERS、IMAGE_SECTION_HEADER五部分組成,其中IMAGE_NT_HEADERSmagic、IMAGE_FILE_HEADER、IMAGE_OPTIONAL_HEADER三部分組成。

3.2.1重災(zāi)區(qū)之DOS頭部重疊

重疊文件頭將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_magice_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(vcA0)=0XE0,也就是說一般e_lfanew字段的值為0XE0,對(duì)比UPack壓縮后的文件e_lfanew字段的值變?yōu)?/span>0X10,如下圖

        庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

下圖是一個(gè)示意圖文件的DOS頭部壓縮前后發(fā)生的變化。文件壓縮后,DOS Stub部分已經(jīng)消失,被IMAGE_FILE_HEADER結(jié)構(gòu)占據(jù)。

         庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

3.2.2重災(zāi)區(qū)之IMAGE_FILE_HEADER變形

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所示

     庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

在經(jīng)過UPack壓縮后,文件頭部的SizeOfOptionHeader變成了0x148,如下圖所示  

        庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

比正常值0XE0要大的多。SizeOfOptionHeader的另一層含義是確定節(jié)區(qū)頭(IMAGE_SECTION_HEADER)的起始偏移,將該字段的值由0XE0擴(kuò)大到0x148,無疑增大了IMAGE_OPTIONAL_HEADER結(jié)構(gòu)的大小。

  UPack的基本特征就是把PE文件頭變形,像非洲人的頭發(fā)一樣擰麻花,向文件頭適當(dāng)插入解碼需要的的代碼。增大SizeOfOptionHeader的值后,就在IMAGE_OPTIONAL_HEADERIMAGE_SECTION_HEADER之間添加了額外空間。向這個(gè)額外區(qū)域添加解碼代碼,是一種超越文件頭常規(guī)理解的巧妙方法。

  二進(jìn)制查看該額外區(qū)域的數(shù)據(jù),該區(qū)域的起始位置在IMAGE_OPTIONAL_HEADER的結(jié)束位置0XD7(為什么是D7位置,后面會(huì)介紹),該區(qū)域的結(jié)束位置是0x170。

利用調(diào)試器查看該區(qū)域的部分反匯編代碼如下圖

      庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

下圖是IMAGE_FILE_HEADER壓縮前后的格式對(duì)比,壓縮后的文件頭部增大。

      庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

3.2.3重災(zāi)區(qū)之IMAGE_OPTIONAL_HEADER變形

   對(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)變小。

       庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

3.2.4重災(zāi)區(qū)之IMAGE_SECTION_HEADER重疊變形

前面介紹了文件圖的IMAGE_DOS_HEADERDOS 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ì)比

       庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

        庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

對(duì)比兩幅圖,變化前后節(jié)區(qū)的名稱,虛擬大小,偏移,文件大小,文件起始偏移等都發(fā)生了變化。

  查看壓縮后的notepad文件的節(jié)區(qū),發(fā)現(xiàn)第一個(gè)節(jié)區(qū)與第三節(jié)區(qū)的文件起始偏移與在文件中的大小完全一致。但是節(jié)區(qū)內(nèi)存的起始RVAVirtualOffset)項(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ū)壓縮示意圖

      庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

也就是說,壓縮在第二個(gè)節(jié)區(qū)的文件映像很可能會(huì)解壓縮到第一個(gè)節(jié)區(qū)。文件開始裝入內(nèi)存后的示意圖如下圖。

         庖丁解牛之運(yùn)行時(shí)壓縮器UPack工作原理及實(shí)例分析(上)

http://blog.nsfocus.net/upack-works-case-analysis1/

向AI問一下細(xì)節(jié)

免責(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)容。

AI