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读取后的预览图:
Encryption, Math, Sort, String这四类函数都有各自不同的特征。
先分析下每行的JSON数据,主要分为四部分:id, semantic, lista_asm, cfg.
id:这部分代表该二进制函数的id编号,并不能从这部分看出来这个函数属于哪个类,所以放弃这部分。
semantic:这部分展示了该函数所属的类别,可以用来当作数据的 label 部分。
lista_asm:线性列表,这部分包含了该函数所使用的各种指令!从前一节我们所知道的类别特征来看,不同二进制函数会偏好于不同类型的指令操作,该部分可以用于提取特征!
我本人的想法是:
对于lista_asm部分,是计算所有指令出现的数量,因为考虑到不同类型的函数,他们内部的汇编指令肯定类型和数量都有差别的。
具体方法就是,先遍历一遍所有数据的所有指令,然后截取每条指令开头的汇编指令,先把整个数据中所有的出现的指令名字存在一个字典类型的数据里,然后回头挨个对每一个二进制函数,去查所有指令在该函数中出现的数量,没出现的指令数量为0.
第一个二进制函数的特征大概长下图这样,总共184种指令:
然后在做这三种特征集的对照实验之前,我还做了个决定划分多少数据作为验证集的实验,我粗略的按照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
求各位看官老爷点个赞!!