在今年的上一個季度,我們發現有越來越多的惡意軟件開始使用各種加密、封裝和加殼等保護技術來對惡意代碼進行混淆處理,以防止系統或程序對其進行識別。除此之外,這些技術甚至還會讓研究人員對其的靜態分析變得更加困難。雖然越來越多的惡意軟件開發人員開始使用這種保護性的加殼技術,但這也直接導致了另一種惡意軟件分析方法的誕生。
其中的一種分析方法,就是通過分析惡意代碼中負責告訴系統如何執行特定操作的API調用以及控制命令。在這種方法中,我們不需要對已加殼的文件進行逆向分析,因為我們只需要對惡意代碼所執行的API調用來進行動態分析,就可以知道某個特定文件具體的功能了。通過這樣的方法(分析API調用),我們可以確定一個文件是否具有惡意性,而有些API調用只有某些特殊類型的惡意軟件才會去使用。比如說,常用的惡意Payload下載API是URLDownloadToFile,而GetWindowDC這個API一般用于間諜軟件或鍵盤記錄器等惡意工具(用于屏幕截取)。
接下來,我們會對一個惡意軟件樣本進行分析,并給大家介紹這項技術的實現方法。
木馬樣本
我們所要分析的惡意軟件樣本是一個名叫1.exe的著名木馬,它的SHA256如下:
0213b36ee85a301b88c26e180f821104d5371410ab4390803eaa39fac1553c4c
這個文件是加了殼的(VMProtect),所以我們就很難使用反編譯工具來對其進行分析了。由于我個人并不擅長逆向工程分析,因此我打算通過分析該文件在沙盒環境的執行過程中的API調用來了解它的行為。
下面這張圖片中,顯示的是我們通過觀察它在沙盒環境中的運行情況所得到的API調用列表:
首先,我們來看一看這些函數到底有什么作用。其中有部分函數可以在微軟的網站中找到相關內容:
為特定模塊獲取模塊處理器,該模塊必須在調用進程中被加載。GetModuleHandleA (ANSI)
獲取一個輸出函數的地址,或從指定的動態鏈接庫(DLL)獲取變量。
將一個字符串轉換成整型
這個函數將創建一個流對象,該對象可以使用一個HGLOBAL內存處理器來存儲流內容。
查找字符串中出現的第一個子字符串,匹配是大小寫敏感的。StrStrA(ANSI)
向特定的緩沖區中寫入格式化數據,可根據相應的格式化字符串標準向輸出緩沖區中寫入任意參數。wsprintfA (ANSI)
該函數可以初始化WinHTTP函數并返回一個WinHTTP-session處理器。
獲取包含指定模塊的文件的完整路徑,該模塊必須在當前的調用進程中被加載。GetModuleFileNameW (Unicode)
向調用進程的地址空間加載特定模塊,該模塊可能還會加載其他的模塊。LoadLibraryA (ANSI)
向堆內存中分配指定大小的字節。
釋放指定的本地內存對象,并初始化該對象的處理器。
獲取包含指定模塊的文件的完整路徑,該模塊必須在當前調用進程中被加載。GetModuleFileNameA (ANSI)
終止調用進程以及所有相關的線程。
關鍵的惡意識別指標
需要注意的是,上面給出的所有函數并非都能夠之別標明某個可執行程序的真實作用。但是針對WinHttpOpen的調用可以告訴我們這個應用是有特殊目的的。
那我們就可以從這個函數下手,我們使用URL Revealer(Kahu Security)來檢測流量的目的地,并發現了兩個該惡意應用會不斷嘗試連接的URL地址。
注:當我們向VirusTotalAPI提交一個文件來進行掃描時,最好提交這種形式的POST
上面這個鏈接指向的是一個已失效的Twitter地址,當我使用Twitter的高級搜索功能進行查找時,我發現這條推文早就已經被刪除了。
通過Base64解碼之后我們得到了這條推文的原始內容:https://w0rm.in/join/join.php。但不幸的是,這個網站已經無法解析了,但這個網站原本是一個專門提供網站入侵服務的地下站點。不過需要注意的是,這個Twitter賬號目前仍然是活躍的。
由此看來,我們就沒辦法弄清楚這個惡意軟件想要利用GET請求來做什么了。但是我們可以用其他的方法搞清楚它想用VirusTotal來掃描什么東西?下面是我們使用WireShark所捕捉到的數據包:
在這個數據包中,你可以看到惡意軟件用來在VirusTotal網站上掃描文件的API密鑰以及文件名。所以,通過對API調用和數據包進行重構,我們發現這款惡意軟件會向VirusTotal提交自己的拷貝版本,即惡意軟件副本,而這正好是Vflooder木馬家族的典型行為。Vflooder是一種特殊類型的Flooder木馬,而Flooder木馬可以向目標發送大量的信息來中斷目標的正常操作。但是我認為VirusTotal可能無法檢測到這種惡意軟件威脅。
總結
實際上,我們本文所分析的Vflooder木馬樣本其實還是費查更簡單的。但是通過分析API調用來了解惡意軟件的行為,其實并不是一件容易的事情,因為我們發現有很多的惡意軟件會添加無效/冗余的API調用來增加我們的分析難度。但無論怎樣,分析API調用也是一種檢測惡意軟件的有效方法,因為攻擊者想要做的事情,肯定要在代碼中有所體現。