# 二进制变体/补丁对比决策树与证据分级 ## 场景决策树(入口 → 分支) ### 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]]);对比属静态操作,动态确认走对应技能 - 结论按本表分级标注,并注明工具版本与阈值(相似度分数、排除规则)