二進位制函式JSON資料分類問題——機器學習
CSDN有錢的看官老爺請點這:資料集下載-附程式碼
沒錢的看官老爺請點這:資料集下載-附程式碼,提取碼:gg7k
求各位看官老爺點個贊!!
注:檔名開頭為“no_dup”的檔案為消去重複項的,兩種資料並不影響使用。
一、背景
現在的許多壞銀使用惡意軟體控制我們的電子裝置,從而造成惡意傷害!惡意軟體的原理之一就是修改或直接移除電子裝置中二進位制的函式和變數名稱,常見手法就是函式進行惡意加密。
二、資料及任務介紹
我們的任務就是將被加密的函式給分辨出來,該任務有4個類,分別是:Encryption, Math, Sort, String。
但在分類之前,由於資料並不是處理好的,所以還需要確定提取哪些特徵!
資料集為 .txt 型別的檔案,每一行為一個JSON型別的資料,也包含了一個二進位制函式的各種資訊,每一個JSON資料的內部結構如下所示:
{
"id" : "一串數字",
"semantic" : "該函式的類別名稱",
"lista_asm" : "['彙編指令']",
"cfg" : {
"directed" : true,
"graph" : [],
"nodes" : [
{
"id" : 一串數字,
"asm" : "一個字串",
"label" : "一個字串"
}
{...}
"adjacency" : [
[{"id": number}, {...}]
[...]
]
]
"multigraph": false
}
}
使用pandas.read_json讀取後的預覽圖:
三、特徵的選擇和提取
1. 各類函式的大概特徵
Encryption, Math, Sort, String這四類函式都有各自不同的特徵。
- Encryption:
- 該類函式的JSON資料通常非常非常的長!
- 此外在 cfg 中會含有許多 FOR 和 IF 迴圈。
- 該類函式經常使用 xor, shifts, bitwise 操作!
- Math:
- 使用了許多運算操作。
- 有時也會使用向量和矩陣
- 通常使用浮點指令,特殊暫存器 xmm
- Sort:
- 邏輯簡單,通常只使用一兩個FOR迴圈和一些輔助操作
- 經常使用比較和移動指令
- String:
- 大量比較和交換記憶體指令!
2. 資料各部分分析
先分析下每行的JSON資料,主要分為四部分:id, semantic, lista_asm, cfg.
-
id:這部分代表該二進位制函式的id編號,並不能從這部分看出來這個函式屬於哪個類,所以放棄這部分。
-
semantic:這部分展示了該函式所屬的類別,可以用來當作資料的 label 部分。
-
lista_asm:線性列表,這部分包含了該函式所使用的各種指令!從前一節我們所知道的類別特徵來看,不同二進位制函式會偏好於不同型別的指令操作,該部分可以用於提取特徵!
-
cfg:控制流圖,被編碼為 networkx 圖,該部分包含了各種節點和其連結,也可以從這部分提取出特徵!
3、可能的資料特徵
- CFG部分的可能特徵,例如迴圈的數量,邊緣的數量,迴圈的複雜程度
- 計算每個函式所用指令的數量,比如可以歸納一下指令的型別,如將某些位操作,浮點運算,資料移動等各型別。
- 全域性特徵,比如外部呼叫的數量,指令的數量,暫存器的使用情況
4.我選擇的特徵
我本人的想法是:
-
對於lista_asm部分,是計算所有指令出現的數量,因為考慮到不同型別的函式,他們內部的彙編指令肯定型別和數量都有差別的。
具體方法就是,先遍歷一遍所有資料的所有指令,然後擷取每條指令開頭的彙編指令,先把整個資料中所有的出現的指令名字存在一個字典型別的資料裡,然後回頭挨個對每一個二進位制函式,去查所有指令在該函式中出現的數量,沒出現的指令數量為0.
第一個二進位制函式的特徵大概長下圖這樣,總共184種指令:
- 對於cfg部分,本來就有點複雜,我又有點
懶惰其他的事,最主要的是encryption函式cfg部分的label和asm部分的字串的長度尤其的長!所以想著先將 節點數量,每個節點 label和asm 字串的平均長度。如果假如這三項特徵之後,準確率會有上升,那麼再考慮cfg詳細的迴圈特徵之類的,如果準確率不上升,那乾脆放棄這部分。這樣總的特徵就是184+3=187個特徵。此外還做了個只加節點數量的作為一個新增的對照,184+1=185個特徵
然後在做這三種特徵集的對照實驗之前,我還做了個決定劃分多少資料作為驗證集的實驗,我粗略的按照70%,80%,90%的比例來做對照,使用了決策樹作為分類器,184個特徵作為資料集,其劃分比例準確率對比實驗的結果如下圖:
從上圖的結果來看,80%劃分為訓練集表現最好,那我就用80%來劃分資料集啦。
然後在使用決策樹為分類器,80%的資料劃分為訓練集的情況下,三種型別特徵的準確率對比如下:
那從結果來看,184個特徵的資料集表現還不錯,所以我乾脆拋棄CFG部分的特徵了。
最後總結下,資料集我採用184個特徵的資料,80%劃分為訓練集,最後展示下四類二進位制函式的184特徵的大概樣子:
四、分類器與最終結果
分類器除了上文提到的決策樹(Decision Tree),我還是用了SVM,高斯樸素貝葉斯(Gaussian Naive Bayes),邏輯迴歸(Logistic Regression).
最後的準確率對比如下圖:
關於最終的結果,我使用了投票法來整合,鑑於高斯樸素貝葉斯分類器的準確率跟其他分類器準確率差別太大,我就拋棄它了,只用其他三個分類器投票來輸出最終結果。
在 blindtest.txt 資料上的最終 F1-score 為 97.10%
求各位看官老爺點個贊!!
相關文章
- 二進位制安全學習:Example:Function Prologue and Function Epilogue(基礎函式呼叫機制)Function函式
- ROP【二進位制學習】
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- 沉思-騰訊 PHP 面試題請寫一個函式來檢查使用者提交的資料是否為整數(不區分資料型別,可以為二進位制、八進位制、十進位制、十六進位制數字)PHP面試題函式資料型別
- 【火爐煉AI】機器學習008-簡單線性分類器解決二分類問題AI機器學習
- Python print函式控制檯中文輸出16進位制問題Python函式
- 二進位制方式解決 power 問題
- 負數的二進位制數問題
- 複雜二進位制資料
- 機器學習之分類問題度量機器學習
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 多工學習中的資料分佈問題(二)
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- JavaScript 讀寫二進位制資料JavaScript
- 利用vstruct解析二進位制資料Struct
- keras框架下的深度學習(二)二分類和多分類問題Keras框架深度學習
- 資料科學和機器學習面試問題資料科學機器學習面試
- 二進位制修復中文亂碼的問題
- 二進位制與二進位制運算
- 機器學習-習題(二)機器學習
- Redis中快取二進位制資料Redis快取
- 解析機器學習中的資料漂移問題機器學習
- 進位制詳解:二進位制、八進位制和十六進位制
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 【機器學習】支援向量機分類機器學習
- 人工智慧 (02) 機器學習 - 監督式學習分類方法人工智慧機器學習
- Python處理十六進位制與二進位制轉換的問題——binascii自帶庫PythonASCII
- 利用機器學習進行惡意程式碼分類機器學習
- 深度學習之電影二分類的情感問題深度學習
- 演算法學習之二進位制的妙用演算法
- delphi+lazarus通用的dataset(二進位制+json)序列JSON
- KDE設區--C++的二進位制相容問題C++
- 函式學習二函式
- 二進位制
- (二進位制)
- 十進位制——二 (八、十六 )進位制
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 機器學習中的類別不均衡問題機器學習