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