唐文昊 李孟軒 阮鑒杰 陳紅珍
(廣西廣播電視技術(shù)中心桂林分中心)
一、引言
在拷貝文件的過程中,病毒通過U盤的自動運行,在短時間內(nèi)感染了全盤的程序。影響了單位遠(yuǎn)程管理系統(tǒng)等一系列計算機軟件的正常運行,給安全播出帶來隱患。本著刨根究底的態(tài)度,筆者對染毒的程序樣本“OEM設(shè)備IP配置.exe”進行了一次常規(guī)且詳細(xì)的剖析。
二、分析準(zhǔn)備
病毒分析需要在一個干凈且可以撤銷操作的環(huán)境中進行,虛擬機是很好的選擇。在分析前建立還原點,以避免調(diào)試過程中的誤操作使病毒生效,導(dǎo)致實驗環(huán)境被破壞,影響分析過程和結(jié)果。筆者使用的分析工具有:虛擬機Vmware、動態(tài)調(diào)試器ollydbg、PE工具PE Explorer。本文中的十六進制數(shù)均以匯編語言的格式表示,以H結(jié)尾,表示Hex。
三、染毒程序的分析
(一)PE結(jié)構(gòu)

圖1 PE Explorer中顯示的PE頭部的部分信息
PE(Portable Executable)文件是Windows系統(tǒng)的程序文件,主要有可執(zhí)行文件(exe)、動態(tài)鏈接庫(dll)和驅(qū)動程序(sys)三種。操作系統(tǒng)為了組織程序中的代碼和數(shù)據(jù),定義了PE文件的區(qū)段結(jié)構(gòu)。位于文件開頭的PE頭部可以得到整個程序的結(jié)構(gòu)信息,給系統(tǒng)加載程序提供了依據(jù)。病毒感染程序的過程,是在不破壞PE結(jié)構(gòu)的前提下,把自己附加到程序的新區(qū)段或者原代碼段的空閑區(qū)域(文件中區(qū)段未滿200H個字節(jié)時,剩下由0填充)。這里只需要關(guān)注PE頭部的部分?jǐn)?shù)據(jù),圖1是PE工具中顯示的信息。
圖1的PE頭部信息對應(yīng)Windows平臺開發(fā)中winnt.h頭文件定義的數(shù)據(jù)結(jié)構(gòu)IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER32的前一部分。重點關(guān)注倒數(shù)第四行的入口點地址61B00H,表示程序被加載后將從這個地址開始執(zhí)行。需要注意的是,為閱讀方便,PE工具中顯示的值是VA(虛擬地址),而文件中實際存儲的值是RVA(相對虛擬地址),VA=RVA+映像基址。

圖2 PE Explorer中顯示的區(qū)段表

圖3 染毒程序的入口點代碼(感染代碼的開頭)
另一個重要的數(shù)據(jù)結(jié)構(gòu)是區(qū)段表,包括了區(qū)段的位置信息。每一行代表一個區(qū)段,對應(yīng)數(shù)據(jù)結(jié)構(gòu)IMAGE_SECTION_HEADER。虛擬大小和虛擬地址指區(qū)段在內(nèi)存中的位置。RAW數(shù)據(jù)大小和RAW數(shù)據(jù)入口指區(qū)段在文件中的位置。由此可以得到區(qū)段從磁盤文件映射到內(nèi)存的對應(yīng)關(guān)系。內(nèi)存以頁面(0x1000字節(jié))對齊,磁盤以扇區(qū)(0x200字節(jié))對齊,表中的數(shù)值也是它們的倍數(shù)。特征值則可以區(qū)別此區(qū)段包含的是代碼或者數(shù)據(jù),以及是否有讀、寫、執(zhí)行等權(quán)限。
圖2顯示此程序共9個區(qū)段,圖1中的第二行也有標(biāo)識(PE工具翻譯有誤,應(yīng)為區(qū)段數(shù))。常見區(qū)段有代碼段.text和數(shù)據(jù)段.data,以及導(dǎo)入表、導(dǎo)出表所在區(qū)段.idata和.edata。導(dǎo)入表非常重要,包含程序調(diào)用的系統(tǒng)函數(shù)或第三方動態(tài)鏈接庫導(dǎo)出函數(shù)的名字和地址,會直接暴露程序的底層實現(xiàn)。導(dǎo)出表則標(biāo)識了本程序可對外公開的函數(shù)。導(dǎo)出函數(shù)一般被用于共享(提供給多個程序調(diào)用),會被編譯到dll文件,而exe文件很少會有導(dǎo)出函數(shù)。

圖4 搜尋系統(tǒng)函數(shù)地址的部分代碼
最后一個區(qū)段.rmnet是重點懷疑對象,這個名字不是鏈接器生成的默認(rèn)區(qū)段名。實際上它就是病毒所在區(qū)段。正常的入口點會落在代碼段.text內(nèi),靠近開頭,一般是401xxxH,而染毒后的入口點卻位于最后這個區(qū)段。此段的特征值E0000020H標(biāo)識了:代碼(第6位)、可執(zhí)行(第30位)、可讀(第31位)、可寫(第32位)。代碼段可寫在正常情況下很少見,這意味著代碼可能被加密了,一般是加殼軟件或病毒才有具有的特征。
(二)感染代碼——搜索函數(shù)地址
用調(diào)試器打開染毒的程序“OEM設(shè)備IP配置.exe”,來到入口點代碼。
代碼窗口的信息有:第一列是內(nèi)存地址,第二列是代碼的十六進制數(shù)值,對應(yīng)第三列的匯編語句。圖3中1處:ebp寄存器本來用于指向上一個棧幀的基址,回溯函數(shù)的調(diào)用關(guān)系,這里卻用作重定位,尋址此區(qū)段的數(shù)據(jù),還做了簡單的變形,先減后加相近的數(shù)值。2、3處:從原程序的導(dǎo)入表中取得兩個重要系統(tǒng)函數(shù)的地址:LoadLibraryA和GetProcAddress,均為kernel32.dll的導(dǎo)出函數(shù),是獲取其他函數(shù)的絕代雙嬌,也是Shellcode的常見操作。Shellcode指一段偽裝成數(shù)據(jù)的代碼,向有漏洞的程序進行遠(yuǎn)程注入,根據(jù)目標(biāo)程序的內(nèi)存、堆??臻g進行精密的調(diào)整,使程序執(zhí)行的流程轉(zhuǎn)移到自己身上。它的特點是無硬編碼的尋址操作,必須對自身數(shù)據(jù)進行重定位。重定位使用call下一條指令將指令地址入棧,再彈出此地址用于相對尋址。為避免作為字符串被截斷、出現(xiàn)’