二进制函数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:
  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%

相关参考:

特别铭谢senkant

求各位看官老爷点个赞!!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页