本项目提供的数据来自经过沙箱程序模仿运行后的 API 指令序列,全为 Windows 二进制可执行程序,经过脱敏处理;样本数据均来自互联网,此中恶意文件的类型有感染型病毒、木马程序、挖矿程序、DDoS木马、勒索病毒等,数据总计 6 亿条。 (1)训练数据调用记载近 9000 万次,文件 1 万多个(以文件编号汇总),字段形貌如表所示:
字段类型表明field_idbigint文件编号labelbigint文件标签apistring文件调用的 API 名称tidbigint调用 API 的线程编号indexstring线程中 API 调用的顺序编号 此中,文件标签有 8 种:0-正常 / 1-勒索病毒 / 2-挖矿程序 / 3-DDoS 木马 / 4-蠕虫病毒 / 5-感染型病毒 / 6-后门程序 / 7-木马程序。 注意: ① 一个文件调用的 API 数目有可能许多,对于一个 tid 中调用超过 5000 个 API 的文件,我们进行了截断,按照顺序保留了每个 tid 前 5000 个 API 的记载。 ② 差异线程 tid 之间没有顺序关系,同一个 tid 中的 index 由小到大代表调用的先后顺序关系。 ③ index 是单个文件在沙箱执行时的全局顺序,由于沙箱执行时间有精度限制,因此在同一个index 上会出现同线程或者差异线程都在多次执行 API 的情况,其可以包管与 tid 内部的顺序雷同,但不包管连续。 (2)测试数据调用记载近 8000 万次,文件 1 万多个。除了没有 label 字段,数据格式与
训练数据一致。
1.2 训练集数据探索
print('There are {} data are below 10000'.format(np.sum(train_analysis['file_id_cnt'] <= 1e / train_analysis.shape[0]))
复制代码
There are 0.8012529704039749 data are below 10000
我们也发现,API 调用次数的 80% 都会合在 10000 次以下。
(2)为了便于分析变量 file_id_cnt 与 label 的关系,将数据按 file_id_cnt 变量(即 API 调用次数)取值划分为 16 个区间。
我们把 LightGBM 的特征重要性进行排序并输出,同样也可以再次验证之前 EDA 部分的结论,每个文件调用 API 的次数与病毒类型是强相干的。
plt.figure(figsize=[20, 10,])
plt.figure(figsize=[20, 10,])
sns.barplot(x = feature_importance.iloc[:10]['fea_name'], y = feature_importance.iloc[:10]['fea_imp'])
复制代码
plt.figure(figsize=[20, 10,])
sns.barplot(x = feature_importance['fea_name'], y = feature_importance['fea_imp'])
复制代码
对特征的重要性分析也再一次验证了我们的想法:
API 的调用次数及 API 的调用类别数是最重要的两个特征,也就是说差异的病毒经常会调用差异的 API,而且因为有些病毒必要复制自身的原因,调用 API 的次数会非常多:第三到第五强的都是线程统计特征,这也较为容易理解,因为木马等病毒经常必要通过线程监听一些内容,所以在线程数目的使用上也会表现的略不雷同。
树模子绘制。我们把 LightGBM 的树模子依次输出,并结合绘制的树模子进行业务的理解。