我在上一章里面給大家展示的是我之前作為病毒分析師時(shí)候,每天大部分時(shí)間是如何分析樣本的。當(dāng)時(shí)我們只需要對(duì)樣本的黑白做判斷就好,一般來說并不需要了解樣本的詳細(xì)功能,因此只要找到目標(biāo)樣本的不正常的地方,然后直接拉黑就好。但實(shí)際上,如果我們想要寫病毒分析報(bào)告,或者我們的客戶需要我們深入研究樣本進(jìn)而寫出病毒清除方案的話,那么上一章所介紹的技術(shù)就不能使用了,因?yàn)槟莾H僅是表層化的判斷工作,我們一定要使用更加專業(yè)的工具,利用動(dòng)靜結(jié)合技術(shù)進(jìn)行分析,才可以將惡意程序的所作所為展現(xiàn)出來。而我們現(xiàn)在的進(jìn)階篇的內(nèi)容,就主要討論如何對(duì)惡意程序進(jìn)行詳細(xì)的分析。在整個(gè)進(jìn)階篇里面,我們主要依靠的是IDA Pro與OllyDbg。
在給大家介紹IDA與OD的使用方法之前,我想先教給大家一種簡(jiǎn)單的技術(shù),用于了解目標(biāo)樣本的行為,也就是利用“火絨劍”這款軟件,在虛擬機(jī)里面監(jiān)控目標(biāo)樣本究竟做了哪些事情。我們可以首先把這次課程的樣本sample.exe復(fù)制到虛擬機(jī)里面,打開“火絨劍”,選擇“過濾”->“進(jìn)程過濾”->“添加”,在新彈出的窗口中輸入文件名稱,也就是sample.exe,然后確定。之后再開啟監(jiān)控,并且在虛擬機(jī)里面運(yùn)行這次的樣本。于是可以得到以下監(jiān)控結(jié)果:
由監(jiān)控結(jié)果可以清晰地看到,這個(gè)樣本在啟動(dòng)文件夾里面創(chuàng)建了一個(gè)名為wsample01b.exe的程序,這樣每當(dāng)系統(tǒng)啟動(dòng)的時(shí)候,這個(gè)wsample01b.exe就會(huì)自動(dòng)運(yùn)行起來了。那么有理由認(rèn)為,這個(gè)惡意程序很可能是將自身拷貝到了啟動(dòng)文件夾,以達(dá)到隱藏執(zhí)行的目的。
如果大家不理解“動(dòng)作”下面的一系列字符是什么意思的話,那么可以選擇“過濾”->“動(dòng)作過濾”,展開對(duì)應(yīng)的加號(hào),就可以查看字符對(duì)應(yīng)的動(dòng)作的意義了:
一般來說,我們比較關(guān)注的是文件、注冊(cè)表與網(wǎng)絡(luò)這三方面的行為,比如創(chuàng)建了什么文件,刪除了什么文件,對(duì)注冊(cè)表做了哪些修改等等。因?yàn)檫@三方面與我們的系統(tǒng)最為息息相關(guān)。
使用“火絨劍”可以監(jiān)測(cè)到目標(biāo)樣本的行為,可是對(duì)于我們分析師來說,我們希望更進(jìn)一步地去探究目標(biāo)樣本的原理,因此往往需要使用更加專業(yè)的工具來實(shí)現(xiàn)逆向分析的目的。對(duì)于靜態(tài)分析來說,我們最常用的就是IDA Pro了。
這里我們使用IDA Pro來試著分析一下我們這次的樣本,將樣本文件拖入IDA,我個(gè)人的習(xí)慣,是要將代碼的地址也調(diào)出來,以方便分析??梢栽诓藛螜谶x擇“Options”->“General”,在新彈出的窗口中選擇“Line prefixes”,然后點(diǎn)擊OK:
這樣我們的反匯編代碼的前面就會(huì)出現(xiàn)地址信息了:
一般來說,IDA在載入一個(gè)PE文件的時(shí)候,會(huì)為我們停留在main函數(shù)的位置,所以我們從這里開始分析就好。比如對(duì)于這個(gè)程序來說,它首先是利用call命令調(diào)用了sub_401000這個(gè)函數(shù),接下來又調(diào)用了GetActiveWindow函數(shù)用于獲取活動(dòng)窗口的窗口句柄,并將這個(gè)句柄自動(dòng)地保存在eax寄存器里面,作為接下來的MessageBox函數(shù)的第一個(gè)參數(shù)。隨后再利用MessageBox函數(shù)彈出一個(gè)對(duì)話框,對(duì)話框的標(biāo)題是“MESSAGE”,內(nèi)容是“Copied!”。最后程序也就直接返回了。
不過這個(gè)程序很明顯并不是僅僅彈出一個(gè)對(duì)話框那么簡(jiǎn)單,由剛才的“火絨劍”的監(jiān)控結(jié)果可以看到,這個(gè)程序還有文件復(fù)制一類的操作。那么有理由懷疑說,它的這些操作應(yīng)該就是由sub_401000這個(gè)函數(shù)實(shí)現(xiàn)的。那么我們不妨雙擊進(jìn)入這個(gè)函數(shù)來實(shí)際看一下:
其實(shí)我們分析惡意程序,大部分情況下只要分析它所調(diào)用的函數(shù)序列就好,通過這些函數(shù)序列,我們就可以很輕易地弄清楚這個(gè)程序的行為了。而說到API函數(shù),那么我建議大家在遇到不認(rèn)識(shí)的函數(shù)的時(shí)候,一定要善于利用微軟的MSDN,因?yàn)镸SDN對(duì)函數(shù)的講解才是最為權(quán)威的,也是最為詳細(xì)的,不過MSDN是英文的,因此我也建議大家一定要提高自己的英文水平,其實(shí)只要你有英語四級(jí)的水平,那么MSDN的單詞應(yīng)該也基本沒什么問題的,常出現(xiàn)的單詞也就那么幾個(gè),還是很容易掌握的。畢竟很多先進(jìn)的技術(shù)與優(yōu)秀的資料,都是以英文文檔的形式呈現(xiàn)的,如果你的英文水平不過關(guān)的話,對(duì)于你的計(jì)算機(jī)技術(shù)的學(xué)習(xí),確實(shí)會(huì)有所阻礙。
回到我們的樣本,首先它調(diào)用了GetModuleFileName用于獲取自身完整的路徑名稱,這個(gè)路徑里面是帶有這個(gè)文件自己的名字的。接下來調(diào)用SHGetFolderPath來調(diào)用特殊文件夾的路徑,由它的第二個(gè)參數(shù)“7”可以知道,它獲取的是啟動(dòng)文件夾的路徑。我之所以知道7代表的含義,是因?yàn)槲也榱薓SDN。之后使用lstrcat函數(shù)將剛才獲取的啟動(dòng)文件夾的路徑與字符"wsample01b.exe"進(jìn)行連接,最后再使用CopyFile將自身復(fù)制到啟動(dòng)文件里面,啟動(dòng)文件夾中的文件名稱就是wsample01b.exe。
至此,我們就已經(jīng)使用IDA完整地分析出了這個(gè)樣本的原理。其實(shí)我們也可以利用F5鍵,將這段反匯編代碼翻譯成C語言的形式,會(huì)更加有利于我們的分析工作:
使用OD可以動(dòng)態(tài)地跟蹤目標(biāo)程序運(yùn)行到每一步的情況。舉個(gè)例子,比如我們不清楚GetModuleFileName究竟獲取了什么結(jié)果,那么完全可以利用OD來動(dòng)態(tài)調(diào)試到這一步,從而看到它的結(jié)果。我們可以先在IDA里面找到這個(gè)函數(shù)的被調(diào)用的地址,也就是0x00401025,這也是為什么我要在一開始調(diào)出地址的原因。然后在OD里面,在反匯編代碼區(qū),利用快捷鍵Ctrl+G,輸入401025,就可以直接來到函數(shù)的調(diào)用位置,此時(shí)按下F4,就可以直接執(zhí)行到這里。接下來我們可以按下F8單步執(zhí)行,看一下結(jié)果:
可見,這里已經(jīng)完整顯示出了所獲取的路徑信息,就是當(dāng)前文件的完整路徑,并且包含文件名,這就是動(dòng)態(tài)調(diào)試帶給我們的便利。
這次我給大家講解了一個(gè)最簡(jiǎn)單的動(dòng)靜結(jié)合的調(diào)試?yán)?,希望大家能自己親手去嘗試一下,一定會(huì)有很多的收獲。