基于API調(diào)用的惡意軟件分析技術
基于API的分析技術
根據(jù)上一個季度的統(tǒng)計數(shù)據(jù)發(fā)現(xiàn),使用加殼器、加密器和保護器(這些都是用于對惡意軟件進行混淆處理,以防止被系統(tǒng)或安全軟件識別出來的方法)的惡意軟件的數(shù)量正在日益增加。這些加殼器極大的提高了進行靜態(tài)分析的難度,甚至有些時候根本就無法對其進行靜態(tài)分析。隨著越來多的惡意軟越件作者開始采用這些保護性措施,安全分析人員對于惡意軟件分析替代技術的興趣也越來越濃。
其中一種可行的替代方法就是,對代碼中通知系統(tǒng)執(zhí)行某些操作的API調(diào)用或命令進行安全檢測。這種方法的好處是,不必對經(jīng)過加殼處理的軟件進行逆向分析,相反,我們可以通過對API調(diào)用進行動態(tài)分析,從而弄清楚某個文件的具體行為。通過分析相應的API調(diào)用,我們可以確定文件是否是惡意的,因為對于某些類型的惡意軟件來說,它們的API調(diào)用是非常有特點的。例如,典型的下載API是URLDownloadToFile。而GetWindowDC這個API通常用于屏幕抓取,它經(jīng)常出現(xiàn)在間諜軟件和鍵盤記錄器中。
下面,我們通過一個具體的例子來說明其工作原理。
木馬樣本
我們的示例是一個著名木馬程序,名稱為1.exe,其SHA256為0213b36ee85a301b88c26e180f821104d5371410ab4390803eaa39fac1553c4c。
由于該文件(使用VMProtect)進行了加殼處理,所以面對這種情況,反匯編器通常也是狗咬刺猬——無處下口。由于本人并非逆向分析的專家,所以我另辟蹊徑,通過查看該文件在沙箱執(zhí)行期間使用的API調(diào)用來搞清楚該文件的所作所為。
這是我們通過沙箱(Deepviz)獲得的調(diào)用列表:
首先,我們來看看這些函數(shù)分別是做什么的。以下內(nèi)容都是引自Microsoft的相關文檔:
GetModuleHandle函數(shù)
檢索指定模塊的模塊句柄。被檢索的模塊必須是由調(diào)用進程加載的。GetModuleHandleA(ANSI)
GetProcAddress函數(shù)
檢索從指定的動態(tài)鏈接庫(DLL)導出的函數(shù)或變量的地址。
_wtoi
將字符串轉(zhuǎn)換為整數(shù)。
CreateStreamOnHGlobal函數(shù)
該函數(shù)可以用來創(chuàng)建一個使用HGLOBAL內(nèi)存句柄存儲流內(nèi)容的流對象。該對象是IStream接口的OLE實現(xiàn)。
StrStr函數(shù)
查找指定子字符串第一次出現(xiàn)在字符串中的位置。該函數(shù)區(qū)分大小寫。StrStrA(ANSI)
wsprintf函數(shù)
將格式化數(shù)據(jù)寫入指定的緩沖區(qū)。所有的參數(shù),都會根據(jù)格式字符串中的相應的格式規(guī)范進行轉(zhuǎn)換,并復制到輸出緩沖區(qū)。wsprintfA(ANSI)
WinHttpOpen函數(shù)
對于應用程序來說,這個函數(shù)可以初始化WinHTTP函數(shù)并返回WinHTTP會話句柄。
GetModuleFileName函數(shù)
檢索包含指定模塊的文件的標準路徑。該模塊必須是由當前進程加載的。GetModuleFileNameW(Unicode)
LoadLibrary函數(shù)
將指定的模塊加載到調(diào)用進程的地址空間中。這個指定的模塊可能會導致其他模塊被加載。LoadLibraryA(ANSI)
LocalAlloc函數(shù)
從堆中分配指定的字節(jié)數(shù)。
LocalFree函數(shù)
釋放指定的本地內(nèi)存對象并使其句柄無效。
GetModuleFileName函數(shù)
檢索包含指定模塊的文件的標準路徑。該模塊必須是由當前進程加載的。GetModuleFileNameA(ANSI)
ExitProcess函數(shù)
結束調(diào)用進程及其所有線程。
關鍵惡意指標
并不是上面顯示的所有函數(shù)都能表明可執(zhí)行文件的性質(zhì)。但是API WinHttpOpen卻能告訴我們,我們可以向特定的方面考慮。
對于這個函數(shù),我們使用Kahu Security的URL Revealer來檢查流量的目的地,并發(fā)現(xiàn)兩個經(jīng)常出現(xiàn)的URL。
- GET http://twitter.com/pidoras6
- POST http://www.virustotal.com/vtapi/v2/file/scan
這個POST是當您要提交掃描文件時,VirusTotal API接受的內(nèi)容。
這個指向被廢棄的Twitter句柄的鏈接讓人非常迷惑,我決定在Twitter中使用高級搜索,確定這是個早已被刪除的Tweet的鏈接。
這個Tweet的內(nèi)容是一個base64編碼的鏈接:https://w0rm.in/join/join.php。不幸的是,該網(wǎng)站已經(jīng)無法解析,但它曾經(jīng)是一個地下黑市,同時提供網(wǎng)站exploit與黑客服務,上面提到的Twitter個人資料在當時還未被刪。
看來上面這條路是走不通了。因此,我們嘗試了另一種方法,弄清楚它想要在VirusTotal上掃描的東西,并使用Wireshark來檢測數(shù)據(jù)包。
在數(shù)據(jù)包中,您可以看到用于在VirusTotal站點掃描文件的API key和文件名。根據(jù)這個API調(diào)用和數(shù)據(jù)包進行重建后,我們發(fā)現(xiàn)惡意軟件將其自身的副本提交給VirusTotal,這是Vflooder系列木馬的典型行為。Vflooder是一種特殊的Flooder木馬程序。Flooder木馬旨在向特定目標發(fā)送大量信息,以破壞目標的正常運行。但是,我懷疑它甚至用于對VirusTotal發(fā)動攻擊?;蛘吲cTwitter上的那個鏈接有關。
Vflooder木馬只是分析API調(diào)用的一個簡單的小例子。但是事情并非總是這么輕松:我們甚至看到某些惡意軟件已經(jīng)開始故意增加冗余/無用的API調(diào)用了,目的就是為了對執(zhí)行流程進行混淆處理。不過,分析API調(diào)用確實是一種檢測惡意軟件隱藏自身行為的有效方法。但是別忘了,攻擊者對這些也是心知肚明的。