徐國(guó)天
(中國(guó)刑事警察學(xué)院網(wǎng)絡(luò)犯罪偵查系 遼寧 沈陽(yáng) 110035)
木馬惡意程序隱藏在受害者計(jì)算機(jī)系統(tǒng)或智能終端設(shè)備內(nèi),在后臺(tái)悄悄記錄用戶(hù)輸入的敏感信息,竊取受害者主機(jī)內(nèi)的涉密文件,甚至監(jiān)聽(tīng)受害者的語(yǔ)音、視頻和網(wǎng)絡(luò)通信數(shù)據(jù)[1]。可以說(shuō),木馬惡意程序已對(duì)互聯(lián)網(wǎng)安全構(gòu)成嚴(yán)重威脅,研究木馬惡意程序的電子數(shù)據(jù)取證方法對(duì)公安機(jī)關(guān)的偵查辦案工作有實(shí)際意義。
目前,木馬惡意程序常用的取證方法是逆向分析法[2],這種方法是使用Ollydbg等反匯編分析工具將木馬的樣本程序反編譯為匯編代碼,再通過(guò)分析匯編程序了解木馬的執(zhí)行邏輯,進(jìn)而提取出相關(guān)線(xiàn)索信息,完成取證分析工作。逆向分析方法要求取證人員具備匯編語(yǔ)言程序設(shè)計(jì)基礎(chǔ),同時(shí)需要閱讀的匯編代碼量也非常大,這些因素導(dǎo)致取證周期長(zhǎng)、難度大。為了降低取證難度、提高分析效率,本文提出一種基于“關(guān)鍵函數(shù)”斷點(diǎn)設(shè)置的木馬惡意程序取證分析方法。
通過(guò)對(duì)多個(gè)木馬樣本進(jìn)行分析,我們發(fā)現(xiàn)不管是什么類(lèi)型的木馬惡意程序通常都要實(shí)現(xiàn)幾個(gè)特定的核心功能,如進(jìn)程隱藏、開(kāi)機(jī)自動(dòng)運(yùn)行、躲避殺毒軟件查殺、繞過(guò)防火墻攔截、實(shí)現(xiàn)與攻擊者的遠(yuǎn)程通信聯(lián)絡(luò)、實(shí)現(xiàn)特定的惡意功能等[3]。這些核心功能在實(shí)現(xiàn)時(shí)都需要使用特定的系統(tǒng)函數(shù),如發(fā)送郵件需要使用connect和socket函數(shù),寫(xiě)注冊(cè)表實(shí)現(xiàn)自啟動(dòng)需要使用RegOpenKey函數(shù),實(shí)現(xiàn)鍵盤(pán)記錄需要獲得窗口標(biāo)題,這時(shí)通常使用GetWindowText函數(shù)。在這些函數(shù)上設(shè)置訪(fǎng)問(wèn)斷點(diǎn)可以獲知木馬的核心功能,也可以通過(guò)傳遞給函數(shù)的相關(guān)參數(shù)得到重要的線(xiàn)索信息,例如通過(guò)GetWindowText函數(shù)可以獲知木馬對(duì)哪個(gè)窗口標(biāo)題進(jìn)行了監(jiān)控。
基于“關(guān)鍵函數(shù)”斷點(diǎn)設(shè)置的木馬惡意程序取證方法如圖1所示,首先取證工具Lordpe分析木馬程序使用了哪些系統(tǒng)函數(shù),從一些關(guān)鍵的系統(tǒng)函數(shù)可以初步判斷出惡意程序采用了哪些功能(例如木馬使用了createfile和deletefile函數(shù),說(shuō)明它很可能向硬盤(pán)釋放了特定文件,同時(shí)還進(jìn)行了文件刪除操作),在關(guān)鍵函數(shù)上設(shè)置訪(fǎng)問(wèn)斷點(diǎn),動(dòng)態(tài)調(diào)試木馬程序,程序會(huì)自動(dòng)停在斷點(diǎn)位置,從函數(shù)的傳入?yún)?shù)可以提取出關(guān)鍵的涉案信息(例如創(chuàng)建或刪除的文件名稱(chēng)和路徑),使用這種方法可以簡(jiǎn)化木馬程序的取證分析工作。
圖1 基于“關(guān)鍵函數(shù)”斷點(diǎn)設(shè)置的木馬惡意程序取證分析方法
本文以一款名為“紅蜘蛛”的盜號(hào)木馬為例,研究基于“關(guān)鍵函數(shù)”斷點(diǎn)設(shè)置的惡意程序取證分析方法。這款木馬程序文件的名稱(chēng)是“紅蜘蛛v119版.exe”,文件大小為57344字節(jié),文件的MD5值為7C49FF0DE960DC67C1F52C00CD9E3423。本文研究對(duì)象為脫殼后的木馬惡意程序,具體的脫殼技術(shù)不在文章討論范圍內(nèi)。
首先使用Loadpe工具打開(kāi)“紅蜘蛛v119版.exe”,查看木馬程序使用了哪些系統(tǒng)函數(shù),結(jié)果如圖2所示。木馬程序使用了KERNEL32.dll和ADVAPI32.dll兩個(gè)動(dòng)態(tài)鏈接庫(kù),點(diǎn)擊每個(gè)dll文件名,會(huì)顯示出木馬使用了該dll文件中的哪些系統(tǒng)函數(shù)。
我們首先對(duì)CreateFile函數(shù)進(jìn)行分析,函數(shù)的原型定義如圖3所示。這是一個(gè)多功能函數(shù),可打開(kāi)或創(chuàng)建以下對(duì)象:通信資源、控制臺(tái)、磁盤(pán)驅(qū)動(dòng)器、目錄、文件、管道、郵槽,返回可訪(fǎng)問(wèn)的句柄。函數(shù)共有6個(gè)參數(shù),lpFileName表示即將打開(kāi)的文件名稱(chēng),通過(guò)這個(gè)參數(shù)可以確定木馬創(chuàng)建的文件名稱(chēng)和存儲(chǔ)路徑。dwDesiredAccess指定訪(fǎng)問(wèn)對(duì)象的模式,如果值為GENERIC_WRITE 表示允許對(duì)設(shè)備進(jìn)行寫(xiě)訪(fǎng)問(wèn);如果該值為GENERIC_READ表示允許對(duì)設(shè)備進(jìn)行讀訪(fǎng)問(wèn);如果值為零,表示只允許獲取與一個(gè)設(shè)備有關(guān)的信息。dwShareMode表示共享模式,如果值為零表示不共享,例如值為FILE_SHARE_READ表示讀請(qǐng)求可以成功執(zhí)行;值為FILE_SHARE_DELETE表示刪除請(qǐng)求可以成功執(zhí)行;如果值為FILE_SHARE_WRITE表示寫(xiě)請(qǐng)求可以成功執(zhí)行。lpSecurityAttributes指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)體指針,定義了文件的安全屬性。dwCreationDisposition代表文件如何創(chuàng)建,具體含義結(jié)合木馬實(shí)例分析。dwFlagsAndAttributes表示文件屬性。hTemplateFile存儲(chǔ)一個(gè)文件或設(shè)備句柄,表示以這個(gè)參數(shù)給出的句柄為模板創(chuàng)建文件。它將指定文件的相關(guān)屬性復(fù)制到新創(chuàng)建的文件上,這個(gè)參數(shù)可用于將某個(gè)新創(chuàng)建文件的屬性設(shè)置成與現(xiàn)有文件屬性完全相同,這種情況下函數(shù)會(huì)自動(dòng)忽略dwFlagsAndAttributes參數(shù)。通常情況下這個(gè)參數(shù)值設(shè)置為NULL,表示不使用任何模板。
圖2 使用Loadpe查看木馬程序使用了哪些系統(tǒng)函數(shù)
圖3 CreateFile函數(shù)原型定義
使用Ollydbg在CreateFileA函數(shù)上設(shè)置訪(fǎng)問(wèn)斷點(diǎn),當(dāng)木馬程序中斷在這個(gè)位置時(shí),從lpFileName參數(shù)可以獲得木馬向硬盤(pán)釋放文件的路徑和名稱(chēng)。圖4顯示的是木馬程序第一次中斷時(shí)Ollydbg顯示的系統(tǒng)堆棧狀態(tài),通過(guò)系統(tǒng)堆??梢钥吹侥抉R程序傳遞給CreateFileA函數(shù)的7個(gè)參數(shù)值。第一個(gè)參數(shù)FileName顯示木馬程序向C:WINDOWSsystem32路徑釋放了一個(gè)名為redspider.dll的文件。
圖4 第一次中斷時(shí),系統(tǒng)堆棧顯示的參數(shù)信息
再次按下F9鍵,木馬程序第二次中斷在CreateFileA函數(shù)的入口位置。圖5顯示的是第二次中斷時(shí),系統(tǒng)堆棧顯示的參數(shù)信息。可見(jiàn)木馬向C盤(pán)根目錄釋放了一個(gè)名為inflexible.wav的文件。
圖5 第二次中斷時(shí),系統(tǒng)堆棧顯示的參數(shù)信息
從擴(kuò)展名來(lái)看,inflexible.wav應(yīng)該是一個(gè)音頻文件。但是,查看該文件屬性顯示大小只有303字節(jié),顯然不符合音頻文件的容量特點(diǎn)。使用記事本打開(kāi)這個(gè)文件,查看到的結(jié)果如圖6所示。這組數(shù)據(jù)疑似木馬設(shè)置的相關(guān)參數(shù),發(fā)送郵件服務(wù)器使用的是smtp.163.com,發(fā)信郵箱是stp888@163.com,郵箱登錄密碼是86982430。其他信息的含義和作用需要通過(guò)匯編代碼分析來(lái)加以確定。
圖6 inflexible.wav文件內(nèi)容
為了防止惡意程序被發(fā)現(xiàn),木馬運(yùn)行之后通常不會(huì)在受害者主機(jī)系統(tǒng)內(nèi)產(chǎn)生一個(gè)獨(dú)立的進(jìn)程,而是將自身隱藏到某個(gè)合法進(jìn)程之內(nèi)。目前經(jīng)常采用的進(jìn)程隱藏技術(shù)是遠(yuǎn)程線(xiàn)程植入,木馬源程序以dll文件形式存在,通過(guò)遠(yuǎn)程線(xiàn)程植入方式進(jìn)入目標(biāo)進(jìn)程運(yùn)行。這樣一來(lái),就可以獲得合法進(jìn)程的相關(guān)權(quán)限。例如用戶(hù)計(jì)算機(jī)上的防火墻軟件通常會(huì)攔截某個(gè)客戶(hù)程序與因特網(wǎng)的主動(dòng)連接請(qǐng)求,但是不會(huì)攔截IE瀏覽器進(jìn)程與外界的通信連接,否則用戶(hù)將不能瀏覽任何網(wǎng)頁(yè)信息。木馬程序只要將自身植入IE瀏覽器進(jìn)程,就可以合法進(jìn)程身份通過(guò)防火墻的攔截,與外界進(jìn)行網(wǎng)絡(luò)通信。
使用Loadpe查看到“紅蜘蛛v119版.exe”木馬程序使用了4個(gè)涉及遠(yuǎn)程線(xiàn)程植入的系統(tǒng)函數(shù):OpenProcess、VirtualAllocEx、WriteProcessMemory和CreateRemoteThread。OpenProcess函數(shù)的主要功能是打開(kāi)一個(gè)進(jìn)程,同時(shí)返回該進(jìn)程的句柄。WriteProcessMemory函數(shù)負(fù)責(zé)將dll惡意程序數(shù)據(jù)內(nèi)容寫(xiě)入到合法進(jìn)程的地址空間里。CreateRemoteThread函數(shù)負(fù)責(zé)遠(yuǎn)程啟動(dòng)dll惡意程序。
從這些系統(tǒng)函數(shù)傳遞的參數(shù)里可以獲得重要的涉案信息,參數(shù)關(guān)系分析如圖7所示。OpenProcess函數(shù)的第三個(gè)參數(shù)dwProcessId代表被打開(kāi)的目標(biāo)進(jìn)程PID,利用這個(gè)數(shù)值可以確定木馬附著到哪個(gè)系統(tǒng)進(jìn)程上。OpenProcess函數(shù)的返回值是一個(gè)HANDLE類(lèi)型的句柄,這個(gè)值和WriteProcessMemory函數(shù)的第一個(gè)參數(shù)以及CreateRemoteThread函數(shù)的第一個(gè)參數(shù)值相同,通過(guò)該值可以進(jìn)行關(guān)聯(lián)。WriteProcessMemory函數(shù)的第三個(gè)參數(shù)lpBuffer存儲(chǔ)了dll惡意程序的路徑和名稱(chēng),第二個(gè)參數(shù)存儲(chǔ)了惡意程序?qū)懭雰?nèi)存的起始地址,這個(gè)參數(shù)和CreateRemoteThread函數(shù)的第五個(gè)參數(shù)值相同。通過(guò)這些函數(shù)之間的相互關(guān)系,可以確定一個(gè)dll惡意程序被加載到哪個(gè)系統(tǒng)進(jìn)程之中。
使用Ollydbg對(duì)“紅蜘蛛v119版.exe”木馬程序進(jìn)行分析,在圖7所示3個(gè)函數(shù)上設(shè)置斷點(diǎn),提取出函數(shù)中斷時(shí)傳遞的內(nèi)存參數(shù),分析結(jié)果如圖8所示。OpenProcess函數(shù)的ProcessId參數(shù)值為3784,調(diào)出任務(wù)管理器查詢(xún)到這個(gè)PID對(duì)應(yīng)的是explorer進(jìn)程。函數(shù)返回一個(gè)句柄,值為0X0028,這個(gè)值與WriteProcessMemory函數(shù)和CreateRemoteThread函數(shù)的第一個(gè)參數(shù)相同,說(shuō)明木馬使用這兩個(gè)函數(shù)向explorer進(jìn)程寫(xiě)入數(shù)據(jù)。WriteProcessMemory函數(shù)的第三個(gè)參數(shù)存儲(chǔ)了被寫(xiě)入dll文件的存儲(chǔ)路徑和名稱(chēng),查看起始地址為0X00407CFC的內(nèi)存區(qū)域可以看到“C:WINDOWSsystem32 edspider.dll”字符串,可見(jiàn)惡意dll程序被附著到explorer進(jìn)程。
圖7 從函數(shù)參數(shù)中提取涉案線(xiàn)索
圖8 使用Ollydbg分析函數(shù)參數(shù)
木馬程序?yàn)榱藢?shí)現(xiàn)對(duì)受害者主機(jī)的長(zhǎng)久、穩(wěn)定控制,通常要實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)運(yùn)行機(jī)制,即木馬程序在受害者主機(jī)每次開(kāi)機(jī)后自動(dòng)運(yùn)行。木馬自動(dòng)運(yùn)行方式的分析對(duì)于從主機(jī)內(nèi)清除惡意程序至關(guān)重要。使用Loadpe查看“紅蜘蛛v119版.exe”,發(fā)現(xiàn)在ADVAPI32.dll鏈接庫(kù)下存在3個(gè)與注冊(cè)表操作相關(guān)的系統(tǒng)函數(shù):RegOpenKeyExA、RegSetValueExA和RegCloseKey函數(shù)。對(duì)注冊(cè)表執(zhí)行寫(xiě)入操作是實(shí)現(xiàn)程序開(kāi)機(jī)運(yùn)行的常用方式,我們先來(lái)分析這幾個(gè)函數(shù)的參數(shù)關(guān)系。
圖9說(shuō)明了RegOpenKeyEx和RegSetValueEx函數(shù)的參數(shù)關(guān)系,RegOpenKeyEx函數(shù)的第一個(gè)參數(shù)hKey存儲(chǔ)了準(zhǔn)備打開(kāi)的主鍵、第二個(gè)參數(shù)lpSubKey存儲(chǔ)了準(zhǔn)備打開(kāi)的子鍵、第三個(gè)參數(shù)phKResult和RegSetValueEx函數(shù)的第一個(gè)參數(shù)存儲(chǔ)的是相同的句柄值,通過(guò)這個(gè)數(shù)值可以確定是對(duì)注冊(cè)表哪個(gè)鍵值進(jìn)行操作。RegSetValueEx函數(shù)的第二個(gè)參數(shù)lpValueName存儲(chǔ)的是寫(xiě)入的變量名稱(chēng),第五個(gè)參數(shù)存儲(chǔ)寫(xiě)入的變量值。通過(guò)在這兩個(gè)函數(shù)上設(shè)置斷點(diǎn),可以獲得傳遞的參數(shù)值,進(jìn)而明確木馬向那個(gè)注冊(cè)表鍵值寫(xiě)入了什么數(shù)據(jù)。
圖9 注冊(cè)表操作函數(shù)參數(shù)關(guān)系分析
圖10 使用Ollydbg分析函數(shù)的參數(shù)關(guān)系
使用Ollydbg對(duì)“紅蜘蛛v119版.exe”木馬程序進(jìn)行分析,在圖9所示兩個(gè)函數(shù)上設(shè)置斷點(diǎn),提取出函數(shù)中斷時(shí)傳遞的參數(shù)值,分析結(jié)果如圖10所示。RegOpenKeyEx函數(shù)的前兩個(gè)參數(shù)hKey和SubKey指明木馬操作的注冊(cè)表鍵值為“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun”,這個(gè)鍵值存儲(chǔ)的是計(jì)算機(jī)的開(kāi)機(jī)啟動(dòng)項(xiàng),該鍵值下的應(yīng)用程序?qū)⒃谟?jì)算機(jī)開(kāi)機(jī)后自動(dòng)運(yùn)行。第五個(gè)參數(shù)存儲(chǔ)的是打開(kāi)句柄,本例值為0X00000024,這個(gè)數(shù)值與RegSetValueEx函數(shù)的第一個(gè)參數(shù)值相同,通過(guò)該值可以確定RegSetValueEx函數(shù)是對(duì)之前打開(kāi)的鍵值進(jìn)行寫(xiě)入操作,寫(xiě)入的變量名為RedSpider,變量值存儲(chǔ)在第五個(gè)參數(shù)中,即內(nèi)存地址0X00407C84位置。直接查看這個(gè)內(nèi)存位置,可以看到存儲(chǔ)的數(shù)值為“C:WINDOWSsystem32 edspider.exe”,說(shuō)明計(jì)算機(jī)開(kāi)機(jī)后,將自動(dòng)運(yùn)行系統(tǒng)目錄下的redspider.exe程序,但此時(shí)該程序文件還沒(méi)有生成。
“紅蜘蛛v119版.exe”主體程序引用的動(dòng)態(tài)鏈接庫(kù)中沒(méi)有使用到網(wǎng)絡(luò)通信函數(shù)和鍵盤(pán)監(jiān)控等相關(guān)函數(shù),因此,對(duì)主體程序的分析可以暫時(shí)告一段落,分析結(jié)論如圖11所示。通過(guò)文件操作行為分析發(fā)現(xiàn)木馬向系統(tǒng)目錄下釋放了一個(gè)名為redspider.dll動(dòng)態(tài)鏈接庫(kù)文件,向C盤(pán)根目錄下釋放了一個(gè)名為inflexible.wav的參數(shù)配置文件。通過(guò)進(jìn)程隱藏方式分析發(fā)現(xiàn)木馬程序通過(guò)遠(yuǎn)程線(xiàn)程植入的方式將redspider.dll植入explorer進(jìn)程空間運(yùn)行。通過(guò)自動(dòng)運(yùn)行方式分析發(fā)現(xiàn)木馬在注冊(cè)表啟動(dòng)鍵下寫(xiě)入鍵值,實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)運(yùn)行redspider.exe程序,但是此時(shí)這個(gè)exe文件還未生成?!凹t蜘蛛v119版.exe”的主要任務(wù)已經(jīng)完成,接下來(lái)木馬的主要功能轉(zhuǎn)由redspider.dll惡意程序來(lái)實(shí)現(xiàn)。
本文提出了一種基于“關(guān)鍵函數(shù)”斷點(diǎn)設(shè)置的木馬惡意程序取證分析方法,并通過(guò)一個(gè)實(shí)例對(duì)這種方法的具體應(yīng)用進(jìn)行了研究。這種取證方法從木馬惡意程序使用的核心系統(tǒng)函數(shù)入手,通過(guò)設(shè)置斷點(diǎn)、獲取參數(shù)值,進(jìn)而判斷惡意程序的主要功能,可以規(guī)避大量匯編代碼的閱讀工作、簡(jiǎn)化分析難度、縮短取證周期。
圖11 木馬主體程序分析結(jié)論