reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
# 二进制变体/补丁对比决策树与证据分级
## 场景决策树(入口 → 分支)
### 1. 分析目标分支(第一级)
```
目标
├─ N-day 补丁定位(修复前后对比)→ 步骤 3:changed 集合 → 候选排序
├─ 家族变体溯源 → 步骤 4:两两矩阵 → 聚类 → 演进链
├─ 相似样本关联(这是不是同一个家族的)→ 共享函数比例判定
└─ 共享代码识别(复用/借用判断)→ 独有函数 + 常量/字符串命中
```
### 2. 可比性分支(第二级)
```
配对输入
├─ 同架构 + 同工具链 → 函数级全量匹配(指令哈希 + 调用图 + 常量)
├─ 同架构 + 异编译器 → 降低指令哈希权重,调用图/常量为主(坑 1)
├─ 跨架构 → 只比逻辑层(调用图/常量/字符串),标注跨架构局限
└─ 符号状态
├─ 未 strip → 符号对齐优先(快且准)
└─ strip → 结构匹配(入口特征/调用模式/常量锚定)
```
### 3. 匹配层级分支(第三级)
```
匹配粒度
├─ 函数级(默认)→ matched/changed/new/deleted 集合
├─ 指令级 → 变更函数内逐指令 diff(改动点定位)
├─ 结构级 → 调用图/数据引用对比(重排/合并检测)
└─ 语义级 → 需先 [[re-cpp-abi]] 还原符号语义再比
```
### 4. 候选排序分支(第四级,补丁 diff 时)
```
changed 函数集
├─ 新增校验/边界处理(if/长度/范围检查)→ 高优先级:漏洞点候选
├─ 行为变化(调用新增/参数变化)→ 中优先级:功能变更/修复
├─ 纯重构(等价重排)→ 低优先级:跳过或标注
└─ 无 changed → 修复可能内联/跨函数重组(坑 7)→ 扩大对比面
```
### 5. 结果核查分支(第五级)
```
匹配结果
├─ 跨工具一致(BinDiff + rz-diff 同结论)→ 直接采信
├─ 冲突 → 人工抽查差异函数(反编译复核)
├─ 相似度虚高 → 查共享库依赖([[re-imports]] 对照)排除
└─ 阈值未校准 → 先人工抽查 10-20 个函数定阈值再批量
```
## 证据分级表
| 级别 | 证据形态 | 示例 | 用途 |
|---|---|---|---|
| A 强 | 跨工具一致 + 反编译人工确认 | changed 函数差异点在反编译中确认语义(新增校验) | 可下「漏洞点/修复点」结论 |
| B 中 | 单工具高相似 + 调用链闭合 | 函数相似度 > 阈值且调用关系对应 | 可下「高度疑似」 |
| C 弱 | 特征级 | 仅字符串/常量命中、函数级匹配无闭合 | 只支持「关联候选」 |
| 反证 | 良性解释 | 差异属重构/平台分支,无安全语义 | 记录并存档 |
- 缺陷模式推断(越界/缺失校验类)单独标注置信度,与「函数变更」事实分开陈述
- 相似度分数是证据不是结论:分数本身不承载语义,人工复核后才定级
## 实现教训(内化)
- 先配对再对比:sha256/架构/工具链指纹先记录,可比性不成立时直接降级,别浪费全量匹配
- 相似度阈值先校准:每个样本对集的人工抽查结果反推阈值,再定聚类线
- 排除共享库是防虚高的第一道关:依赖清单([[re-imports]])先行,业务代码再比
- 跨架构只比逻辑层:指令级对比在跨架构下无意义,标注局限
- 补丁 diff 按变更语义排序而非相似度排序:新增校验/边界处理优先于重构类差异
- 跨工具交叉验证:BinDiff 系与 rz-diff 结论一致时证据强度显著提升
## 使用注意
- 样本来源不可信时在沙箱内处理([[re-sandbox]]);对比属静态操作,动态确认走对应技能
- 结论按本表分级标注,并注明工具版本与阈值(相似度分数、排除规则)

View File

@@ -0,0 +1,37 @@
# 二进制变体/补丁对比方法论坑与边界
## 匹配算法组(误判来源)
- **指令哈希受编译差异影响**:同源码不同优化等级/编译器版本,指令级哈希就变——按指令哈希判「不同」不等于「逻辑不同」,权重低于调用图与常量
- **调用图受内联/拆分影响**:编译器内联后函数边界漂移,调用图对比会拆错对应关系——匹配失败先怀疑内联,扩大匹配粒度或按常量锚定
- **相似度分数不承载语义**:高分可能只是共享代码/模板实例化;低分也可能是被刻意改写的同源逻辑——分数只作排序依据,语义靠人工复核
- **跨架构匹配率必然低**:指令集不同导致指令级维度全部失效——只比逻辑层(调用图/常量/字符串),并标注跨架构局限
- **模板/泛型实例化干扰**:C++ 模板实例化的多个函数高度相似——按模板参数区分实例,避免把实例化当家族标志
## 符号与地址组
- **strip 后无符号锚点**:函数名全无时按入口特征/调用模式/常量匹配——错误率高,需阈值校准与人工抽查
- **地址漂移别比裸地址**:PIE/ASLR/重定位/版本构建差异都会移动函数地址——按符号/函数序对齐;版本间比较先归一化节区布局
- **符号名可能误导**:strip 不彻底的残留符号、伪造符号(混淆工具改名)会把不同函数粘在一起——符号对齐结果仍要过一遍结构确认
- **导入表是稳定锚点但非全量**:导入函数对齐可靠,但内部函数不出现——导入对齐只作辅助维度,不能替代函数级匹配
## 工具差异组
- **BinDiff 与 Diaphora 算法不同,结果可能不一致**:匹配策略(指令哈希 vs 图同构的权重)不同——冲突时人工复核,一致性高时证据更强
- **BinExport 版本与反编译器版本需匹配**:BinExport 插件与 IDA/Ghidra 版本严格绑定,版本错配导出失败或结果异常——先核对版本再导出
- **rz-diff -B 消耗分析时间**:`-B` 先自动分析两个二进制(反汇编+函数识别),大文件耗时长——先用 `-t functions` 限定范围,大批量用脚本分批
- **大二进制内存压力**:全函数图对比在超大二进制(内核/大型框架)上内存占用高——按节区(如 .text)分段对比,或增大工具内存
- **qbindiff/ghidriff 的结果格式差异**:开源替代输出 CSV/BinDiff 格式不等——下游消费前统一格式(按 [[re-analyze/analysis-contract]])
## 反例与边界组
- **共享库虚高相似度**:两个无关样本都链接同一 libc/框架,共享函数比例虚高——排除共享库符号([[re-imports]] 依赖对照)再算相似度
- **「没 diff 出来」≠「没修」**:修复可能内联进相邻函数、跨函数重组、或只改常量——扩大对比面(含内联展开)并核对版本历史
- **changed 多 ≠ 漏洞多**:补丁常夹带重构/平台适配——按变更语义过滤(新增校验/边界处理优先),重构类排除
- **变体「相似」≠「同源」**:同源代码跨编译器、跨平台重编译后相似度下降;刻意改写(加花指令/常量混淆)也降——溯源结论需多证据(时间线/独有函数/行为侧)闭合
- **单工具结论不跨工具复现**:只用一个工具出的匹配,换工具可能完全不同——重要结论至少两个工具或人工复核
## 使用注意
- 样本来源不可信时在沙箱内处理([[re-sandbox]]);对比是静态操作,动态确认走对应技能
- 结论按 [[decision-tree]] 分级标注,并注明工具版本、阈值与排除规则