goby指纹提取与yara逆向.md
字数 1868 2025-08-26 22:11:29

Goby指纹提取与YARA逆向分析技术文档

1. Goby指纹识别机制概述

Goby是一款优秀的网络资产识别工具,其指纹识别功能具有以下特点:

  • 只需访问一次目标首页即可完成识别
  • 使用YARA规则进行高效匹配
  • 识别速度快且准确率高

2. Goby指纹规则存储位置

2.1 旧版Goby的crules文件

在早期版本中,Goby将指纹规则存储在名为crules的文件中:

  • 文件头包含"yara"标识
  • 文件内直接包含可读的指纹规则文本
  • 规则间存在AND、OR等逻辑关系但未明确标注

2.2 新版Goby的指纹存储

新版Goby(使用Go 1.16+)采用go embed特性内嵌资源:

  • 资源在二进制文件中明文存储
  • 可通过搜索"YARA"关键字定位指纹规则部分
  • 指纹规则结构与旧版类似但存储方式不同

3. YARA规则文件结构分析

3.1 YARA编译文件头结构

typedef struct _ARENA_FILE_HEADER {
    char      magic[4];   // "yara"标识
    uint32_t  size;       // 文件大小
    uint32_t  version;    // 版本号
} ARENA_FILE_HEADER;

3.2 YARA规则文件头结构

typedef struct _YARA_RULES_FILE_HEADER {
    DECLARE_REFERENCE(YR_RULE*, rules_list_head);
    DECLARE_REFERENCE(YR_EXTERNAL_VARIABLE*, externals_list_head);
    DECLARE_REFERENCE(const uint8_t*, code_start);
    DECLARE_REFERENCE(YR_AC_MATCH_TABLE, match_table);
    DECLARE_REFERENCE(YR_AC_TRANSITION_TABLE, transition_table);
} YARA_RULES_FILE_HEADER;

3.3 YARA规则加载流程

  1. 通过yr_arena_load_stream读取文件头和版本信息
  2. 使用yr_rules_load_stream加载规则表
  3. 映射各节地址到内存结构

4. YARA虚拟机执行机制

4.1 虚拟机核心函数

  • 主执行函数:yr_execute_code (位于exec.c)
  • 栈式虚拟机架构
  • 通过opcode驱动执行

4.2 关键opcode

Opcode 功能描述
OP_HALT 停止执行
OP_INIT_RULE 初始化规则
OP_OBJ_LOAD 加载模块
OP_OBJ_FIELD 访问模块字段
OP_PUSH 压入参数
OP_CALL 调用函数
OP_MATCH_RULE 完成匹配
OP_JTRUE/JFALSE 条件跳转
OP_AND/OP_OR/OP_NOT 逻辑运算

4.3 规则初始化结构

typedef struct _YR_RULE {
    int32_t g_flags;
    int32_t t_flags[MAX_THREADS];
    DECLARE_REFERENCE(const char*, identifier);
    DECLARE_REFERENCE(const char*, tags);
    DECLARE_REFERENCE(YR_META*, metas);
    DECLARE_REFERENCE(YR_STRING*, strings);
    DECLARE_REFERENCE(YR_NAMESPACE*, ns);
    clock_t clock_ticks;
} YR_RULE;

typedef struct _YR_META {
    int32_t type;
    YR_ALIGN(8) int64_t integer;
    DECLARE_REFERENCE(const char*, identifier);
    DECLARE_REFERENCE(char*, string);
} YR_META;

5. YARA规则反编译技术

5.1 反编译流程

  1. 解析YARA编译文件结构
  2. 提取opcode序列
  3. 将opcode转换为可读指令
  4. 分析指令逻辑关系

5.2 简单规则示例

反编译输出:

205 : OP_INIT_RULE  ;{"flags": 0, "identifier": "rule_2", "metadata": {"rule_id": "2", ...}}
222 : OP_OBJ_LOAD 5050743 ;fofa
231 : OP_OBJ_FIELD 5050748 ;body_contains
240 : OP_PUSH 5050762 ;/oaapp/webobjects/oaapp.woa
249 : OP_CALL 5050801 ;s
258 : OP_OBJ_VALUE  ;
259 : OP_MATCH_RULE 260 ;

