上篇文章python_mmdt:一种基于敏感哈希生成特征向量的python库(一)我们介绍了一种叫mmdt_hash
(mmdt敏感哈希)生成方法,并对其中的概念做了基本介绍。本篇,我们重点谈谈mmdt_hash
的分类应用场景。
设想这么一个需求场景:有一批文件需要判定是否属于恶意文件,并且需要给出恶意文件所属的家族类型。这个需求该怎么高效处理呢?处理过程又该怎么固化成我们自己的经验呢?当以后面临同样的需求时,能否复用之前的结果呢?
我能想到的方法有以下三种:
针对以上三种方法,分别讨论其优点和缺点:
上诉需求场景也许太过特殊化,但还是有一定的代表性的。针对以上的需求场景,python_mmdt
工具的分类算法,可以很好的覆盖上述场景。
使用python_mmdt
的做法,具有以下优点等
同时,有三个缺点需要指出:
因此,可以在不同的场景使用不同的判定分值,判定分值越高,准确率越高;判定分值越低,漏报率越低。如判定分值设定为1.0,则几乎没有误报;如判定分值设定设定为0.85,则比判定分值设为0.95的漏报率低。
使用pip
安装python_mmdt
之后,会向系统中添加如下命令:
mmdt_hash
值结构如:"index_hash:value_hash"
,index_hash
是4字节敏感哈希索引,value_hash
是16字节敏感哈希值,两个哈希值之间使用:
冒号隔开。敏感哈希索引用于快速定位相似哈希,敏感哈希值用于计算两个mmdt_hash
之间的相似度。
mmdt_hash
值的标准差,用于衡量生成的mmdt_hash
的好坏。从大量统计结果看,当标准差低于10.0左右时,计算生成的mmdt_hash
的有效性太差,不能有效表示原始文件。
计算两个文件的相似度,输入2个文件路径,输出
计算两个输入文件的相似度,相似度本质采用欧几里得距离衡量。计算两个mmdt_hash
的欧几里得距离,并进行归一化处理,得到相似度。
遍历指定文件目录,计算该目录下所有文件的mmdt_hash
,并从标签文件中读取对应标签,生成标签索引,组合到特征向量集合中。输入的标签文件采用文件名,标签
的csv
格式存储。mmdt_feature.label
是本特征向量集合的标签文件,用于将标签索引还原为原始名称;mmdt_feature.data
是特征向量集合文件。两文件都使用pickle
序列化,同时使用zip
压缩保存。
特征向量集合的通用过滤方法,计算特征向量集合中mmdt_hash
值的标准差,移除标准差小于10.0的mmdt_hash
。如前所说,标准差小于10.0的mmdt_hash
有效性很低,无法使用。
简单分类算法的特定过滤方式,移除完全相同的特征向量,并覆盖原始特征向量集合。
需要将特征向量集合文件或特征向量集合标签文件拷贝到工具目录,才可正常使用分类功能。
重要说明,需要将生成的mmdt_feature.label
和mmdt_feature.data
文件拷贝到python_mmdt
的安装路径,命令如下:
特别注意:
python_mmdt
的核心功能,实现未知样本的快速识别。mmdt-classify . 0.8 1
表示对当前目录
下的文件进行分类,分类判定分值设定为0.8
,分类算法采用1
(简单分类算法)。
本篇主要介绍了python_mmdt
的一种简单分类应用。在实际使用简单分类器时,python_mmdt
会将特征向量集合转成简单分类特征库,通过查找相等的索引哈希,计算对应mmdt_hash
的相似度,满足判定分值,则返回判定结果。利用python_mmdt
,可以实现自动特征的提取、积累、复用,通过不断的积累,期待实现“见过即可查”的目标。
另外,目前python_mmdt
直接对压缩包类型的文件计算敏感哈希,其mmdt_hash
值常常不可用,后续会尝试对压缩包进行解压缩,计算实际文件。当前使用哈希索引匹配的的方式,虽然效率高,但是漏报率也高。后续会尝试使用KNN算法对特征向量集合进行计算,提高基检出率。
如果恶意代码分析人员,可以共建一个mmdt_hash
特征向量库,一定可以大大方便恶意代码分析这件事。设想一下,每个特征向量20个字节,1亿条特征向量的集合大小在2G左右,1亿条特征向量可以检出的恶意代码数量可能达到上百亿,上千亿,提供的恶意代码检测覆盖面就广阔的多了。更重要的,共享mmdt_hash
值不会导致原始文件信息的泄漏,同时又能提供非常有价值的信息。
$ mmdt
-
hash
$
file
$ mmdt
-
std $mmdt_hash_str
$ mmdt
-
std $mmdt_hash_str
$ mmdt
-
compare $file1 $file2
$ mmdt
-
compare $file1 $file2
$ mmdt
-
gen $file_path $file_tag
$ mmdt
-
gen $file_path $file_tag
$ mmdt
-
filter
$mmdt_feature_file_name $dlt
$ mmdt
-
filter
$mmdt_feature_file_name $dlt
$ mmdt
-
filter
-
simple $mmdt_feature_file_name
$ mmdt
-
filter
-
simple $mmdt_feature_file_name
$ mmdt
-
classify $file_or_path $sim_value $classify_type
$ mmdt
-
classify $file_or_path $sim_value $classify_type
1
2
3
|
$ mmdt - std $mmdt_hash_str
|
1
2
3
|
$ mmdt - compare $file1 $file2
|
1
2
3
4
5
6
7
8
9
|
$ mmdt - gen $file_path $file_tag
|
1
2
3
4
5
6
7
8
9
|
$ mmdt - filter $mmdt_feature_file_name $dlt
|
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课