雷 沖, 梁 麗
(1.四川文理學(xué)院 智能制造學(xué)院; 2.招生就業(yè)處,四川 達(dá)州635000)
信息隱藏指把一個(gè)特定的信息隱藏在另一個(gè)公共載體的信息中而得到的隱蔽載體,非法者不知道這個(gè)普通信息中是否隱藏了其他的信息,即便知道也很難提取或去除隱藏的信息.所用載體可以是文本、圖像、聲音及視頻等.[1-2]
PE文件的全稱是Portable Executable,意為可移植的可執(zhí)行的文件,常見的EXE、DLL、SYS,COM等都是PE文件,PE文件是微軟Windows操作系統(tǒng)上的程序文件,而PE文件信息隱藏是指利用PE文件的存儲(chǔ)空間冗余、結(jié)構(gòu)特性和PE文件執(zhí)行等特點(diǎn),在不破壞PE文件的基本特性和使用價(jià)值的前提下,將受保護(hù)信息隱藏在載體PE文件中,實(shí)現(xiàn)版權(quán)保護(hù)、隱蔽通信等功能.[2]
PE文件結(jié)構(gòu)如圖1所示,以Windows 32位操作系統(tǒng)為例,一個(gè)標(biāo)準(zhǔn)的PE文件一般由四大部分組成:DOS頭、PE頭、節(jié)表、節(jié)內(nèi)容.其中DOS頭由DOS MZ頭和DOS Stub構(gòu)成,DOS MZ頭即IMAGE_DOS_HEADER,占據(jù)了PE文件的頭64個(gè)字節(jié),其中最重要的兩個(gè)字段是e_magic和e_lfanew,e_magic是位于偏移0處的“MZ標(biāo)志”,其值為0x5A4D,e_lfanew(0x3c處)指出了PE頭的起始偏移量,緊接著是DOS Stub,它是一個(gè)字節(jié)塊,其內(nèi)容隨著鏈接時(shí)使用的鏈接器不同而不同,其大小不固定,在Windows NT系統(tǒng)下被當(dāng)做是冗余數(shù)據(jù).緊接著是PE頭,其由四個(gè)字節(jié)的PE頭標(biāo)識(shí)Signature,20個(gè)字節(jié)的標(biāo)準(zhǔn)PE頭和224個(gè)字節(jié)的擴(kuò)展PE頭組成,緊接著是節(jié)表,由多個(gè)IMAGE_SECTION_HEADER結(jié)構(gòu)組成,一個(gè)IMAGE_SECTION_HEADER結(jié)構(gòu)占40個(gè)字節(jié),用來描述一個(gè)區(qū)塊(又名節(jié))的屬性和位置信息,它們之間是一一對(duì)應(yīng)關(guān)系,有多少個(gè)區(qū)塊就有多少個(gè)這樣的結(jié)構(gòu).[3-6]
節(jié)內(nèi)容....reloc節(jié).rsrc節(jié).data節(jié).text節(jié)節(jié)表n×IMAGE_SECTION_HEADER結(jié)構(gòu)PE頭16×IMAGE_DATA_DIRECTORY結(jié)構(gòu)IMAGE_OPTIONAL_HEADER32結(jié)構(gòu)IMAGE_FILE_HEADER32結(jié)構(gòu)“PE”, 0, 0DOS頭DOS StubIMAGE_DOS_HEADER結(jié)構(gòu)
由以上內(nèi)容可知,PE文件的結(jié)構(gòu)較為復(fù)雜,其不可避免地會(huì)存在一些冗余空間,主要分為如下幾種.
(1)PE文件中存在多種不同的結(jié)構(gòu),這些結(jié)構(gòu)本身存在未被使用的字段空間.
(2)PE文件中存在多個(gè)區(qū)塊,存儲(chǔ)在磁盤上的PE文件,組成塊的數(shù)據(jù)應(yīng)保證從本字段的倍數(shù)地址開始,即區(qū)塊對(duì)齊.對(duì)于運(yùn)行于x86的可執(zhí)行文件,文件對(duì)齊的值由擴(kuò)展PE頭的FileAlignment字段決定,通常為200h或者1000h,因而每個(gè)區(qū)塊所占用的磁盤空間往往會(huì)大于它真實(shí)的數(shù)據(jù)所需要的空間,這通常會(huì)在每個(gè)區(qū)塊的末尾為了對(duì)齊而存在冗余空間.
(3)在原來節(jié)后面人為新增一個(gè)節(jié),添加到原來節(jié)的后面,并修改相應(yīng)的節(jié)表,使得新增的節(jié)更具隱蔽性.[7-8]
第一、二種冗余存在著冗余空間有限的問題,第三種冗余通過新增節(jié)的方法理論上可實(shí)現(xiàn)無容量限制的信息隱藏.新增一個(gè)節(jié)需要添加一個(gè)IMAGE_SECTION_HEADER結(jié)構(gòu),要求PE文件在節(jié)表處至少有連續(xù)40個(gè)字節(jié)的冗余空間,如無法滿足則需要進(jìn)行節(jié)的合并從而留出足夠的空間,本文接下來將介紹如何新增節(jié)以及合并節(jié)從而留出足夠的冗余空間來隱藏信息.
在win7環(huán)境下,以QQScLauncher.exe為例,新增一個(gè)節(jié)的步驟如下:<1>判斷是否有足夠的空間,可以添加一個(gè)節(jié)表.用UltraEdit軟件查看,可知FileAlignment的值為200h,在節(jié)表與第一個(gè)節(jié)之間因文件對(duì)齊存在著遠(yuǎn)超過40個(gè)字節(jié)的冗余空間.<2>在節(jié)表中新增一個(gè)成員.復(fù)制.text節(jié)的四十個(gè)字節(jié)并添加到節(jié)表的最后.<3>修改PE頭中節(jié)的數(shù)量.NumberOfSections字段的值加1.<4>修改SizeOfImage的大小.其值為原SizeofImage值與新增節(jié)數(shù)據(jù)之和并按照內(nèi)存對(duì)齊后的結(jié)果.<5> 在原有數(shù)據(jù)的最后,新增一個(gè)節(jié)的數(shù)據(jù)(須滿足內(nèi)存對(duì)齊的整數(shù)倍).<6> 修正新增節(jié)表的屬性.Name字段的值可隨便修改,但不能超過8個(gè)字節(jié);VirtuallAddress字段的值按照內(nèi)存對(duì)齊并參照上一個(gè)節(jié)VirtuallAddress的值進(jìn)行修改;SizeofRawData字段的值為添加的節(jié)數(shù)據(jù)的大小并按照文件對(duì)齊后的要求修改;PointerToRawData字段的值為上一個(gè)節(jié)的PointerToRawData值與上一個(gè)節(jié)SizeofRawData值之和.
并非所有的PE文件都有足夠的空間來存放一個(gè)節(jié)表,例如notepad.exe二進(jìn)制文件,其解決方案一種方法是將整個(gè)PE頭以及節(jié)表都上移,覆蓋DOS Stub這部分內(nèi)容,同時(shí)修改e_lfanew的值,使其指向新的PE簽名地址,但如果該二進(jìn)制文件是被PE編輯工具編輯過的,DOS Stub這部分內(nèi)容則很可能不再是垃圾數(shù)據(jù)而是有用的數(shù)據(jù),此種方案無法采用.另一種解決方案是進(jìn)行節(jié)的合并,假設(shè)將所有的節(jié)合并為一個(gè)節(jié),那么對(duì)應(yīng)的節(jié)表只需要有一個(gè)結(jié)構(gòu)描述其屬性和位置,這樣即可留出足夠的空間來進(jìn)行新增節(jié)的操作,其步驟如下:<1>按照內(nèi)存對(duì)齊展開.<2>將第一個(gè)節(jié)的內(nèi)存大小、文件大小改成一樣Max=SizeOfRawData>VirtualSize?SizeOfRawData:virtualSize,其值為其中的大者,將所有節(jié)合并為一個(gè)節(jié)后,其值為SizeOfRawData=VirtualSize=最后一個(gè)節(jié)的VirtualAddress+Max-SizeOfHeaders內(nèi)存對(duì)齊后的大小.<3>將第一個(gè)節(jié)的屬性改為包含所有節(jié)的屬性.<4>將節(jié)的數(shù)量修改為1.
為了增強(qiáng)所隱藏信息的安全性和系統(tǒng)抗攻擊性,可對(duì)需要隱藏的信息進(jìn)行加密處理,加密后將其嵌入選定的PE文件中,信息的提取是信息隱藏的逆過程,其主要操作是從嵌入的地方提取信息,將加密信息解密后即可獲得明文信息.
本文通過對(duì)PE文件冗余空間的分析,列舉出了基于PE文件進(jìn)行信息隱藏的一些方案,并針對(duì)通過新增節(jié)的方式進(jìn)行信息隱藏的方案中存在的問題,即PE文件被PE編輯工具編輯過后導(dǎo)致無足夠的冗余空間,提出了一種先合并節(jié)再新增節(jié)的方式實(shí)現(xiàn)無容量限制的信息隱藏技術(shù).此種方案對(duì)原PE文件的大小有所改變,因此在選擇PE文件時(shí)應(yīng)比隱藏的信息大兩個(gè)數(shù)量級(jí)以上,如何在不改變PE文件大小的情況下實(shí)現(xiàn)無容量限制的信息隱藏有待進(jìn)一步研究.
四川文理學(xué)院學(xué)報(bào)2021年2期