对应原始规则:

fofa.body_contains("/oaapp/webobjects/oaapp.woa")

5.3 复杂逻辑规则处理

YARA使用逆波兰表达式(后缀表达式)表示逻辑关系,例如:

反编译输出:

445 : OP_INIT_RULE  ;...
462 : OP_OBJ_LOAD 5051424 ;fofa
471 : OP_OBJ_FIELD 5051429 ;body_contains
...
637 : OP_OR  ;
638 : OP_NOP  ;
639 : OP_OR  ;
640 : OP_NOP  ;
641 : OP_OR  ;
642 : OP_NOP  ;
643 : OP_MATCH_RULE 644 ;

对应逻辑表达式:

规则1 OR 规则2 OR 规则3 OR 规则4

5.4 后缀表达式转中缀表达式算法

Python实现示例:

def zhuanh(l: list):
    l.reverse()
    s = []
    fuhao = ['OP_AND', 'OP_OR', 'OP_NOT']
    while len(l) > 0:
        x = l.pop()
        if x not in fuhao:
            s.append(x)
        else:
            r1 = s.pop()
            if x == 'OP_NOT':
                s.append("!{}".format(r1))
            else:
                r2 = s.pop()
                x = x.replace("OP_AND", "and")
                x = x.replace("OP_OR", "or")
                s.append(f"({r1} {x} {r2})")
    if len(s) != 1:
        raise Exception("错误")
    return s[0]

复杂规则转换示例:

输入: [1,2,3,4,5,6,'OP_AND',7,8,9,10,11,'OP_OR','OP_AND',12,'OP_OR','OP_OR','OP_OR','OP_OR','OP_OR','OP_OR','OP_OR']
输出: ((((((((12 or ((11 or 10) and 9)) or 8) or 7) or (6 and 5)) or 4) or 3) or 2) or 1)

6. 指纹规则提取与应用

6.1 提取流程

  1. 从Goby二进制文件中定位YARA规则部分
  2. 反编译规则opcode序列
  3. 解析规则逻辑关系
  4. 转换为JSON等结构化格式

6.2 规则JSON示例

{
    "rule_id": "2",
    "level": "5",
    "product": "CNPOWER-OA(OA8000)",
    "company": "CNPOWER",
    "category": "OA",
    "rules": [
        {
            "module": "fofa",
            "field": "body_contains",
            "value": "/oaapp/webobjects/oaapp.woa"
        }
    ],
    "logic": "single"
}

6.3 自定义扫描器集成方案

  1. 实现"fofa"模块对应的方法:

    • body_contains
    • title_contains
    • protocol_contains
    • 等匹配函数
  2. 编写表达式解析器处理规则逻辑

  3. 将提取的规则转换为扫描器可用的格式

7. 技术难点与解决方案

  1. YARA版本兼容性问题

    • 不同版本数据结构可能变化
    • 解决方案:使用对应版本的源码分析(如yara-3.10.0)
  2. 规则逻辑关系解析

    • 后缀表达式处理复杂
    • 解决方案:实现逆波兰转中缀算法
  3. 虚拟机执行流程分析

    • 需要深入理解YARA虚拟机
    • 解决方案:通过调试跟踪执行流程

8. 扩展应用

  1. 自定义指纹规则开发

    • 基于Goby规则格式开发新指纹
    • 利用YARA高效匹配特性
  2. 规则优化与合并

    • 分析现有规则逻辑
    • 优化表达式减少匹配次数
  3. 多引擎支持

    • 将规则转换为其他扫描器格式
    • 如Nmap、Wappalyzer等

9. 参考资源

  1. YARA官方源码:https://github.com/VirusTotal/yara
  2. Go-YARA库:https://github.com/hillu/go-yara
  3. YARA反编译器:https://github.com/jbgalet/yaradec
  4. 表达式解析器实现:https://x.hacking8.com/post-383.html

10. 总结

通过逆向分析Goby的YARA规则实现,我们可以:

  1. 提取高质量指纹规则用于自定义扫描器
  2. 深入理解YARA虚拟机的执行机制
  3. 学习高效指纹识别系统的设计思路
  4. 为开发自己的资产识别系统提供参考

这种方法不仅适用于Goby,也可应用于其他基于YARA的识别系统分析。

