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