本文内容是记录之前在做360的DataFountain恶意软件方向比赛时第一次分析和提交采用的分析思路。整体倾向按照以往分析经验构建有价值特征单模型分类,没有采用“广泛提取特征然后交给深度学习模型进行学习,最后通过组合模型修正精度。”的套路。
数据说明
一共包含3个文件
tarin_label.csv 训练集的标签
train.zip 训练数据 5841个asm和无头PE
test.zip 测试数据
赛题数据集包含了来自10个恶意软件家族,10000多个恶意软件的PE文件(No header)和使用IDA Pro生成的asm文件,并将其分为训练集与测试集两部分。
-PE:抹除头部信息的PE文件,将原本PE头数据全部变成连续的0x00。
-ASM: 使用IDA Pro生成的PE源文件对应的.asm文件
-train_label.csv: 标签文件,标记文件所属家族。
采用多分类对数损失函数对结果进行评价。
数据分析
观察数据,训练集包含PE、ASM和train_label三类,测试集只包含PE和ASM数据。PE和ASM是没有处理过的原始数据不是数据集,需要自己建立特征,可选择的维度比较多。train_label说明和标签显示一共需要区分10个家族,标号从0开始,到9结束。
待分析的样本全部为PE文件。根据数据推测asm和无头PE的关系:asm文件是原始的PE经过IDA的引擎分析出来的结果(没有使用高级分析器),然后保存了asm之后,再处理掉了头部的数据形成了bin文件。
抹掉PE头部的意图比较明显,对抗样本动态分析和PE头分析,覆盖内容和长度的不确定性导致基本不可能恢复头部。同时,一些针对前n byte的特征方法不能直接套用。没有了PE头部,一些基于头部分类的特征也没法生成和使用。
不同的家族在数据集中存在数据分布不均匀,训练时需要平衡下权重。
bin文件
- 暴力破解功能
肉眼观察asm文件,有些样本中是含有字典字符串,应该是这些样本具备暴力破解的功能,大概是类似可自动传播的蠕虫或者挖矿攻击类样本。这里考虑提取特征:字符串的计数向量。
- 反杀毒软件功能
asm文件的数据中同样有杀毒软件名称的字典,属于比较典型的反杀毒软件功能。
asm文件
- UPX壳
UPX是一种压缩壳,一般使用的结果是二进制结构发生了变化,并且可能会使字节频率分布应该更加平均。目的是为了躲避特征检测机制,比如YARA的检测。
asm文件里显示的UPX壳没脱掉,文件里的特征会有UPX0、UPX1这样的区段。同时在bin文件的十六进制转ASCII结果里可以看到特征会有UPX!
这样的字符串。
测试集有壳大约 1169 个。
- 函数调用
没有PE头,没办法直接生成imphash,只能看函数的静态地址和call调用信息。
集合 | 去重数量 |
---|---|
训练集 | 159 |
测试集 | 416 |
测试集&训练集 | 105 |
同类编译时静态函数地址可能是相似甚至相同的。
特征工程
文件大小
这个特征在解压bin文件后就可以比较明显看到,有些文件集中分布在特定的大小。
字符串特征
程序字符串取词
直接使用strings取字符串生成效果不好,比如段的名称可能被取出来。
精细化提取字符串,对asm文件的特定数据段里的进行了基于正则的ASCII可见字符的取词。 目的主要是取暴力破解时用的字典和硬编码的一些字符串。
SSDEEP
分片模糊哈希是解决二进制文件分类、相似性计算比较等问题有效办法,算法通过对二进制进行分块计算局部模糊哈希,形成最后的字符串。这种算法得出的哈希值可以一定程度抵抗局部的修改,被破坏的PE头的影响也可以被降低。
ssdeep的值本身会根据输入内容长度发生变化。满足一定长度的数据后,ssdeep的值长度就会固定下来。题目给出的样本基本都能满足产出一个长度相对有效的ssdeep值。
处理时,先通过ssdeep对bin文件进行哈希计算,得出块大小和一短一长两个哈希值。
N-gram处理
以一个字符为单位向后滑动窗口的方式取定长字符串的形成特征。对长哈希hash1结果进行比较,测试取的6位定长字符串,给模型观察的内容是公共高频部分的分布。
ssdeep自带的相似性比较也可以使用,或者使用其他字符串相似度比较。
函数调用
提取asm文件中每个函数里的函数静态位置,还取了函数中call的地址的关系,调用call的数量。
是否使用UPX
单独处理是否有UPX作为一个特征,有UPX置1,没有的为0。
模型训练
随机森林
RF应该是比赛中单一模型效果比较好的选择了,使用random_state比不用得分稍微好一些。
自测score结果
0.9965772960638904
根据提交要求,最后导出predict_proba
进行提交,最后loss将近0.7。