如何打造一款自己的恶意样本检测工具
字数 1219 2025-08-09 22:00:34
打造自己的恶意样本检测工具:基于YARA的实践指南
一、背景与需求分析
在应急响应工作中,安全工程师经常面临以下挑战:
- 恶意软件变种繁多(如挖矿软件通常包含下载器、守护程序、主程序等多个组件)
- WebShell查找困难
- 公开分析资料有限,自主分析耗时
现有工具局限性:
- Windows平台有火绒、D盾等优秀工具
- Linux平台虽有河马、CloudWalker等工具,但功能分散,难以满足应急响应需求
二、YARA技术基础
2.1 YARA简介
- 开源恶意软件识别分类工具(由VirusTotal工程师开发)
- 基于文本/二进制模式创建描述规则
- 可应用于文件或运行进程的检测
2.2 YARA规则结构
rule rule_name {
meta:
description = ""
author = ""
reference = ""
date = ""
strings:
$s1 = "特征字符串"
$s2 = /正则表达式/
condition:
布尔表达式
}
2.3 示例规则解析
rule php_webshell {
meta:
description = "php_webshell"
author = "shuoshuren"
date = "2020-12-27"
strings:
$s1 = "eval()"
$s2 = "assert()"
$s3 = "exec()"
$s4 = "system()"
condition:
$s1 or $s2 or $s3 or $s4
}
- 规则名:php_webshell
- meta:规则元信息
- strings:特征字符串区域
- condition:匹配逻辑(本例为或关系)
三、自动化规则生成工具yarGen
3.1 yarGen功能
- 自动提取样本中的strings和opcodes特征
- 工作流程:
- 解析样本集的共同字符串
- 白名单库过滤
- 通过启发式/机器学习筛选最优规则
3.2 使用方法
python3 yarGen.py -m /path/to/malware_samples
-m参数指定样本文件/目录路径
3.3 规则类型
- 普通规则:匹配特定样本
- 泛规则(Super Rules):匹配多个相关样本
3.4 规则优化建议
- 人工审核自动生成的规则
- 重点关注具有显著特征性的字符串
- 示例优化分析(冰蝎2.0 WebShell规则):
rule _xunyi2_xunyi_2_shell_ma_ssr_3 {
strings:
$s1 = "if (isset($_GET['pass']))"
$s2 = "$_SESSION['k']=$key;"
$s3 = "$key=$_SESSION['k'];"
$s4 = "print $key;"
condition:
(uint16(0) == 0x3f3c and filesize < 2KB and all of them)
or (all of them)
}
$s1、$s2具有较高特征性$s4特征性较弱可考虑优化
四、检测工具实现(Python)
4.1 核心组件
- yara-python模块
- 文件遍历与过滤
- 结果展示
4.2 代码实现
import os
import yara
import prettytable as pt
def static_scan(path):
# 初始化结果表格
result_table = pt.PrettyTable()
result_table.field_names = ['Path', 'LastChange']
result_table.align["Path"] = "l"
# 加载YARA规则
rules = yara.compile(filepath='rules.yar')
# 获取待检测文件列表
all_files = os.popen(f"find {path}").read().split('\n')
filtered_files = []
# 文件过滤(大小≤5MB)
for file in all_files:
try:
if os.path.getsize(file) <= 5*1024*1024:
filtered_files.append(file)
except:
pass
# 扫描检测
for file in filtered_files:
try:
with open(file, 'rb') as f:
matches = rules.match(data=f.read())
if matches:
last_modified = os.path.getmtime(file)
result_table.add_row([
file,
time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime(last_modified))
])
print(f"\033[1;31m告警:检测到标签{matches},文件位置{file}\033[0m")
except:
continue
print("\n扫描结果:")
print(result_table)
4.3 关键功能点
- 规则加载:
yara.compile() - 文件遍历:使用
os.popen执行find命令 - 大小过滤:限制检测≤5MB文件
- 匹配检测:
rules.match() - 结果展示:使用prettytable格式化输出
五、实践建议
5.1 样本收集渠道
- 应急响应过程中收集
- 蜜罐系统捕获
- 威胁情报平台获取
- 公开恶意软件样本库
5.2 规则维护
- 分类存放样本(按家族/类型)
- 定期使用yarGen生成新规则
- 人工审核优化自动生成的规则
- 建立规则版本管理系统
5.3 性能优化
- 对大目录扫描时添加进度显示
- 设置合理的文件大小阈值
- 考虑多线程/异步处理
六、扩展应用
6.1 集成方案
- 与SIEM系统集成
- 作为自动化应急响应流程的一环
- 结合沙箱动态分析结果
6.2 高级功能
- 哈希值校验:
import hashlib
def get_file_hash(filepath):
with open(filepath, 'rb') as f:
return hashlib.sha256(f.read()).hexdigest()
- 文件类型识别:
import magic
def get_file_type(filepath):
return magic.from_file(filepath)
- 规则自动更新:
import requests
def update_rules(url, save_path):
r = requests.get(url)
with open(save_path, 'wb') as f:
f.write(r.content)
七、参考资料
- YARA官方文档
- yarGitHub仓库:https://github.com/Neo23x0/yarGen
- FreeBuf上的YARA高级用法文章
通过本指南,您可以构建一个基于YARA的自定义恶意样本检测系统,根据实际需求灵活调整规则和检测逻辑,有效提升应急响应效率。