python_mmdt:从0到1--实现简单恶意代码分类器(二)
概述
上篇文章python_mmdt:一种基于敏感哈希生成特征向量的python库(一)我们介绍了一种叫mmdt_hash
(敏感哈希)生成方法,并对其中的概念做了基本介绍。本篇,我们重点谈谈mmdt_hash
的分类应用场景。
需求场景
设想这么一个需求:有一批文件需要判定是否属于恶意文件,并且需要给出恶意文件所属的家族类型。这个需求该怎么高效处理呢?处理过程又该怎么固化成我们自己的经验呢?当以后面临同样的需求时,能否复用之前的结果呢?
我能想到的做法有以下三种:
- 做法一:本地下载杀毒软件,使用杀毒软件对这批文件进行扫描,查看检测结果。
- 做法二:将这些文件上传到诸如Virustotal之类的检测平台,查看检测结果。
- 做法三:随机抽取样本分析,判定为恶意的,则提取yara规则,利用yara规则对剩余文件进行扫描,未扫出的文件继续人工分析,继续提yara规则,如此反复,直到处理完成。
针对以上三种做法,分别讨论其优点和缺点:
- 做法一:
- 优点:处理方式简单快捷,误报率极低,处理效率高
- 缺点:单一杀软漏报率可能较高;在Linux/MacOS上安装、使用杀软不方便;处理过程很难固化为经验;有可能导致文件泄漏(联网使用杀软云查可能导致文件被厂商收集)
- 做法二:
- 优点:适用Windows/Linux/MacOS平台;检测误报率、漏报率都极低,结果丰富;处理效率高
- 缺点:有联网要求;有一定的代码开发工作;文件百分百泄漏
- 做法三:
- 优点:处理过程天然可固化为经验;适用任意平台;适用隔离网络;经验可积累,可复用;保证文件安全性
- 缺点:工作量极大,处理效率极低;
这里的需求场景也许太过定制化,但还是有一定的代表性的。针对以上的需求场景,python_mmdt
工具的分类算法,可以很好的覆盖上述场景。
使用python_mmdt
的做法,具有以下优点
- 处理方式简单、快捷、处理效率高
- 可打包为可执行文件,附带特征向量,跨平台适用Windows/Linux/MacOS
- 无联网要求,文件保密性高
- 处理过程可固化为经验,经验固化方式简单,处理结果复用方便
mmdt_hash
大小固定,存储占用空间小
当然,有三个缺点不能不提:
- 准确率可能较低(依赖于判定分值的设定)
- 漏报率可能较高(依赖于判定分值的设定)
- 部分文件的
mmdt_hash
值没有意义,不能用作分类规则。
因此,可以在不同的场景使用不同的判定分值,判定分值越高,准确率越高;判定分值越低,漏报率越低。
代码项目地址
- python_mmdt
- 版本:0.1.3
- 特性:实现简单分类器,项目附带基础敏感哈希特征库,可实现恶意样本匹配
基本介绍
使用pip
安装python_mmdt
之后,会向系统中添加如下命令:
- mmdt-hash:计算指定文件的
mmdt_hash
值 - mmdt-std:计算
mmdt_hash
的标准差,用于衡量mmdt_hash
的好坏 - mmdt-compare:比较两个文件的
相似度
- mmdt-gen:利用已知样本集,生成基于
mmdt_hash
的特征向量集合 - mmdt-filter:对生成的的特征向量集合,进行过滤,移除相同的特征向量
- mmdt-filter-simple:对生成的特征向量集,进行简单过滤(去重),适用与简单分类器
- mmdt-classify:对未知样本集进行分类处理,输出分类结果
基本命令使用
1. 计算文件的mmdt_hash
计算单个文件mmdt_hash
值
- 输入参数1:文件路径
- 屏幕输出:
mmdt_hash
的值 - 文件输出:无
# ➜ mmdt-hash APT28_1
# 5D58573C:B39A90BCDCB4D491BEC74B207AE5FE39
$ mmdt-hash $file
简单分类的mmdt_hash
结构如:index_hash:value_hash
,:
冒号前的是敏感哈希索引,:
冒号后的是敏感哈希真值。敏感哈希索引用于快速定位相似哈希,敏感哈希真值用于计算两个mmdt_hash
之间的相似度。
2. 计算mmdt_hash
的标准差
计算单个mmdt_hash
值的标准差
- 输入参数1:单个
mmdt_hash
值 - 屏幕输出:
mmdt_hash
值的标准差 - 文件输出:无
# ➜ mmdt-std 5D58573C:B39A90BCDCB4D491BEC74B207AE5FE39
# standard deviation: 45.333946
$ mmdt-std $mmdt_hash_str
mmdt_hash
值的标准差,用于衡量生成的mmdt_hash
的好坏。从大量统计结果看,当标注差低于10.0左右时,计算生成的mmdt_hash
的有效性太差,不能有效表示原始文件。
3. 计算两个文件的相似度
计算两个文件的相似度,输入2个文件路径,输出
- 输入参数1:文件1路径
- 输入参数2:文件2路径
- 屏幕输出:两个文件的相似度
- 文件输出:无
# ➜ mmdt-compare APT28_1 APT28_2
# 0.9929302916167373
$ mmdt-compare $file1 $file2
计算两个输入文件的相似度,相似度本质采用欧几里得距离衡量。计算两个mmdt_hash
的欧几里得距离,并归一化,计算得到相似度。
4. 生成特征向量集合
生成基于mmdt_hash
的特征向量集合
- 输入参数1:已知样本集的路径
- 输入参数2:已知样本集的标签文件路径
- 屏幕输出:生成特征向量过程信息
- 文件输出:当前文件夹生成两个文件,
mmdt_feature.label
和mmdt_feature.data
# ➜ mmdt-gen APT28 apt28.tags
# ...
# process: APT28_3, 22
# process: APT28_4, 23
# end gen mmdt set.
# ➜ ll mmdt_feature.*
# -rw-r--r-- 1 ddvv staff 703B 1 16 10:34 mmdt_feature.data
# -rw-r--r-- 1 ddvv staff 133B 1 16 10:34 mmdt_feature.label
$ mmdt-gen $file_path $file_tag
遍历指定文件目录,计算该目录下所有文件的mmdt_hash
,并从标签文件中读取对应标签,生成标签索引,记录到特征向量集合中。输入的标签文件采用文件名,标签
的csv格式存储。
5. 特征向量过滤
对生成的特征向量集合进行过滤处理
- 输入参数1:特征向量集合文件
- 输入参数2:过滤条件的标准差下限
- 屏幕输出:过滤特征向量过程信息
- 文件输出:覆盖输入的特征向量集合文件路径
# ➜ mmdt-filter mmdt_feature.data 10.0
# start filter mmdt set.
# old len: 23
# new len: 21
# end filter mmdt set.
# ➜ ll mmdt_feature.*
# -rw-r--r-- 1 ddvv staff 689B 1 16 10:39 mmdt_feature.data
# -rw-r--r-- 1 ddvv staff 133B 1 16 10:34 mmdt_feature.label
$ mmdt-filter $mmdt_feature_file_name $dlt
特征向量集合的一般过滤方法,计算特征向量集合中mmdt_hash
值的标准差,移除标准差小于10.0的mmdt_hash
。如前所说,标准差小于10.0的mmdt_hash
有效性很低,无法使用。
6. 简单分类器特征向量过滤
对生成的基于mmdt_hash
特征向量集合进行适配简单分类器(去重)过滤处理
- 输入参数1:特征向量集合文件
- 屏幕输出:过滤特征向量过程信息
- 文件输出:覆盖当前路径的
mmdt_feature.data
文件
# ➜ mmdt-filter-simple mmdt_feature.data
# start filter mmdt set.
# old len: 21
# new len: 21
# end filter mmdt set.
# ➜ ll mmdt_feature.*
# -rw-r--r-- 1 ddvv staff 689B 1 16 10:39 mmdt_feature.data
# -rw-r--r-- 1 ddvv staff 133B 1 16 10:34 mmdt_feature.label
$ mmdt-filter-simple $mmdt_feature_file_name
简单分类算法的特定过滤方式,移除完全相同的特征向量,并覆盖原始特征向量集合。
7. 分类器的使用
对指定文件或文件夹进行分类识别
- 输入参数1:目标文件路径或文件夹路径
- 输入参数2:相似度下限,可选,默认0.95
- 输入参数3:分类器类型,可选,默认1,简单分类器
- 屏幕输出:分类过程结果输出
- 文件输出:无
重要,需要将生成的mmdt_feature.label
和mmdt_feature.data
文件拷贝到python_mmdt
的安装路径,命令如下:
- 拷贝特征向量集文件:
mmdt-copy mmdt_feature.data
- 拷贝特征向量集对应标签文件:
mmdt-copy mmdt_feature.label
特别注意:
mmdt_feature.label
和mmdt_feature.data
文件名不可更改- 当缺失
mmdt_feature.data
文件时,分类器默认是用python_mmdt
的特征向量集 - 当缺失
mmdt_feature.label
文件时,分类器仍可以工作,但是判定结果仅输出是否识别文件,而不会输出对应的判定标签
# ➜ mmdt-classify . 0.8 1
# ...
# ./APT28_5,1.000000,group_apt28,39.660364
# ./APT28_2,0.992930,group_apt28,44.917703
# ./APT28_23,1.000000,group_apt28,39.682770
# ...
# 注意:缺失mmdt_feature.label文件时,只会输出是否匹配,而不会输出对应标签
# ➜ mmdt-classify . 0.8 1
# ...
# ./APT28_5,1.000000,matched_0,39.660364
# ./APT28_2,0.992930,matched_0,44.917703
# ./APT28_23,1.000000,matched_0,39.682770
# ...
$ mmdt-classify $file_or_path $sim_value $classify_type
python_mmdt
的核心功能,实现未知样本的快速识别。mmdt-classify . 0.8 1
表示对当前目录下的文件进行分类,分类判定分值设定为0.8,分类算法采用1(简单分类算法)。
结束
本篇主要介绍了python_mmdt
的一种简单分类应用。在实际使用简单分类器时,python_mmdt
会将特征向量集合转成简单分类特征库,通过查找相等的索引哈希,计算对应mmdt_hash
的相似度,满足判定分值,则返回判定结果。利用python_mmdt
,可以实现自动特征的提取、积累、复用,通过不断的积累,期待实现“见过即可查”的目标。
如果恶意代码分析人员,可以共建一个mmdt_hash
特征向量库,一定可以大大方便恶意代码分析这件事。设想一下,每个特征向量20个字节,1亿条特征向量的集合大小也就2G左右,1亿条特征向量可以检出的恶意代码数量可能达到上百亿,上千亿,提供的保护覆盖面就广阔的多了。更重要的,共享的mmdt_hash
值也不会导致原始文件信息的泄漏,但却能提供非常有价值的信息。
另外,目前python_mmdt
直接对压缩包类型的文件计算敏感哈希,其mmdt_hash
值常常不可用,后续会尝试对压缩包进行解压缩,计算实际文件。当前使用哈希索引匹配的的方式,虽然效率高,但是漏报率也高。后续会尝试使用KNN算法对特征向量集合进行计算,提高基检出率。
python_mmdt:从0到1--实现简单恶意代码分类器(二)的更多相关文章
- 使用spring 4.0 + maven 构建超简单的web项目
一.需求 使用spring去管理web项目,是目前非常流行的一种思路,本文将介绍使用maven+spring 4.0.2 来构建一个简单的web项目. 二.实现 1.新建一个maven项目,如下图所示 ...
- redis5.0.3单实例简单安装记录
redis5.0.3单实例简单安装记录 日常需要测试使用,索性记录下来,免得临时又麻烦的找资料. yum -y install make gcc-c++ cmake bison-devel ncurs ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- ThinkPHP5.0框架开发实现简单的页面跳转
ThinkPHP5.0框架开发实现简单的页面跳转 一.效果 登录界面 登录成功界面 登录失败界面 二.目录结构 三.代码 控制器中的Login.php <?php // 声明命名空间 names ...
- ThinkPHP5.0最最最最最简单实例
ThinkPHP5.0最最最最最简单实例 一.效果图 二.操作步骤 1.用mysql数据库建立数据库 2.按照ThinkPHP官网的指示装好ThinkPHP5.0 tp5里面的目录结构如下: 3.配置 ...
- Android(Lollipop/5.0) Material Design(一) 简单介绍
Material Design系列 Android(Lollipop/5.0)Material Design(一) 简单介绍 Android(Lollipop/5.0)Material Design( ...
- 从0开始写一个简单的vite hmr 插件
从0开始写一个简单的vite hmr 插件 0. 写在前面 在构建前端项目的时候,除开基本的资源格式(图片,json)以外,还常常会需要导入一些其他格式的资源,这些资源如果没有第三方vite插件的支持 ...
- 【阿里聚安全·安全周刊】科学家警告外星恶意代码|新方法任意解锁iPhone
本周的七个关键词: 外星恶意代码 丨 任意解锁iPhone 丨 安卓9.0 丨 黑客攻击医疗设备 丨 仙女座僵尸网络 丨 苹果联合创始人被骗比特币 丨JavaScript -1- [恶意代码] ...
- 20164305 徐广皓 Exp4 恶意代码分析
实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systr ...
随机推荐
- win10新版wsl2使用指南
本篇文章会介绍win10中wsl2的安装和使用以及遇到的常见问题比如如何固定wsl2地址等问题的总结. 一.wsl2简介 wsl是适用于 Linux 的 Windows 子系统,安装指南:适用于 Li ...
- 数组单调性判断以及all和diff函数的用法
clc;clear all;close all; n = 1 ;x = zeros(100,1);while n~= 0 n = input('请输入向量的长度n(0退出程序):'); for i = ...
- python初学者-判断今天是今年的第几天代码
判断今天是今年的第几天源代码 import time date =time.localtime() year,month,day=date[:3] day_month=[31,28,31,30,31, ...
- STM32F103的CAN结构体学习
使用STM32F103的CAN通信就是用这4个结构体函数,把他们理解透了,CAN就好用了 CAN的结构体定义在stm32f10x_can.h里面 /************************** ...
- Dubbo服务暴露源码解析②
目录 0.配置解析 1.开始export 2.组装URL 3.服务暴露 疑问解析 先放一张官网的服务暴露时序图,对我们梳理源码有很大的帮助.注:不论是暴露还是导出或者是其他翻译,都是描述expor ...
- AOP的姿势之 简化 MemoryCache 使用方式
0. 前言 之前写了几篇文章介绍了一些AOP的知识, 但是还没有亮出来AOP的姿势, 也许姿势漂亮一点, 大家会对AOP有点兴趣 内容大致会分为如下几篇:(毕竟人懒,一下子写完太累了,没有动力) AO ...
- Qt学习笔记-Qtcreator的webkit和qt4.7.0的版本有关
之前下载了一个最新的是qtcreator,是通过ubuntu的是apt-get下载的.可是里面没有webkit控件.网上的网友说是最新的没有了.要用老版的,于是下载了一个2.5.2的就正常了. 用老版 ...
- Object[] cannot be converted to String[]
原因: 你应该是想把List数组转 String数组吧! 然后想当然的调用list.toArray()方法. 结果 该方法返回的是Object[]数组,导致类型不匹配! 解决办法: 还在乖乖的用循环吧 ...
- 前端JS获取用户位置
精确至城市 (基于腾讯位置服务的IP定位,需申请KEY)
- Elastisearch在kibana下批量处理(mget和bulk)
一.批量查询 有点:能够大大减少网络的请求次数,减少网络开销 1.自定义设置index.type以及document id,进行查询 GET /_mget { "docs":[ { ...