Goby指纹提取与YARA逆向分析技术文档 1. Goby指纹识别机制概述 Goby是一款优秀的网络资产识别工具,其指纹识别功能具有以下特点: 只需访问一次目标首页即可完成识别 使用YARA规则进行高效匹配 识别速度快且准确率高 2. Goby指纹规则存储位置 2.1 旧版Goby的crules文件 在早期版本中,Goby将指纹规则存储在名为 crules 的文件中: 文件头包含"yara"标识 文件内直接包含可读的指纹规则文本 规则间存在AND、OR等逻辑关系但未明确标注 2.2 新版Goby的指纹存储 新版Goby(使用Go 1.16+)采用 go embed 特性内嵌资源: 资源在二进制文件中明文存储 可通过搜索"YARA"关键字定位指纹规则部分 指纹规则结构与旧版类似但存储方式不同 3. YARA规则文件结构分析 3.1 YARA编译文件头结构 3.2 YARA规则文件头结构 3.3 YARA规则加载流程 通过 yr_arena_load_stream 读取文件头和版本信息 使用 yr_rules_load_stream 加载规则表 映射各节地址到内存结构 4. YARA虚拟机执行机制 4.1 虚拟机核心函数 主执行函数: yr_execute_code (位于exec.c) 栈式虚拟机架构 通过opcode驱动执行 4.2 关键opcode | Opcode | 功能描述 | |--------|----------| | OP_ HALT | 停止执行 | | OP_ INIT_ RULE | 初始化规则 | | OP_ OBJ_ LOAD | 加载模块 | | OP_ OBJ_ FIELD | 访问模块字段 | | OP_ PUSH | 压入参数 | | OP_ CALL | 调用函数 | | OP_ MATCH_ RULE | 完成匹配 | | OP_ JTRUE/JFALSE | 条件跳转 | | OP_ AND/OP_ OR/OP_ NOT | 逻辑运算 | 4.3 规则初始化结构 5. YARA规则反编译技术 5.1 反编译流程 解析YARA编译文件结构 提取opcode序列 将opcode转换为可读指令 分析指令逻辑关系 5.2 简单规则示例 反编译输出: 对应原始规则: 5.3 复杂逻辑规则处理 YARA使用逆波兰表达式(后缀表达式)表示逻辑关系,例如: 反编译输出: 对应逻辑表达式: 5.4 后缀表达式转中缀表达式算法 Python实现示例: 复杂规则转换示例: 6. 指纹规则提取与应用 6.1 提取流程 从Goby二进制文件中定位YARA规则部分 反编译规则opcode序列 解析规则逻辑关系 转换为JSON等结构化格式 6.2 规则JSON示例 6.3 自定义扫描器集成方案 实现"fofa"模块对应的方法: body_contains title_contains protocol_contains 等匹配函数 编写表达式解析器处理规则逻辑 将提取的规则转换为扫描器可用的格式 7. 技术难点与解决方案 YARA版本兼容性问题 : 不同版本数据结构可能变化 解决方案:使用对应版本的源码分析(如yara-3.10.0) 规则逻辑关系解析 : 后缀表达式处理复杂 解决方案:实现逆波兰转中缀算法 虚拟机执行流程分析 : 需要深入理解YARA虚拟机 解决方案:通过调试跟踪执行流程 8. 扩展应用 自定义指纹规则开发 : 基于Goby规则格式开发新指纹 利用YARA高效匹配特性 规则优化与合并 : 分析现有规则逻辑 优化表达式减少匹配次数 多引擎支持 : 将规则转换为其他扫描器格式 如Nmap、Wappalyzer等 9. 参考资源 YARA官方源码:https://github.com/VirusTotal/yara Go-YARA库:https://github.com/hillu/go-yara YARA反编译器:https://github.com/jbgalet/yaradec 表达式解析器实现:https://x.hacking8.com/post-383.html 10. 总结 通过逆向分析Goby的YARA规则实现,我们可以: 提取高质量指纹规则用于自定义扫描器 深入理解YARA虚拟机的执行机制 学习高效指纹识别系统的设计思路 为开发自己的资产识别系统提供参考 这种方法不仅适用于Goby,也可应用于其他基于YARA的识别系统分析。