1.背景
病毒分析的过程中,对于机器上捕获到的病毒,想要知道是否有病毒的变种还遗留在受害主机上,这些变种是否过了免杀。在沙箱网站deepviz上,提供了相似病毒搜索的功能。我已经下载了一些病毒样本,利用cuckoo开源沙箱建立了病毒数据库, 将样本转换为数据。因此也想搞一个病毒相似度搜索。
之前阅读《数学之美》,里面有如何构建一个简单的搜索引擎。病毒搜索也可以按照相同的思路去做。选取病毒中的一些内容作为关键词,将这些关键词排序,存在则标记为1,不存在则标记为0。 最后对比两个样本标记的比特位计算相似度。
2. 选取特征
cuckoo中的样本扫描结果中有很多病毒描述数据,比如访问了网站,文件创建,注册表创建等,但是这些数据都不好量化。 而动态调用的API能够很好的反应病毒的行为,并且易于量化。
不停的增加样本数量,提取API进行统计,最后常用的API稳定在280左右。
3. 计算样本描述向量
比如API排序为
<pre>
GetUserNameExW
RtlCompressBuffer
NtOpenSection
GetVolumePathNameW
GetForegroundWindow
RtlDecompressFragment
</pre>
样本1中出现API GetUserNameExW,GetVolumePathNameW 则描述向量为100100
样本2中出现API RtlCompressBuffer,GetVolumePathNameW 描述向量为010100
4. 计算相似度
如上样本1,样本2的相似度计算如下
- 将两个值进行异或: bxor = 100100 xor 010100 = 110000
- 将两个值按位或: bor = 100100 or 010100 = 110100
- 计算bxor中出现1的个数 nxor = 2
- 计算bor中出现1的个数 nor = 3
- 计算相似度 = 1-xnxor/nor = 33.33%
即计算两个样本api出现的总个数(去重),然后计算不同API的个数。计算不同api占比。
5. 逐个对比,排序取出前几个
结果类似如下
<pre>
(u'6b446db3949e46bd72774b28cf258287', 1.0)
(u'2faba1514a830a7b69acd0b7faed33e2', 1.0)
(u'9ffced7a445a7417994040cc071ece83', 1.0)
(u'5c87fb7c80335b6e21b8f47d7a6f3709', 1.0)
(u'0beb86a027950cbacf7bc41e2c03fd34', 1.0)
(u'ed67681da5338620c30ed2a38c5f4746', 0.9811320754716981)
(u'ee712781d9badcb958a9b745214a196b', 0.9811320754716981)
</pre>