惡意軟體檢測之Deep Learning分類器
0x00、概述
本文主要是和大家介紹一下:
1.回顧Machine Learning分類器方法。
·特徵碼提取自動化
·資料集介紹
·n-gram N如何獲取
·特徵選擇
·演算法評估
2.Deep Learning分類器
·為什麼有Machine Learning還需要Deep Learning。
·如何實現Deep Learning的方法。
·效果驗證。
0x01、Machine Learning分類器回顧
通常適用的兩種主要方法惡意軟體檢測包括:靜態分析和動態分析。我們這裡先闡述靜態分析。前面的幾篇文章都已經闡述了目前靜態分析主要是反彙編程式的原始操作碼序列,使用N-gram提取特徵。這種分類器的優勢在於是能夠直接從原始資料中自動學習特徵,而不是事先通過專家分析來指定它們。當然在抽取反彙編程式的原始操作碼序列當在N-gram提取特徵提的時候,我們發現原始操作碼的頻率也是一個影響整個惡意軟體分類判斷的重要特徵。
1、資料集介紹
為了更真實的模擬實際生產環境,在雲平臺搭建了一個IDS,通過IDS的檔案還原功能,獲取到了海量的樣本,同時,使用靜態特徵檢測的手段(傳統防毒軟體)對惡意樣本進行自動化標註,同時把樣本輸入到特徵碼提取自動化處理流程中。大致的資料流程圖如下:
2、特徵碼提取自動化
ofollow,noindex">https://github.com/viper-framework/viper 啟動反彙編程式(IDA Pro) -> 統計頻率
IDA分析完檔案之後,會自動在檔案目錄下生成一個idb資料庫檔案,資料庫檔案以輸入進行分析檔案去掉字尾之後的檔名進行命名。但是因為本次實驗中使用的資料集很多檔案只是字尾有區別,前面檔名相同,所以要以完整檔名儲存相應的分析結果。這種情況下,自定義idc指令碼來完成分析後期工作比較方便。
下面是使用到的DIYanalysis.idc指令碼,儲存在ida目錄下的idc資料夾
include <idc.idc> static main() { SetShortPrm(INF_AF2, GetShortPrm(INF_AF2) | AF2_DODATA); Message("Waiting for the end of the auto analysis...\n"); Wait(); Message("\n\n------ Creating the output file.... --------\n"); auto file = GetInputFilePath(); auto asmfile = file + ".asm"; auto idbfile = file + ".idb"; WriteTxt(asmfile, 0, BADADDR); SaveBase(idbfile, 0); Message("All done, exiting...\n"); Exit(0); }
執行效果
備註:在執行的過程中,這個時間稍微長一些,大約1~3分鐘不等。所以,我只挑了2380個惡意樣本和2380個良性樣本。
3、n-gram N如何獲取
當n增加時,任何基於n-gram的方法都面臨著獨特n-gram數量呈指數增長的前景。 預計在n操作碼中也會觀察到類似的趨勢。 圖2和表I顯示了來自我們的資料集的不同n的唯一n-操作碼的數量,其包括2380個惡意軟體樣本和2380個良性樣本。 在惡意軟體分類(MC)研究中,我們處理了所有4760個樣本的n-opcode提取,並計算了不同n的唯一n-opcodes的數量,n為1到10。
mc:malware classification
mt:malware categorization
4、特徵選擇
由於唯一n-opcode的數量過多,因此很難在原始資料上執行機器學習演算法。 該問題的解決方案之一是特徵選擇,即識別最佳特徵的過程,並且是過濾掉不太重要的特徵的廣泛使用的方法。 在特徵選擇階段,我們測量每個特徵的資訊增益,然後濾除具有最低資訊增益的不太重要的特徵。熵是隨機變數的不確定性的度量。 變數X的熵在下面的(1)中定義 觀察變數Y的值後的X的熵在(2)中定義,其中P(xi)是X和P的所有值的先驗概率(xi | yi)是給定值的X的後驗概率。Y.
5、演算法評估
我們使用三種不同的機器學習演算法:Naïve貝葉斯(NB),支援向量機(SVM),隨機森林(RF)並利用公有云機器學習框架評估。報告了以下實驗結果使用加權平均f-度量,它基於精確度和召回率。
具體實現方法,在單機下執行scikit-learn 中相應的SVM等分類方法。結論是SVM佔上風。
用同樣的方法使用深度學習做一下評估
最重要的部分來了,我們使用深度學習架構對其進行分類,看看效果。
從簡單的資料上看,目前深度學習效果不穩定,主要是還沒有找到特徵。
0x02、Deep Learning分類器
1、提升準確率和效能
在做這個實驗的時候我發現一個問題,其實在沙箱上跑一個惡意軟體的時間也是2-3分鐘,而且可以躲避那些牛逼的加密混淆手段,那麼,我們為啥不換一個思路呢?
2、具體做法
@1、提取特徵
我們通過Cuckoo sandbox執行的結果會產生report.json檔案提取APICall
"apistats": { "2208": { "CreateToolhelp32Snapshot": 1, "LdrUnloadDll": 2, "NtOpenSection": 1, "GetAdaptersInfo": 2, "RegCloseKey": 1, "GetSystemInfo": 1, "RegQueryValueExA": 2, "IsDebuggerPresent": 1, "NtClose": 15, "RegCreateKeyExA": 1, "GetFileAttributesW": 2, "NtFreeVirtualMemory": 6, "Process32NextW": 45, "GetSystemMetrics": 3, "SizeofResource": 3, "CreateActCtxW": 4, "SetFileTime": 1, "NtDelayExecution": 1, "SetErrorMode": 1, "NtAllocateVirtualMemory": 10, "RegOpenKeyExA": 11, "DeleteFileW": 1, "NtWriteFile": 1, "NtMapViewOfSection": 3, "Process32FirstW": 1, "NtOpenFile": 24, "SetUnhandledExceptionFilter": 1, "__exception__": 1, "NtCreateFile": 3, "GetSystemTimeAsFileTime": 1, "GetComputerNameA": 1, "NtQueryAttributesFile": 1, "NtCreateMutant": 2, "NtProtectVirtualMemory": 8, "LdrGetDllHandle": 2, "NtCreateSection": 2, "LoadStringW": 2, "NtOpenKey": 1, "NtOpenMutant": 3, "LoadResource": 3, "LdrGetProcedureAddress": 15, "RegSetValueExA": 4, "CopyFileA": 1, "SetFileAttributesW": 1, "LdrLoadDll": 6, "FindResourceA": 3, "NtQueryInformationFile": 1, "CreateProcessInternalW": 1, "NtQueryValueKey": 1 }, "1896": { "RegCreateKeyExW": 4, "LdrUnloadDll": 1, "RegCloseKey": 4, "NtTerminateProcess": 3, "NtClose": 41, "RegCreateKeyExA": 1, "SizeofResource": 2, "SetFileTime": 1, "NtReadFile": 6, "NtWriteFile": 18, "LdrGetDllHandle": 4, "NtAllocateVirtualMemory": 4, "SetFilePointer": 4, "NtCreateFile": 7, "NtQueryAttributesFile": 1, "RegSetValueExW": 4, "NtOpenKey": 1, "SearchPathW": 1, "LoadResource": 2, "LdrGetProcedureAddress": 2, "GetFileType": 2, "FindResourceA": 2, "NtQueryInformationFile": 1, "CreateProcessInternalW": 1, "NtQueryValueKey": 1 }, "2104": { "NtCreateSection": 1, "SearchPathW": 1, "LoadStringW": 2, "SetUnhandledExceptionFilter": 1, "SetErrorMode": 1, "NtCreateFile": 1, "NtClose": 2, "GetSystemTimeAsFileTime": 1, "LdrLoadDll": 1, "GetFileAttributesW": 1, "NtMapViewOfSection": 1 }
提取api統計資訊
@2、資料預處理
在使用API呼叫序列作為神經網路的輸入之前,我們需要將資料轉換為數字特徵序列向量。
圖2
為了最大限度地利用神經網路給出的可能性方法論,我們將卷積和復發層結合在一個神經元中網路。圖2描繪了我們的神經網路架構。卷積部分由卷積和池化層組成。一方面是卷積的層用於從原始單熱向量中提取特徵。卷積 捕獲相鄰輸入向量之間的相關性併產生新的特徵。我們使用兩個大小為3×60的卷積濾波器,相當於3-gram。作為卷積的結果,我們採用大小的特徵向量對於每個輸入特徵,第一和第二卷積層的圖10和20示出。後每個卷積層我們使用max-pooling來減少維數資料為兩倍。我們的神經網路的卷積部分的輸出連線到經常性部分。我們轉發卷積的每個輸出過濾器作為一個向量。使用LSTM細胞對得到的序列進行建模。我們使用LSTM cell,因為它們在訓練方面很靈活,即使是最大序列長度限制為200個API Call。使用重複層我們能夠在核心API中顯式建模順序依賴項痕跡。均值池用於從中提取最重要的特徵LSTM輸出並降低了進一步資料處理的複雜性。此外,我們使用Dropout來防止過度擬合和softmax層輸出標籤概率
3、效果驗證
在本文中,我們構建深度神經網路以改進建模和分類系統呼叫序列。 通過結合卷積和復發在一個神經網路架構中,我們獲得最佳分類結果。使用包含兩個卷積層的混合神經網路一個復發層我們得到了一種新的惡意軟體分類方法。 我們的神經網路不僅勝過其他更簡單的神經架構,而且還勝過以前廣泛使用的隱馬爾可夫模型和支援向量機。總的來說,與之相比,我們的方法表現出更好的效能。