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规则加载流程
- 通过
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 规则初始化结构
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 反编译流程
- 解析YARA编译文件结构
- 提取opcode序列
- 将opcode转换为可读指令
- 分析指令逻辑关系
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 提取流程
- 从Goby二进制文件中定位YARA规则部分
- 反编译规则opcode序列
- 解析规则逻辑关系
- 转换为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 自定义扫描器集成方案
-
实现"fofa"模块对应的方法:
body_containstitle_containsprotocol_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的识别系统分析。