二進位制函式JSON資料分類問題——機器學習

是土豆大叔啊!發表於2020-12-04

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:
  1. 該類函式的JSON資料通常非常非常的長!
  2. 此外在 cfg 中會含有許多 FOR 和 IF 迴圈。
  3. 該類函式經常使用 xor, shifts, bitwise 操作!
  • Math:
  1. 使用了許多運算操作。
  2. 有時也會使用向量和矩陣
  3. 通常使用浮點指令,特殊暫存器 xmm
  • Sort:
  1. 邏輯簡單,通常只使用一兩個FOR迴圈和一些輔助操作
  2. 經常使用比較和移動指令
  • String:
  1. 大量比較和交換記憶體指令!

2. 資料各部分分析

先分析下每行的JSON資料,主要分為四部分:id, semantic, lista_asm, cfg.

  • id:這部分代表該二進位制函式的id編號,並不能從這部分看出來這個函式屬於哪個類,所以放棄這部分。

  • semantic:這部分展示了該函式所屬的類別,可以用來當作資料的 label 部分。

  • lista_asm:線性列表,這部分包含了該函式所使用的各種指令!從前一節我們所知道的類別特徵來看,不同二進位制函式會偏好於不同型別的指令操作,該部分可以用於提取特徵!
    指令示例

  • cfg:控制流圖,被編碼為 networkx 圖,該部分包含了各種節點和其連結,也可以從這部分提取出特徵!
    cfg圖示例

3、可能的資料特徵

  1. CFG部分的可能特徵,例如迴圈的數量,邊緣的數量,迴圈的複雜程度
  2. 計算每個函式所用指令的數量,比如可以歸納一下指令的型別,如將某些位操作,浮點運算,資料移動等各型別。
  3. 全域性特徵,比如外部呼叫的數量,指令的數量,暫存器的使用情況

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%

求各位看官老爺點個贊!!

相關文章