羅文華
(中國(guó)刑事警察學(xué)院 計(jì)算機(jī)犯罪偵查系,遼寧 沈陽(yáng)110854)
目前,針對(duì)惡意程序的取證分析已經(jīng)發(fā)展成為計(jì)算機(jī)法庭科學(xué)領(lǐng)域的重要組成部分。例如,進(jìn)行電腦安全事件調(diào)查時(shí),極有可能會(huì)遇到黑客所部署的惡意程序,此時(shí)就有必要鑒別出這些文件,并對(duì)其進(jìn)行分析。常規(guī)方法主要是通過(guò)激活?lèi)阂獬绦驑颖?,抓取分析其網(wǎng)絡(luò)傳輸信息,獲知被竊取的信息內(nèi)容以及信息傳輸?shù)哪康牡刂?;或是通過(guò)架設(shè)系統(tǒng)監(jiān)控工具,收集惡意程序引發(fā)的相關(guān)應(yīng)用程序及其環(huán)境變化的信息,從而判斷其對(duì)操作系統(tǒng)所造成的影響。但在實(shí)踐中發(fā)現(xiàn),多數(shù)情況下由于運(yùn)行條件已不滿(mǎn)足或是其內(nèi)部所設(shè)置的運(yùn)行有效期限已經(jīng)過(guò)期,惡意程序樣本往往無(wú)法被激活,或是改變自身行為,掩蓋惡意程序特征,應(yīng)用上述方法往往無(wú)法發(fā)現(xiàn)有價(jià)值的信息。此種情況下,便有必要針對(duì)惡意程序進(jìn)行逆向分析鑒定,從而發(fā)現(xiàn)相關(guān)證據(jù)或線(xiàn)索。
針對(duì)惡意程序進(jìn)行逆向分析,是指將可執(zhí)行惡意程序反匯編,通過(guò)反匯編代碼來(lái)理解其代碼功能,如各接口的數(shù)據(jù)結(jié)構(gòu)等,逆向分析原程序思路,全面或重點(diǎn)掌握惡意程序行為,從中分析出其他方法無(wú)法發(fā)現(xiàn)的證據(jù)或線(xiàn)索。本文在介紹逆向分析相關(guān)概念、方法與工具的基礎(chǔ)上,結(jié)合用于偷盜QQ賬號(hào)和密碼的木馬生成器 “QQ密碼大劃拉”及其生成的木馬QQ_DYP,詳細(xì)說(shuō)明查殼、脫殼、斷點(diǎn)設(shè)置、程序跟蹤、關(guān)鍵信息獲取等常用逆向分析方法,并力爭(zhēng)對(duì)一般性規(guī)律予以歸納和總結(jié),希望能夠?qū)阂獬绦蛉∽C領(lǐng)域的研究起到拋磚引玉的作用。
對(duì)于程序軟件而言,逆向工程歸結(jié)起來(lái)就是針對(duì)一個(gè)既沒(méi)有源代碼又沒(méi)有準(zhǔn)確文獻(xiàn)資料的現(xiàn)成程序,嘗試恢復(fù)出它的設(shè)計(jì)和實(shí)現(xiàn)細(xì)節(jié)。至1990年起,逆向工程已發(fā)展成為了解程序軟件“所作所為”的一套最重要的技術(shù)和工具,在現(xiàn)代軟件分析中有著廣泛的用途:
2.1.1 查找惡意代碼
許多病毒和惡意代碼的探測(cè)技術(shù)使用逆向工程來(lái)理解那些繁瑣的代碼是怎樣構(gòu)成和運(yùn)作的。通過(guò)逆向找出可用作特征碼的可識(shí)別模式,用于驅(qū)動(dòng)商業(yè)探測(cè)器和代碼掃描器。
2.1.2 發(fā)現(xiàn)意想不到的缺陷和錯(cuò)誤
即使是設(shè)計(jì)最完美的系統(tǒng)也可能存在漏洞,這是由于使用的“前向工程”開(kāi)發(fā)技術(shù)所固有的特點(diǎn)導(dǎo)致的。逆向工程可以幫助我們?cè)诎l(fā)生致命的軟件失效前識(shí)別缺陷和錯(cuò)誤。
2.1.3 查找是否使用了其他人所寫(xiě)的代碼
搞清楚在應(yīng)用程序的哪里使用了受保護(hù)的代碼和技術(shù)。這對(duì)于保護(hù)知識(shí)產(chǎn)權(quán)不被濫用是很重要的。逆向工程可用于檢測(cè)應(yīng)用程序是否包含所關(guān)心的軟件單元。
2.2.1 靜態(tài)分析
靜態(tài)分析指的是使用反匯編器或反編譯器將二進(jìn)制可執(zhí)行程序轉(zhuǎn)換為電子數(shù)據(jù)取證人員可以閱讀的表示形式。逆向工作通過(guò)人工閱讀和分析進(jìn)行。由于電子數(shù)據(jù)取證人員無(wú)法看到程序所處理的數(shù)據(jù)以及數(shù)據(jù)的流動(dòng)。靜態(tài)分析對(duì)電子數(shù)據(jù)取證人員要求較高,需要其能夠更好的理解代碼,對(duì)于程序加殼的情況,需要先執(zhí)行脫殼操作,或結(jié)合動(dòng)態(tài)分析才能完成逆向工作。
2.2.2 動(dòng)態(tài)分析
動(dòng)態(tài)分析是指將代碼轉(zhuǎn)換成易于理解的形式同時(shí),能夠在調(diào)試器中運(yùn)行代碼,并觀(guān)察其在運(yùn)行現(xiàn)場(chǎng)的行為,而不需要單純的依靠靜態(tài)的閱讀轉(zhuǎn)化好的代碼。該方法可以觀(guān)察程序的內(nèi)部數(shù)據(jù)以及數(shù)據(jù)對(duì)代碼流的影響,能夠提供更多的有價(jià)值信息。本文所介紹的針對(duì)惡意程序的逆向分析方法主要是基于動(dòng)態(tài)分析的。
2.3.1 系統(tǒng)監(jiān)控工具
逆向需要各種各樣的工具來(lái)尋找、監(jiān)控、研究以及剖析被逆向的程序。大多數(shù)工具都用來(lái)顯示操作系統(tǒng)收集到的有關(guān)應(yīng)用程序及其環(huán)境的信息。由于程序與外部世界的所有聯(lián)系都需要經(jīng)過(guò)操作系統(tǒng),所以使用操作系統(tǒng)來(lái)提取這些信息。系統(tǒng)監(jiān)控工具可以監(jiān)控網(wǎng)絡(luò)活動(dòng)、文件訪(fǎng)問(wèn)、注冊(cè)表訪(fǎng)問(wèn)等,常用的系統(tǒng)監(jiān)控工具主要有API Monitor、FileMon、RegMon等。
2.3.2 反匯編器
反匯編器是以程序的可執(zhí)行二進(jìn)制代碼作為輸入,生成包含整個(gè)或部分程序的匯編語(yǔ)言代碼的程序。因?yàn)閰R編語(yǔ)言代碼是目標(biāo)語(yǔ)言代碼簡(jiǎn)單的文本映射,所以這個(gè)轉(zhuǎn)化過(guò)程比較簡(jiǎn)單,常用的反匯編工具主要有IDA Pro、W32DASM。其中IDA Pro是一款功能非常強(qiáng)大的反匯編器,能夠提供非常詳細(xì)的反匯編代碼,并可以為給定的函數(shù)生成流程圖,實(shí)現(xiàn)了逆向工作中的許多附加特性,但其價(jià)格并不便宜。
2.3.3 調(diào)試器
調(diào)試器是一種程序,它允許相關(guān)人員在程序運(yùn)行的同時(shí)觀(guān)察程序。調(diào)試器的兩個(gè)最基本的特征是:設(shè)置斷點(diǎn)能力和代碼跟蹤能力。斷點(diǎn)允許用戶(hù)選擇程序中任何位置的函數(shù)或代碼行,一旦程序運(yùn)行到這一行,它就指示調(diào)試器暫停程序的運(yùn)行。這時(shí)可以釋放調(diào)試器,繼續(xù)運(yùn)行程序,或者開(kāi)始跟蹤程序。它是逆向工程中的一個(gè)非常重要的工具,常用的調(diào)試工具主要有OllyDBG、SoftICE。值得一提的是OllyDBG,其除了具有完備的調(diào)試功能外,還內(nèi)置有良好的反匯編功能,是軟件逆向中的一個(gè)重要法寶。
2.3.4 反編譯器
反編譯器比反匯編器更近了一步。反編譯器接受可執(zhí)行的二進(jìn)制文件,并試圖從中生成可讀性好的高級(jí)語(yǔ)言代碼。其思想是嘗試逆向編譯過(guò)程,以獲取最初的源代碼文件或接近于最初源代碼的文件。對(duì)于大多數(shù)平臺(tái)而言,真正恢復(fù)初始源代碼是不現(xiàn)實(shí)的。多數(shù)高級(jí)語(yǔ)言的重要元素在編譯過(guò)程中被省略掉了,且不可恢復(fù)。常用的反編譯工具主要有DeDe、DJ Decompiler。
目前,由于QQ賬號(hào)所涉及的Q幣與游戲裝備等虛擬財(cái)產(chǎn)可以轉(zhuǎn)化為現(xiàn)實(shí)世界中的貨幣,因此偷盜QQ賬號(hào)及密碼的現(xiàn)象日益猖獗,情節(jié)嚴(yán)重者甚至觸犯了相關(guān)法律?!癚Q密碼大劃拉”即是一款用于偷盜QQ賬號(hào)及密碼的惡意程序,該軟件屬于木馬生成器范疇,能夠根據(jù)使用者的設(shè)置(如收信郵箱、發(fā)信郵箱、發(fā)信郵箱密碼等)生成相應(yīng)木馬(配置界面如圖1所示),使用者可以利用生成的木馬來(lái)盜取他人QQ賬號(hào)和密碼。但該生成器本身就是一款能夠偷盜QQ賬號(hào)及密碼的木馬,使用者在生成自己盜號(hào)木馬的同時(shí),其自身的賬號(hào)與密碼也極可能被該生成器竊取。本節(jié)即以木馬生成器“QQ密碼大劃拉”及其默認(rèn)生成的木馬QQ_DYP為例,說(shuō)明逆向分析在電子數(shù)據(jù)取證中的實(shí)際應(yīng)用。
圖1 “QQ密碼大劃拉”木馬生成器配置界面
3.2.1 查殼與脫殼
首先用PEiD對(duì)木馬生成器 “QQ密碼大劃拉”查殼,如圖2所示。查殼結(jié)果表明該軟件未加殼,是由Visual C++語(yǔ)言編寫(xiě)的;接著使用OllyDBG加載該軟件,但卻提示該軟件為self-extracting或self-modifying文件,其啟動(dòng)函數(shù)中也未表現(xiàn)出Visual C++編寫(xiě)程序的典型特征,由此懷疑該軟件使用了偽裝的殼。
圖2 PEiD對(duì)QQ密碼大劃拉的查殼結(jié)果
利用PEiD的“Deep Scan”功能查出該惡意程序系使用UPX加的殼。接下來(lái)直接利用PEiD自帶的插件“PEiD Generic Unpacker”對(duì)其進(jìn)行脫殼。針對(duì)脫殼后的程序再執(zhí)行查殼操作,“Deep Scan”結(jié)果顯示該程序由“Borland Delphi 6.0-7.0”編寫(xiě),其啟動(dòng)函數(shù)中call語(yǔ)句與mov語(yǔ)句間隔出現(xiàn)[2](如圖3所示),滿(mǎn)足Delphi程序啟動(dòng)函數(shù)的典型特征,從而驗(yàn)證了查殼結(jié)果的正確。
圖3 脫殼后QQ密碼大劃拉的啟動(dòng)函數(shù)反匯編代碼
3.2.2 通過(guò)逆向分析發(fā)現(xiàn)隱秘的網(wǎng)頁(yè)地址
脫殼成功后,使用OllyDBG載入,對(duì)惡意程序進(jìn)行逆向分析。在OllyDBG中運(yùn)行該程序,主程序窗口出現(xiàn)后,點(diǎn)擊“生成木馬”按鈕,程序會(huì)彈出保存窗口以供選擇生成木馬的存放位置;此時(shí)不要點(diǎn)擊保存窗口的“保存”按鈕,而是點(diǎn)擊OllyDBG工具欄上的“暫停”按鈕,然后執(zhí)行ALT+K操作打開(kāi)函數(shù)窗口,查詢(xún)得到保存窗口對(duì)應(yīng)的 API函數(shù) DialogBoxIndirect-ParamW(圖4),可在此處設(shè)置斷點(diǎn),以追蹤被竊信息的發(fā)送地址;另外,由于該惡意程序要執(zhí)行生成木馬操作,便可設(shè)想在CreateFileA函數(shù)上設(shè)置斷點(diǎn),在OllyDBG的command窗口中執(zhí)行 “bp CreateFileA”命令,然后運(yùn)行程序,中斷后便可繼續(xù)分析。
圖4 函數(shù)窗口中保存窗口對(duì)應(yīng)的API函數(shù)
除了可以跟蹤API函數(shù),在關(guān)鍵字符串信息上設(shè)置斷點(diǎn),也可以達(dá)到調(diào)查取證的目的。載入惡意程序后,點(diǎn)擊“插件”→“Ultra字符串參考”→“查找 ASCII”,得到如圖5所示的字符串信息。從字符串信息中可以發(fā)現(xiàn)有“QQ2009_Hooker_Head”字樣出現(xiàn),其實(shí)際為該生成器設(shè)計(jì)者編制的實(shí)現(xiàn)竊取功能的函數(shù)名稱(chēng),故可在此設(shè)置斷點(diǎn)。
圖5 字符串信息中出現(xiàn)有“QQ2009_Hooker_Head”字樣
設(shè)置好斷點(diǎn)后,OllyDBG中運(yùn)行該惡意程序,在彈出的配置界面中隨意設(shè)置 “收信郵箱”、“發(fā)信郵箱”、“發(fā)信郵箱密碼”等信息;然后點(diǎn)擊“生成木馬”按鈕,在彈出的保存窗口中選擇好木馬存放位置,然后點(diǎn)擊“保存”按鈕;由于事先設(shè)置了斷點(diǎn),木馬并未生成,而是自動(dòng)中斷在了“QQ2009_Hooker_Head”的位置上(圖6)。
圖6 惡意程序自動(dòng)中斷在事先設(shè)置的斷點(diǎn)上
惡意程序在紅色斷點(diǎn)處(0045E310)中斷,點(diǎn)擊F8鍵單步運(yùn)行以分析程序。當(dāng)?shù)竭_(dá)地址0045E339時(shí),堆棧窗口中出現(xiàn)“SS:[0012F620]=009D3724,(ASCII" http://www.XXX.com/QQ456/XXX.asp")”字樣(圖7),此即該生成器竊取QQ賬號(hào)及密碼后發(fā)往的網(wǎng)頁(yè)地址。電子數(shù)據(jù)取證人員獲得該隱秘地址后,可以通過(guò)調(diào)查相關(guān)網(wǎng)站獲取犯罪分子用來(lái)訪(fǎng)問(wèn)的IP地址,進(jìn)而找到其真實(shí)的藏身之所。
圖7 堆棧窗口中出現(xiàn)被竊信息發(fā)往的網(wǎng)頁(yè)地址
3.3.1 查殼和脫殼
使用PEiD檢查QQ_DYP,顯示其是由Visual C++編寫(xiě)的。OllyDBG卻依然提示this software is a self-extracting or self-modifying file。使用OllyDBG加載QQ_DYP(如圖8所示),發(fā)現(xiàn)其啟動(dòng)函數(shù)與“QQ密碼大劃拉”頗為類(lèi)似,難怪PEiD做出同樣的誤判。
圖8 脫殼前的“QQ_DYP”啟動(dòng)函數(shù)指令序列
距離起始地址不遠(yuǎn)處,出現(xiàn)有 “jmp QQ_DYP. 00413EF0”字樣,判斷該指令是一個(gè)大跳轉(zhuǎn),因此執(zhí)行該指令來(lái)到地址00413EF0處(如圖9所示)。該地址存放有指令“pushad”,因此考慮使用ESP定律法進(jìn)行脫殼。
圖9 地址00413EF0處的指令序列
執(zhí)行pushad指令后,寄存器窗口顯示ESP值為0012FFA4,選擇數(shù)據(jù)窗口跟隨,并在數(shù)據(jù)窗口設(shè)置硬件訪(fǎng)問(wèn)斷點(diǎn)(Word),接下來(lái)按Shift+F9運(yùn)行該程序,即可來(lái)到另一個(gè)大跳轉(zhuǎn)——地址0041403F處(如圖10)。
圖10 地址0041403F處出現(xiàn)大跳轉(zhuǎn)語(yǔ)句
執(zhí)行地址 0041403F處的 “jmp QQ_DYP.0040 5380”指令,便來(lái)到程序真正的OEP(如圖11)。其啟動(dòng)函數(shù)滿(mǎn)足Borland Delphi啟動(dòng)函數(shù)特征。脫殼修復(fù)后,PEiD也判斷其由Borland Delphi 6.0-7.0編寫(xiě),從而驗(yàn)證了查殼結(jié)果的正確。
圖11 脫殼后的“QQ_DYP”啟動(dòng)函數(shù)指令序列
3.3.2 QQ_DYP的主要惡意行為
QQ_DYP對(duì)進(jìn)程explorer進(jìn)行注入,然后通過(guò)被注入的explorer進(jìn)程修改注冊(cè)表項(xiàng)為HKLMSOFTWAREMicrosoftWindowsCurrentVersionExplorer ShellExecuteHooks{08315C1A-9BA9-4B7C-A432-26885F78DF28},達(dá)到監(jiān)視系統(tǒng)的目的,并通過(guò)注冊(cè)SHELL擴(kuò)展組鍵,使木馬能夠伴隨系統(tǒng)進(jìn)程啟動(dòng)(如圖12所示)。同時(shí)使用SetWindowsHookExA函數(shù),通過(guò)將消息處理類(lèi)型設(shè)置為WH_KEYBOARD和WH_MOUSE以截獲鍵盤(pán)和鼠標(biāo)消息。
QQ_DYP還會(huì)釋放DLL文件于Program Files Common FilesMicrosoft SharedMSINFO目錄下(如圖13所示),該DLL文件會(huì)判斷加載自身的進(jìn)程名,如果是QQ安全檢查主程序則結(jié)束該進(jìn)程,如果為QQ. exe則刪除QQ安裝目錄下的npkcrypt.sys(QQ鍵盤(pán)鎖保護(hù)文件,部分版本的QQ擁有此文件),使QQ的鍵盤(pán)安全鎖失效。同時(shí)釋放名為“_xr.bat”的批處理文件,內(nèi)容為“:try del"D:digital investigationQQ_DYP(unpack)QQ_DYP脫殼后 _.exe"if exist"D:digital investigationQQ_DYP (unpack)QQ_DYP脫殼后 _. exe"goto try”,達(dá)到刪除自身的目的。
調(diào)試QQ_DYP時(shí),我們發(fā)現(xiàn)該惡意程序會(huì)將字符串或解密信息輸出至009D0000開(kāi)始的內(nèi)存地址空間中,因此在該內(nèi)存地址空間設(shè)置寫(xiě)入斷點(diǎn),并且在調(diào)試選項(xiàng)設(shè)置時(shí)不要忽略?xún)?nèi)存訪(fǎng)問(wèn)異常,這樣經(jīng)過(guò)跟蹤調(diào)試,009D009C處會(huì)出現(xiàn)如圖14所示的解密信息。從圖中可以看出,QQ_DYP不僅會(huì)將QQ賬號(hào)與密碼信息發(fā)送至用戶(hù)配置的郵箱信息中,還會(huì)像“QQ密碼大劃拉”一樣,將信息發(fā)送至事先內(nèi)置的ASP網(wǎng)頁(yè)地址。
惡意程序編寫(xiě)者一般具有較高的專(zhuān)業(yè)知識(shí)水平,他們會(huì)千方百計(jì)的模糊惡意程序行為,隱藏其真實(shí)意圖。這就對(duì)電子數(shù)據(jù)取證人員提出了更高的要求,需要對(duì)反匯編代碼進(jìn)行更深入的分析[3]。本文即是針對(duì)一特定的惡意程序,描述其逆向分析全過(guò)程,并對(duì)一般性方法進(jìn)行歸納總結(jié)。需要指出的是,惡意程序千變?nèi)f化,本文所描述的方法還具有相當(dāng)?shù)木窒扌?。比如在脫殼方面,該生成器及其生成的木馬使用的都是比較簡(jiǎn)單的壓縮殼,脫殼相對(duì)簡(jiǎn)單,而對(duì)于更為復(fù)雜的加密殼的破解研究,本身就是一個(gè)十分深入的領(lǐng)域,本文對(duì)此并未涉及;關(guān)鍵信息獲取方面,雖然介紹了一些典型斷點(diǎn)的設(shè)置方法,但實(shí)際上整個(gè)惡意程序的分析花費(fèi)了作者大量的時(shí)間與精力在繁雜的反匯編代碼中摸索穿行,因此針對(duì)快速定位關(guān)鍵信息的研究依然有很長(zhǎng)的路要走;另外,如何將逆向分析方法與其他分析方法更好的結(jié)合,更加全面徹底的揭示惡意程序隱藏的秘密,也將是作者未來(lái)的主要研究方向之一。
[1]Eldad Eilam.逆向工程揭秘[M].北京:電子工業(yè)出版社,2007:4-16.
[2]段鋼.加密與解密[M].北京:電子工業(yè)出版社,2008:71-99.
[3]金波,黃道麗,夏榮.電子數(shù)據(jù)鑒定標(biāo)準(zhǔn)體系研究[J].中國(guó)司法鑒定,2011,(1):49-52.