基于API呼叫行為的二進制通用脫殼方法
注:本人去年參賽的作品,歡迎大家對不足之處提出寶貴的意見,謝謝,
完整圖文論文請看我的另一篇博客:https://blog.csdn.net/ITxiaoangzai/article/details/106156192
摘要
加殼技術被廣泛應用于惡意代碼的自我保護,用于對抗躲避反病毒軟體的檢測,使得反病毒軟體檢測率大大降低,所以設計一個能夠自動化的通用脫殼系統具有重要的理論和現實意義,
基于上述動機,本文設計和實作了基于API呼叫行為的二進制通用脫殼系統,本系統利用加殼代碼"先重建后呼叫"的API呼叫行為特征進行脫殼,整個系統采用B/S架構模式,Browser端負責上傳樣本到Server端以及向用戶反饋分析結果;Server端接收樣本后,在沙盒環境中動態運行,通過監控"先重建后呼叫"的API呼叫行為特征進行動態脫殼,
本文實作了原型系統VirusMore(),實驗結果表明,VirusMore能廣泛用于不同的軟體殼并進行成功脫殼,提高反病毒軟體檢測惡意代碼的準確率和降低對正常程式的誤報率,
第一章 作品概述
1.1 背景分析
伴隨著資訊技術的不斷發展,網路給人們帶來便利的同時,網路安全威脅問題也日益突出,網路安全風險不斷向政治、經濟、文化、社會、生態和國防等各個領域傳導滲透,據CNCERT抽樣監測,2018年,我國境內感染計算機惡意程式的主機數量約655萬臺[1],全年捕獲計算機惡意程式樣本數量超過1億個,涉及計算機惡意程式家族51萬余個[1],全年計算機惡意程式傳播次數日均達500萬余次[1],其中很大一部分樣本是通過加殼技術制造出來的變種,惡意代碼通過加殼來偽裝自己,達到欺騙反病毒軟體的目的,
傳統反病毒軟體依賴于特征碼方法來檢測惡意代碼,它們無法識別加殼惡意代碼的變種特征碼,安全廠商發布的報告顯示現行惡意代碼的加殼率高達95%,惡意代碼廣泛使用加殼技術來保護自己,給反病毒軟體帶來很大挑戰,
現有的脫殼方法一般分為兩類:一種是手動脫殼;(只有一句的話就不用用分號)另一種是專用脫殼機,前者依賴于人工的專家經驗,耗時長,成本高;后者只能針對某一種殼,通用性差,因此,研究自動化且通用的脫殼方法具有重要的現實意義,
1.2 相關作業
1.2.1 惡意代碼檢測技術
目前主流惡意代碼檢測技術主要是靜態分析和動態分析兩種檢測技術,
靜態分析方法可以在不實際運行代碼的情況下,分析代碼特征,早期,研究人員使用靜態特征碼技術來檢測惡意代碼,該方法依賴于事先建立的特征碼庫檢測惡意代碼,但無法檢測未知的惡意代碼;后來,研究人員為了彌補靜態特征碼技術的不足,又提出了靜態啟發式技術[2],該方法能用于檢測部分未知的惡意代碼,
動態分析方法主要是通過動態執行被分析程式,監控程式運行行為特征,識別出程式中潛在的惡意行為[2],
VirusTotal是一個惡意代碼在線檢測平臺,用戶提交可疑樣本后,VirusTotal使用多種反病毒軟體來檢測樣本,目前,VirusTotal已集成60余種主流的商業反病毒軟體,這些反病毒軟體采用不同的靜態分析和動態分析方法檢測惡意代碼,相對于單一的反病毒軟體,VirusTotal能提供更全面、準確的檢測結果,
1.2.2 加殼技術
加殼技術采用一定的加密或壓縮演算法,對程式源代碼進行保護,使其難以被分析,殼一般都是先于被保護程式運行,拿到控制權,在記憶體中完成解密或解壓作業[3],
殼可分為壓縮殼和保護殼[4],壓縮殼幫助縮減PE檔案的大小,隱藏了PE檔案內部代碼和資源,便于網路傳輸和保存,常見的壓縮殼有:UPX、ASpack和PECompat等,保護殼的主要目的不再是用于壓縮檔案資源,而是用于保護程式被分析和破解,常見的加密殼有:ASProtector、Armadillo、EXECryptor、Themida和VMProtect等,隨著加殼技術的發展,兩類殼之間的界限逐漸模糊,現在,很多加殼軟體既具有壓縮功能也具有保護功能,
文獻[5]介紹了保護殼使用的保護技術,詳細的分析了諸如花指令、SEH技術及IAT加密三種加殼保護手段,并給出了相關實作代碼,綜合不同的文獻,加殼原理主要有以下幾類:
(1)反靜態分析
通過對代碼進行混淆變換,以實作反靜態分析的目的,具體的代碼靜態混淆方式包括加密、壓縮、加花、亂序和等效變換等[6],
(2)反動態分析
通過加入反除錯,反跟蹤代碼,以實作反動態分析的目的,比如,通過識別出一些除錯器(OllyDebug)的存在,可實作反除錯的目的,
保護殼的大量使用,給反病毒軟體帶來了很大的挑戰,使得VirusTotal等在線網站的檢測能力大大降低,如果能對加殼先進行脫殼處理,再提交VirusTotal檢測,則能提高其惡意代碼的檢測能力,
1.2.3 動態脫殼技術
目前已有自動化脫殼的相關方法,主要是通過利用“先寫后執行”(Written-Then -Executed)原理來實作脫殼,相關研究包括PolyUnpack[8]、Renovo[9]、OmniUnpack[10]、Eureka[11]、Justin[12]等,“先寫后執行”是加殼技術所固有的動態特征,所有的加殼軟體都會在記憶體中恢復被加密或壓縮的代碼,然后將CPU控制權轉交給這些新生成的代碼使其執行,然而,加殼程式可使用多層的“先寫后執行”來對抗基于“先寫后執行”特征的脫殼方法,比如AcProtect殼有多達635 層“先寫后執行”行為,并且其原始代碼的入口點不在最后一層[13],
過去二十年,自動化脫殼方法一直依賴的“先寫后執行”原理來進行脫殼[14],該方法早已被殼的開發人員所熟知,因此,目前的殼已普遍使用多重的“先寫后執行”行為來對抗現有的自動化脫殼方法[15],使其脫殼效率和準確性大大降低,因此,研究如何對抗加殼軟體多重的“先寫后執行”行為是脫殼領域需要亟待解決的問題,
1.3 特色描述
本系統采用B/S架構,用戶只需將樣本通過瀏覽器提交,等待系統顯示分析結果即可,無需再本地環境進行,
本系統主要特色如下:
(1)本系統采用B/S架構,脫殼程序在Server端的沙盒進行,用戶在Brower端的操作簡單且安全;
(2)利用“先重建后呼叫”的API級行為特征進行自動化脫殼,能對抗采用了多層“先寫后執行”的殼,同時,系統提供脫殼后樣本供用戶下載;
(3)將脫殼后的樣本提交殼VirusTotal進行檢測,提高惡意代碼檢測的準確性,
1.4 應用前景分析
根據安全廠商發布的報告顯示目前惡意代碼的加殼率高達95%[16],殼的使用大大降低了反病毒軟體檢測惡意代碼的準確性,
如果自動化脫殼系統和反病毒軟體相結合,將提高反病毒軟體檢測惡意代碼的準確性,保護用戶免遭惡意代碼的侵害,相比于傳統反病毒軟體其優勢體現在以下幾個方面:1、脫殼也意味這所有通過加殼方式制造出來的海量惡意代碼變種都將失去意義,反病毒軟體只需比對原始惡意代碼特征碼既可檢測出惡意代碼,改變以往通過龐大惡意代碼特征碼庫比對的詬病,可以省去掃描比對的時間,大大提高效率;2、該系統檢測是通過云端服務器來實作脫殼,服務器端是通過沙盒環境來對樣本進行脫殼,降低了未知程式的安全風險,因為整個程序沒有在本地環境中進行,因此不會對本地環境造成任何影響;3、在虛擬環境中運行樣本程式,能夠監測樣本執行時進行了哪些操作,分析完成后可以提供給反病毒軟體進行參考,更加精確的分析惡意代碼的行為,
綜上所述,本系統有有效提高反病毒軟體的檢測能力,具有廣闊的應用前景,
第二章 作品設計與實作
2
2.1 系統方案
本系統采用B/S架構:用戶將程式樣本通過Browser端提交給Server端,Server端接收到樣本后,先對樣本進行靜態分析,然后將樣本放入沙盒環境中運行,在沙盒環境中,本系統監控樣本的API呼叫行為,一旦發現“先重建后呼叫”的行為特征,則將樣本記憶體的空間轉儲磁盤檔案中,即為脫殼后的樣本,Server端將脫殼后的樣本以及各項分析結果的反饋給Browser端,供Browser端顯示給用戶,
2.2 實作原理
本節將對系統實作的關鍵技術進行介紹,包括基于Detours的動態分析沙盒
、基于“先重建后呼叫”的API級行為的脫殼方法和基于 VirusTotal 介面的自動化惡意樣本檢測方法,
2.2.1 基于Detours的動態分析沙盒
本文使用微軟的Detours[1]庫來實作動態分析沙盒,Detours提供了API Hooking能力,可用于攔截二進制代碼中的任意的WIN32API呼叫,
(1)Detours基本原理
Detours定義了三個重要的函式:
a. Target Function:要攔截的函式,通常為Windows的API;
b. Trampoline Function:Target函式的部分復制品,因為Detours將會改寫Target函式頭部,所以先把Target函式頭部的前5個位元組復制保存好,便于以后的恢復;
c. Detour Function:用來替代Target函式的函式,
Detours將Target函式頭部的5個位元組修改為jmp DetourFunction指令(也是5個位元組),該指令把對Target函式的呼叫引導到自己的Trampoline函式,Trampoline函式首先實作了原Target函式頭部的5個位元組,然后執行jmp TargetFunction,整個程序如圖1所示,圖中左邊是原始的Target Function和Trampoline Function,右邊則是具有API攔截能力的Target Function和Trampoline Function:
圖1Detour函式的程序
當被監控行程執行到Target Function時,會首先執行jmp DetourFunction指令(圖1),程式控制流會被轉移到Detour Function,也就是用戶自定義的攔截函式中執行,這時Detour Function就可以執行自己的代碼了,Detour Function可以直接回傳,也可以呼叫trampoline Function,trampolineFunction將呼叫被攔截的原始API,目標API呼叫結束后又會放回到攔截函式,圖2是Detours API攔截的邏輯流程:
圖2DetoursAPI攔截的邏輯流程
(2)Detours庫重要的函式介紹
a. DetourAttach & DetourDetach
這兩個函式就是實際實作API掛鉤的(改寫頭5個位元組為一個跳轉指令),DetourAttach用于實作API攔截;DetourDetach用于取消API攔截,恢復原來的API,兩個函式都具有兩個引數:
第一個引數為被攔截的系統API名,系統原始API函式名使用“Real”前綴來命名;
第二個引數為用戶自定義的函式名,用于攔截系統API,用戶自定義的函式名使用“Mine”前綴來命名,
b. DetourCreateProcessWithDll
該函式用于實作對目標行程的API Hooking,該函式封裝“CreateProcess”,以“CREATE_SUSPEND”方式創建目標行程,然后修改目標行程IAT,把Detoured.dll和本文想要插入的DLL插入到它的匯入表,然后再啟動目標行程,DetourCreateProcessWithDll的引數是在CreateProcess基礎上增加了兩個DLL的路徑引數,最后一個引數為創建行程的函式指標,默認為CreateProcessA,
2.1.2 基于“先重建后呼叫”的API級行為的脫殼方法
(1) “先重建后呼叫”的API呼叫行為
已有的基于“先寫后執行的”指令級特征容易被多層的“先寫后執行的”所繞過,因此,研究人員需要尋找新的特征以實作自動化脫殼,本文從一個新的角度重新審視自動化脫殼問題,即API呼叫行為,IAT(匯入地址表)是Windows可執行程式用于查找API地址的資料結構[16][17],對IAT表的靜態分析是反病毒軟體靜態啟發式分析的基礎[18][19],
本文對各類加殼程式的深入研究后發現了一個共同的特性:為對抗靜態分析,惡意代碼的IAT通常會先被加殼軟體靜態洗掉;然后在原始代碼呼叫API前進行動態重建,因此,在加殼的惡意代碼執行程序中,如果通過重建的IAT來呼叫API,則表明此時原始代碼已經恢復完成,此時對記憶體進行轉儲就可以實作脫殼,
Windows作業系統中,重建IAT可以通過API “LoadLibrary”和“GetProcAddress”來實作,本文使用UPX殼保護后惡意樣本Conficker來說明IAT重建的程序,原始的Conficker包含287個API(如圖3(a)所示),對于UPX加殼后的樣本,UPX壓縮代碼和資料部分,洗掉原始IAT,并將UPX殼自身的IAT附加到外殼中(如圖3(b)所示),解壓程式的IAT共有來自kernel32.dll等庫15個API,其中包括“LoadLibrary”和“GetProcAddress”,它們被用于重建IAT,圖3(c)是運行時UPX加殼的樣本的記憶體視圖,當控制流到達OEP時,加殼的代碼段和資料段已經恢復,并且還重建了Conficker原始IAT表中287個API,值得注意的是,重建的原始IAT和外殼的IAT有兩點不同:1)由于外殼程式的功能相對簡單,因此它通常比重建后IAT中包含的API更少;2)它們在記憶體中的地址是不同的,由于原始Conficker代碼中的API呼叫指向的是原始IAT表,為保證其能正常運行,加殼程式需要在原始位置重建Conficker的原始IAT,
圖3 加殼后代碼的API呼叫行為
(2) IAT比較
本系統需要將使用Detours監控到當前API呼叫所參考的IAT和最近一次API呼叫所參考IAT進行比較,以判斷當前呼叫的API是否來自重建的IAT,
“MyDeleteFile”為用于攔截系統API“DeleteFile”的用戶自定義函式,下面以“MyDeleteFile”為例,展示用戶自定義函式的作業原理:
演算法1 MyDeleteFile演算法
1: function MyDeleteFile(lpFileName)
2: if lastIAT = ? then
3: routineIAT ← GetUnpackingRoutineIAT()
4: lastIAT ← routineIAT
5: end if
6: currentIAT ← GetCurrentIAT()
7: if currentIAT ≠ lastIAT then
8: OEP ← BacktrackOEP()
9: if OEP ≠ ? then
10: Process Dump()
11: lastIAT ← currentIAT
12: end if
13: end if
14: return DeleteFile(lpFileName)
15: end function
MyDeleteFile通過堆疊回溯找到獲得當前參考的IAT(第6行),然后根據不同的存盤位置或內容比較兩個IAT(第7行),
演算法1中使用一個全域變數“lastIAT”,用來表示最后一次重建的IAT,“lastIAT”的初始值是加殼后檔案外殼部分的IAT(2-4行),“currentIAT”為當前API呼叫所用參考的IAT,如果“currentIAT”與“lastIAT”比較結果不相同,則表示當前的IAT是剛重建的IAT(第7行),演算法1執行回溯搜索OEP(第8行),如果找到OEP(第9行),則把行程空間內容轉儲到磁盤中(第10行),然后更新“lastIAT”(第11行)用于下一輪比較,最后演算法1呼叫原始API以繼續執行加殼程式(第14行),
(3)OEP搜索和行程轉儲
OEP(original entry point)是加殼程式原始代碼的第一條指令,如果不能找到正確的OEP會導致脫殼后程式無法執行,已有研究已提出很多搜索OEP啟發式規則[20],但它們的搜索空間很大,從而效率低下,本文使用新的啟發式規則來縮小OEP的搜索空間,如圖4所示,本文首先找到用于重建IAT的最后一次呼叫的“GetProcAddress”的地址(“T1”),然后找到恢復出的原始代碼中第一個API呼叫的地址(“T2”),顯然,OEP在記憶體的搜索范圍應該在“T1”和“T2”之間,所以,本文從“T2”到“T1”進行回溯,搜索OEP,通過這樣的方法可以讓OEP的搜索范圍大大減少,
行程轉儲(process dump)是脫殼時另一個需要解決的問題,許多加殼軟體使用了各種反轉儲方法來對抗行程轉儲,比如將記憶體中PE頭部的訪問屬性修改為“禁止訪問”,因此,當轉儲PE頭部時,轉儲工具就會崩潰,為此本文采用第三方記憶體轉儲工具Scylla,Scylla在轉儲PE頭部前,先將其記憶體訪問屬性修改為“可讀可寫”,
圖4OEP搜索
包括Scylla在內的很多轉儲工具都存在一個問題,就是只轉儲目標程式的主模塊,卻忽略動態記憶體區域(如堆),因此,本文修改了Scylla代碼,使其轉儲行程空間內容時,不僅轉儲程式主模塊,也轉儲行程堆空間中的代碼,具體程序如圖5所示,
圖5行程轉儲
2.2.3 基于VirusTotal介面的自動化惡意樣本檢測方法
VirusTotal是一個提供免費的可疑檔案分析服務的網站,它通過多種反惡意代碼引擎掃描檔案,以判斷檔案是否為惡意代碼,目前其VirusTotal惡意代碼引擎已經多達60余種,大大減少了反病毒軟體誤殺或未檢出惡意代碼的幾率,其檢測率優于使用單一產品,VirusTotal除了可以通過瀏覽器手動上傳樣本進行檢測以外,還允許用戶使用他們提供的API介面自動化上傳檔案和接收檢測結果,因此,本文可以通過呼叫這些介面來自動化訪問VirusTotal,VirusTotal提供了兩個URL介面分別用于上傳檔案和接收檢測結果:
https://www.virustotal.com/vtapi/v2/file/scan
https://www.virustotal.com/vtapi/v2/file/report
第一個URL介面是一個post請求,可以將本地檔案進行上傳,此請求檔案大小限制為32MB,自動化上傳樣本到VirusToTal的Python代碼如演算法2所示,其中apikey為VirusTotal提供給注冊用戶的密鑰,呼叫VirusTotal的API介面需使用該密鑰,VIRUSTOTAL_FILE_SCAN_URL即為URL介面“https://www.virustotal.com/vtapi/v2/
file/scan”
演算法2上傳樣本到VirusTotal
//apikey為VirusTotal提供的密鑰,file_path為樣本檔案路徑
def scan(apikey,file_path):
params = {'apikey': apikey}
// 讀取路徑中的檔案
files = {'file': (apikey, open(file_path, 'rb'))}
response = requests.post(VIRUSTOTAL_FILE_SCAN_URL, files=files, params=params)
第二個URL介面是一個get請求,該請求需要設定一個resource引數,為經過分析的樣本MD5,SHA-1或SHA-256,自動化獲取VirusToTal分析結果的Python代碼如演算法3所示,其中VIRUSTOTAL_FILE_URL為URL介面https://www.virustotal.com/
vtapi/v2/file/report
演算法3從VirusTotal 中接收分析結果
//apikey為VirusTotal提供的密鑰,file_path為樣本檔案路徑
def getFileReportResult(apikey,file_path)
resource = File(self.file_path).get_sha256()
//獲取檔案哈希值,通過哈希獲取掃描的結果
data = https://www.cnblogs.com/ITXiaoAng/p/{"resource": resource, "apikey": key}
r = requests.get(VIRUSTOTAL_FILE_URL, params=data, verify=True, timeout=int(timeout))
response_data = https://www.cnblogs.com/ITXiaoAng/p/r.content
2.3 軟體流程
2.3.1 整體流程
首先用戶通過Browser端提交樣本程式,然后Browser端會將樣本傳遞到Server端,所有的分析都在Server端,樣本到達Server端,首先通過靜態分析獲得程式的基本資訊;接著樣本會交給到Server端沙盒環境中運行,在沙盒環境中進行脫殼和檢測行為分析;然后Server端將原樣本和脫殼后的樣本自動化上傳到VirusTotal進行分析并獲取分析結果;最后所有的分析結果會保存到資料庫中,并反饋給Browser端,用戶通過Browser端能瀏覽所有的分析結果,上述程序如圖6所示,
圖6系統整體流程
下面分別介紹Browser端和Server端的具體流程,(應向前對其)
2.3.2 Browser端流程
用戶上傳的樣本程式等待系統分析;
查看分析結果和下載樣本脫殼檔案;
2.3.3 Server端流程
系統接收到用戶上傳的樣本程式并保存到指定檔案夾中;
對樣本程式的基本資訊進行獲取:檔案大小、檔案型別、加殼資訊等;
獲取程式IAT,然后將樣本程式和獲取的IAT傳遞給虛擬機進行分析;
啟動Windows虛擬機,并執行脫殼分析腳本將樣本程式和相關DLL檔案和資料發送到虛擬機中;
啟動樣本程式,如果pipe收到"PROCESS:"命令,表示惡意程式正在創建子行程或者修改別的行程空間內容,那么這個行程也會被注入本文實作撰寫的DLL;
通過基于Detours的API Hooking方法對API進行監控;
樣本程式運行程序中API的監控會觸發腳本依次進行如下操作:
①對當前顯示內容進行截圖
②對當前程式呼叫的API進行記錄,同時記錄其他行為
③獲取當前行程的IAT,然后將當前IAT和lastIAT進行比較,如果比較結果不同則繼續進行其他處理;如果比較結果相同則轉至6),繼續運行樣本程式
通過啟發式的方法來搜索尋到OEP;
通過利用Scylla來轉儲和修復行程;
將獲取到的資料和檔案回傳給前臺進行處理;
執行恢復作業,結束虛擬機行程,執行VboxManage的快斬訓復命令;
將檔案上傳到VirusTotal進行掃描;
獲取掃描資料,將資料保存到資料庫中和脫殼檔案保存到指定檔案夾中;
用戶查看分析結果時,通過讀取資料庫中資料向用戶展示;
等待下一個分析任務,
2.4主要功能
2.4.1基本資訊獲取
如圖7所示,首先本系統以靜態方式分析樣本基本資訊,包括檔案大小、檔案型別、是否加殼、MD5和哈希值等,用戶可以在下次訪問時通過檔案名或MD5等來搜索自己曾經提交的樣本的分析結果,
圖7樣本基本資訊
2.4.2 靜態分析
本系統使用Python第三方庫pefile來提取樣本PE結構資訊,包括PE Information(檔案頭部資訊)、Sections(節)、Imorpts(匯入表)等,此外,本系統還會查找PEiD簽名,判定樣本是否加殼,分析結果如圖8所示,其中PEiD查出樣本使用了UPX殼進行加殼,同時Imorpts中包含有API "LoadLibraryA"和"GetProcAddress"等,如上文所述(2.2.2節),"LoadLibraryA"和"GetProcAddress"可用于恢復被加殼樣本的原始IAT,
圖8樣本的PE結構靜態分析
2.4.3 動態脫殼
本系統將動態脫殼模塊位于Server端的Virtualbox虛擬機,此虛擬機基于Detours構建了一個動態分析沙盒,沙盒會攔截樣本API呼叫,插入自定義的攔截代碼,攔截代碼如演算法1所示,一旦發現當前的API呼叫來自剛重建的IAT,則立即搜索OEP并將行程空間的代碼轉儲到磁盤檔案中,該檔案即為脫殼后的樣本,
2.4.4 惡意程式VirusTotal分析對比
本系統通過呼叫VirusTotal的API介面實作自動化的上傳樣本和接收分析結果(如演算法2和演算法3),分析結果如圖9所示,其中VirusTotal串列示反病毒引擎名稱,Signature列的"Clean"代表檢測結果為正常,其它值則表示識別出的惡意樣本名,例如:AVG的"FileRepMalware"代表反病毒引擎AVG將提交的樣本識別為惡意代碼"FileRepMalware",
圖9VirusTotal對比分析展示
2.4.5 程式運行截圖
為了向用戶展示實際程式的運行程序,Server端使用Python的PIL庫對樣本的運行程序進行截圖,并將截圖結果保存在Server端的樣本資料庫中,用戶可以通過Browser端瀏覽Server端的截圖結果,截圖結果如圖10所示,
圖10 程式運行截圖
2.4.6 資料庫存盤
為方便用戶可以隨時查看分析結果,以及適應WEB應用的可擴展的高性能資料存盤要求,本系統采用MongoDB資料庫來存盤分析資訊的資料,MongoDB采用檔案結構的存盤方式,能更便捷的獲取資料庫中的資料,(可以放一些資料庫存盤的截圖)
第三章 作品測驗與分析
3.1 測驗方案
本文的測驗方案如下:
對于惡意樣本脫殼分析后的樣本,測驗VirusTotal上各反惡意代碼引擎檢測率是否提高;
正常樣本脫殼分析后樣本,測驗VirusTotal上各反惡意代碼引擎誤報率是否降低;
對惡意樣本進行大規模測驗,測驗VirusTotal的檢測結果,
3.2 測驗環境
本文在Ubuntu Server 16.04.1 LTS 32位騰訊云服務器上部署了該系統,主要配置有:
(1)開源虛擬機軟體VirtualBox:構建沙盒環境WindowsXP;
(2)WindowsXP系統:樣本運行和脫殼的環境;
(3)MongoDB資料庫:保存分析資料;
(4)Python 2.7:自動分析腳本的運行環境,
3.3 測驗資料
測驗方案(1)和測驗方案(2)使用單樣本進行加殼測驗,所使用的樣本分別為Windows作業系統下正常程式notepad.exe和從VirusTotal網站上下載的惡意樣本WannaCry(如表1所示),WannaCry為2017年爆發的著名的勒索軟體,在全球范圍內大規模傳播,造成大量用戶的經濟損失[22],
表1 單樣本測驗集
表2 大規模惡意樣本測驗集
表3 測驗殼
3.4 測驗程序
因本系統已經部署并備案,故直接進行在線測驗,
(1) 將表1中的惡意樣本WannaCry用表3中的7個殼分別進行加殼;
(2) 將加殼后的惡意樣本上傳到VirusMore;
(3) 記錄上一步VirusMore的檢測結果;
(4) 將表1中的正常程式notepad.exe用表3中的7個殼分別進行加殼;
(5) 將加殼后的正常程上傳到VirusMore;
(6) 記錄上一步VirusMore的檢測結果;
(7) 將表2中的大規模惡意樣本測驗集分別用表3中的7個殼分別進行加殼;
(8) 將加殼后的惡意樣本上傳到VirusMore;
(9) 記錄上一步VirusMore的檢測結果,
3.5 結果分析
測驗方案(1)的實驗結果如表4所示,其中第一串列示程式的名稱,notepad.exe為正常樣本,WannaCry為惡意樣本,第二串列示樣本所使用的加殼工具,PEiD查殼兩列中的"√"表示PEiD檢測出樣本被加殼,VirusTotal兩列中的數字表示VirusTotal上判定樣本為惡意代碼的反病毒引擎的數量,
從表4中的PEiD查殼結果可以看出,加過殼的WannaCry樣本均被PEiD識別出加了殼,通過VirusMore脫殼后的樣本均被PEiD判定為未加殼,VirusTotal檢測的結果中,原始的未加殼的惡意樣本有56個標識為惡意程式,但是加殼后檢測結果中都有不同程度的下降,表明加殼程式的使用使得反病毒引擎的檢測率降低,同時,經過VirusTotal脫殼后的樣本的檢測率比脫殼前明顯升高,表明VirusMore可以幫助VirusTotal提高對加殼惡意代碼的檢測率,
表4 測驗結果
測驗方案(2)的實驗結果如表5所示,從表5中VirusTotal檢測的結果中可以看出,加殼后的正常樣本有很多反病毒引擎誤報為惡意代碼,有研究表明,許多反病毒引擎不具備脫殼能力[23],直接將加過殼的樣本判定為惡意代碼,與此同時,經過VirusMore脫殼后,VirusTotal誤報率顯著降低,表明VirusMore可以幫助VirusTotal降低對加殼的正常樣本的誤報率,
表5 正常樣本檢測結果
為了進一步測驗VirusMore識別加殼后惡意代碼的能力,本文選取了10種不同的惡意代碼(如表2所示),分別使用7種不同的加殼軟體加殼(如表3所示),來測驗VirusMore能否幫助VirusTotal識別這些樣本,實驗結果如表6所示,表中的數字表示,經過ViruMore脫殼后VirusTotal上多少個反病毒引擎能從無法識別樣本變成能識別樣本,表6表明ViruMore能顯著幫助VirusTotal提高對各種加殼的惡意代碼的檢測率,
表6 加殼的惡意樣本大規模測驗
第四章 創新性說明
4.1 方法創新
本文查閱大量的文獻后發現,目前對于自動化的脫殼方法都是基于"先寫后執行"的指令級特征實作,目前的殼普遍使用多層的"先寫后執行"來對抗已有的自動化的脫殼方法,使其脫殼成功率和效率大大降低,針對這些,本文從新的視角尋找加殼程式的行為特征,發現了"先重建后呼叫"的API級行為特征,"先重建后呼叫"是指在加殼程式會洗掉惡意代碼的IAT以對抗反病毒引擎的靜態啟發式分析,然后在動態執行原始的惡意代碼時會首先重建IAT然后呼叫其API,因此,一旦發現當前呼叫的API來自重建后的IAT時,則認為原始的惡意代碼已經恢復出來,可以把行程空間的內容轉儲到磁盤檔案中,即為脫殼后樣本,
本文方法不需要對加殼后樣本進行指令級的監控,以發現"先寫后執行"行為特征,只需使用API級的監控,以發現"先重建后呼叫"行為特征,因此本方法的脫殼成功率和效率都顯著高于已有的方法,
4.2 技術創新
為了實作具有較高的可用性、穩定性的脫殼分析系統,本文在多個方面實作了技術創新:
(1)使用Detours庫實作了動態分析沙盒,用以監控"先重建后呼叫"的API行為;
(2)使用VirusTotal的介面實作了自動化的樣本提交和分析結果接收,
第五章 實用性說明
已有的惡意代碼分析網站VirusTotal上集成了幾十種主流的反病毒引擎,比單一反病毒引擎更全面的識別惡意代碼,然而,很多反病毒引擎的脫殼能力偏弱甚至不具備脫殼能力[23],同時,VirusTotal自身也不具備脫殼能力,
本文實作了一個在線脫殼網站(),能夠提供在線脫殼和分析服務服務,具體實用功能如下:
(1)通過Submit模塊上傳樣本,用戶可以選擇上傳單個可執行檔案,也可以上傳一個壓縮檔案進行批量脫殼,壓縮檔案內是待脫殼檔案進行整合壓縮后的檔案,系統可以在服務器將壓縮檔案內的可執行檔案提取出來,進行批量脫殼處理;
(2)在Static Analysis模塊查看樣本詳細靜態資訊,會給用戶展示樣本檔案大小、檔案型別、加殼型別、PE檔案資訊和匯入表等,無需用戶使用其他工具去查看這些資訊;
(3)在Process Dumps本文還提供對脫殼后樣本檔案的下載,考慮到用戶會需要脫殼后的樣本,本文可以下載脫殼后樣本,出于安全性考慮對于下載檔案本文將檔案哈希值作為檔案名,避免用戶下載后打開檔案,對主機造成危險;
(4)樣本運行截圖,為了讓用戶看到樣本程式在運行后的顯示,用戶可以在分析結果中看到程式在虛擬機中運行的截圖,還顯示樣本對哪些檔案進行了操作,讓用戶更加直觀的了解程式顯示了什么做過什么;
(5)VirusTotal對比分析,本文將樣本脫殼前后VirusTotal掃描的資訊在展示也進行對比顯示,可以讓用戶看到有哪些引擎掃描結果前后不同,對不同的結果本文用不同顏色區分更好辨別,
總體來說,本系統VirusMore的脫殼能力能有效幫助VirusTotal提高對加殼惡意代碼的檢測率,具有很好的實用性,
第六章 總結
惡意代碼為了躲避反病毒軟體的檢測,經過通過加殼的方式來保護自己,會造成反病毒軟體的檢測率下降,現有的反病毒軟體和自動化脫殼方法無法應對使用了多層"先寫后執行"的加殼程式帶來的挑戰,基于上述動機,本文設計和實作了一個基于API級的"先重建后呼叫"行為的自動化脫殼系統VirusMore,VirusMore為用戶提供可視化的應用介面,用戶將需要分析和脫殼的可執行程式上傳至服務器,等待脫殼和分析結果即可,VirusMore包含有靜態分析模塊,用于分析樣本程式的基本資訊、PE檔案資訊、IAT資訊等;VirusMore還將脫殼前后VirusTotal的掃描結果進行對比分析,對樣本程式的惡意程度進行一個整體性的評級打分,實驗結果表明,VirusMore能幫助VirusTotal中的反病毒引擎提高對加殼惡意代碼的檢測率和降低對加殼正常樣本的誤報率,總而言之,本系統具有良好的創新性和實用性,
目前該系統已經在騰訊云上完成部署,任何人都可以通過Web域名()來免費使用VirusMore系統,下一步,本文計劃實作VirusMore的自動化Web訪問介面,供用戶使用python語言自動化的提交樣本給VirusMore來脫殼,并接收VirusMore的分析結果,以進一步提高系統的實用性,
參考文獻
[1]. 2018年我國互聯網網路安全態勢綜述.國家互聯網應急中心. https://www.cert.org.cn, 2019,4-16
[2]. 覃麗芳. 惡意代碼動態分析技術的研究與實作[D]. 電子科技大學.
[3]. 郭文,王俊峰.Windows惡意代碼動態通用脫殼方法研究[J].四川大學學報,2018, Vol. 55(2):284-285.
[4]. YAO Wei-guang.Research on Software Enclosure Technology[D].Chengdu:Univers-ity of Electronic Science and Technology of China, 2011.
[5]. 張中華,蘇志同.PE程式加殼中的反脫殼技術研究[J].北京工業職業技術學院學報,2008,7(03):27-31.
[6]. Cohen F. A cryptographic checksum for integrity protection[J]. Computers & Security, 1987, 6(6):505-510.
[7]. MV Yason,”The Art of Unpacking”,Black Hat Briefings USA, 2007
[8]. Royal P,Halpin M.Dagon D,Edmonds R.Lee W.Polyunpack:Automating the hidden-code extraction of unpackexecuting malware//Proceedings of the 22nd An-nual Computer Security Applications Conference(ACSAC’06).MiamiBeach,FL,USA,2006:289-300
[9]. Kang M,Poosankam P,Yin H.Renovo:A hidden code extractor for packed executables//Proceedings of the 5th ACM Workshop on Recurring Malcode(WORM’07).Alexandria,VA,USA,2007:46-53
[10]. Martignoni L.Christodorescu M.Jha S.Omniunpackl Fast,generic.and safe unpacking of malware//Proceedings of the 23rd Annual Computer Security Applications Conference(ACSAC’07).Miami Beach,FI,USA,2007:431-441
[11]. Sharif M,Yegneswaran V,Saidi H,Porras P,Lee W.Eureka l A framework for enabling static malware analysis//Proceedings of the 13th European Symposium on Research in Computer Security(ESORICS’08).Malaga,Spain,2008:48l-500
[12]. Guo F,Ferrie P,Chiueh T.A study of the packer problem and its solutions//Proceedings of the 11th International Symposium on Recent Advances in Intrusion Detection(RAID’08).Cambridge,Massachusetts,USA,2008:98-115
[13]. Ugarte-Pedrero X, Balzarotti D, Santos I, et al. SoK: Deep packer inspection: A longitudinal study of the complexity of run-time packers[C]//2015 IEEE Symposium on Security and Privacy. IEEE, 2015: 659-673.
[14]. Polino M, Continella A, Mariani S, et al. Measuring and defeating anti-instrumentation-equipped malware[C]//International Conference on Detection of Intrusions and Malware, and Vulnerability Assessment. Springer, Cham, 2017: 73-96.
[15]. Bonfante G, Fernandez J, Marion J Y, et al. CoDisasm: medium scale concatic disassembly of self-modifying binaries with overlapping instructions[C]//Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security. ACM, 2015: 745-756.
[16]. 余三超. 基于虛擬機的通用自動化脫殼系統[D]. 電子科技大學.
[17]. 嵇海明, 楊宗源. PE檔案格式剖析[J]. 計算機應用研究, 2004, 21(3):165-166.
[18]. 龐立會. PE檔案動態加殼技術的研究與實作[J]. 計算機工程, 2008, 34(19):160-162.
[19]. 馮本慧, 王加陽. 一種基于靜態API呼叫與集成學習的惡意代碼檢測技術[J]. 科技資訊, 2013(9):32-32.
[20]. 段海新等,計算機病毒防范藝術. Szor P,The art of computer virus research and defense[M]. 2007.
[21]. 王志, 賈春福, 魯凱. 基于環境敏感分析的惡意代碼脫殼方法[J]. 計算機學報, 2012, 35(4):693-702.
[22]. WannaCry,https://baike.baidu.com/item/WannaCry/20797421?fr=aladdin
[23]. 代碼戰爭:偽裝和狙殺,從“殼”到“病毒混淆器”, https://www.freebuf.com/articles/system/112631.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/105974.html
標籤:Python
上一篇:來試試用python寫個游戲,本次的游戲叫做alien invasion
下一篇:Elasticsearch 通過Scroll遍歷索引,構造pandas dataframe 【Python多行程實作】
