如何打造一款自己的恶意样本检测工具
字数 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特征
  • 工作流程:
    1. 解析样本集的共同字符串
    2. 白名单库过滤
    3. 通过启发式/机器学习筛选最优规则

3.2 使用方法

python3 yarGen.py -m /path/to/malware_samples
  • -m参数指定样本文件/目录路径

3.3 规则类型

  1. 普通规则:匹配特定样本
  2. 泛规则(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 关键功能点

  1. 规则加载:yara.compile()
  2. 文件遍历:使用os.popen执行find命令
  3. 大小过滤:限制检测≤5MB文件
  4. 匹配检测:rules.match()
  5. 结果展示:使用prettytable格式化输出

五、实践建议

5.1 样本收集渠道

  • 应急响应过程中收集
  • 蜜罐系统捕获
  • 威胁情报平台获取
  • 公开恶意软件样本库

5.2 规则维护

  1. 分类存放样本(按家族/类型)
  2. 定期使用yarGen生成新规则
  3. 人工审核优化自动生成的规则
  4. 建立规则版本管理系统

5.3 性能优化

  • 对大目录扫描时添加进度显示
  • 设置合理的文件大小阈值
  • 考虑多线程/异步处理

六、扩展应用

6.1 集成方案

  • 与SIEM系统集成
  • 作为自动化应急响应流程的一环
  • 结合沙箱动态分析结果

6.2 高级功能

  1. 哈希值校验:
import hashlib
def get_file_hash(filepath):
    with open(filepath, 'rb') as f:
        return hashlib.sha256(f.read()).hexdigest()
  1. 文件类型识别:
import magic
def get_file_type(filepath):
    return magic.from_file(filepath)
  1. 规则自动更新:
import requests
def update_rules(url, save_path):
    r = requests.get(url)
    with open(save_path, 'wb') as f:
        f.write(r.content)

七、参考资料

  1. YARA官方文档
  2. yarGitHub仓库:https://github.com/Neo23x0/yarGen
  3. FreeBuf上的YARA高级用法文章

通过本指南,您可以构建一个基于YARA的自定义恶意样本检测系统,根据实际需求灵活调整规则和检测逻辑,有效提升应急响应效率。

打造自己的恶意样本检测工具:基于YARA的实践指南 一、背景与需求分析 在应急响应工作中,安全工程师经常面临以下挑战: 恶意软件变种繁多(如挖矿软件通常包含下载器、守护程序、主程序等多个组件) WebShell查找困难 公开分析资料有限,自主分析耗时 现有工具局限性: Windows平台有火绒、D盾等优秀工具 Linux平台虽有河马、CloudWalker等工具,但功能分散,难以满足应急响应需求 二、YARA技术基础 2.1 YARA简介 开源恶意软件识别分类工具(由VirusTotal工程师开发) 基于文本/二进制模式创建描述规则 可应用于文件或运行进程的检测 2.2 YARA规则结构 2.3 示例规则解析 规则名:php_ webshell meta:规则元信息 strings:特征字符串区域 condition:匹配逻辑(本例为或关系) 三、自动化规则生成工具yarGen 3.1 yarGen功能 自动提取样本中的strings和opcodes特征 工作流程: 解析样本集的共同字符串 白名单库过滤 通过启发式/机器学习筛选最优规则 3.2 使用方法 -m 参数指定样本文件/目录路径 3.3 规则类型 普通规则:匹配特定样本 泛规则(Super Rules):匹配多个相关样本 3.4 规则优化建议 人工审核自动生成的规则 重点关注具有显著特征性的字符串 示例优化分析(冰蝎2.0 WebShell规则): $s1 、 $s2 具有较高特征性 $s4 特征性较弱可考虑优化 四、检测工具实现(Python) 4.1 核心组件 yara-python模块 文件遍历与过滤 结果展示 4.2 代码实现 4.3 关键功能点 规则加载: yara.compile() 文件遍历:使用 os.popen 执行find命令 大小过滤:限制检测≤5MB文件 匹配检测: rules.match() 结果展示:使用prettytable格式化输出 五、实践建议 5.1 样本收集渠道 应急响应过程中收集 蜜罐系统捕获 威胁情报平台获取 公开恶意软件样本库 5.2 规则维护 分类存放样本(按家族/类型) 定期使用yarGen生成新规则 人工审核优化自动生成的规则 建立规则版本管理系统 5.3 性能优化 对大目录扫描时添加进度显示 设置合理的文件大小阈值 考虑多线程/异步处理 六、扩展应用 6.1 集成方案 与SIEM系统集成 作为自动化应急响应流程的一环 结合沙箱动态分析结果 6.2 高级功能 哈希值校验: 文件类型识别: 规则自动更新: 七、参考资料 YARA官方文档 yarGitHub仓库:https://github.com/Neo23x0/yarGen FreeBuf上的YARA高级用法文章 通过本指南,您可以构建一个基于YARA的自定义恶意样本检测系统,根据实际需求灵活调整规则和检测逻辑,有效提升应急响应效率。