# 隐写检测决策树与证据分级 隐写检测先按载体定方法,提取失败按顺序枚举。本文档与 SKILL.md 步骤 1-4 配套使用。 ## 载体 × 特征决策树 ``` 怀疑对象 ├─ 文件尾部异常(大小不整/尾随数据)→ 尾部附加检查(binwalk/hexdump) ├─ 图片(PNG/BMP)→ LSB 位平面扫描(zsteg/脚本/stegsolve) ├─ 图片(JPEG)→ DCT 域方法(outguess 类),不做 LSB(有损压缩已破坏位平面) ├─ 音频 → 频谱图目检(sox spectrogram)+ steghide 尝试 ├─ EXIF/元数据 → exiftool 查看异常字段 ├─ 压缩包未用空间 → 解包后对比原始大小/CRC 检查 └─ 无特征 → 不进入隐写流程(先 [[re-triage]] 确认文件类型与可疑点) ``` ## 工具选择分支 ``` 确认载体后 ├─ PNG/BMP + 怀疑 LSB → zsteg 全通道 → 指定平面提取(-E 语法) ├─ 任何载体 + 怀疑常规隐写 → steghide extract(需要密码则标注) ├─ 尾部/附加数据 → binwalk 分割提取 → magic 验证 ├─ 需要逐位平面目检 → stegsolve(Java GUI) └─ 工具无输出但怀疑仍在 → python3 脚本(按位提取 + 顺序枚举) ``` ## 提取失败分支 ``` 提取乱码/无结果 ├─ 怀疑顺序问题 → 枚举组合:行序(正/逆)× 位序(LSB/MSB)× 通道(RGB 各通道/组合)× 位平面(b1/b2…) ├─ 怀疑压缩 → 查压缩头(zlib 78 9C / gzip 1F 8B / bzip2 42 5A 68)→ 先解压再读 ├─ 怀疑加密 → 查密钥线索(密码提示/附近文件)→ 有则 [[re-crypto-decrypt]],无则标注 ├─ 怀疑嵌套 → 每层提取物再过一遍检测流程(多载体分层) └─ 全部排除 → 标注「未检出」(不等于不存在,见 [[gotchas]]) ``` ## 检测结论分级表 | 级别 | 判据 | 处置 | |---|---|---| | 确认嵌入 | 提取出有效数据(magic 命中/可读内容) | 提取 + 存档(路径 + sha256) | | 强烈可疑 | 结构异常 + 熵异常 + 工具命中但提取无效 | 继续枚举顺序/压缩/加密假设 | | 可疑特征 | 单一特征(如高熵段) | 列为线索,不定性;与其他线索合并判断 | | 未检出 | 无特征/枚举穷尽无果 | 输出「未检出」+ 已用方法清单(盲区声明) | ## 组合套路(完整流程) 1. 文件初勘([[re-triage]]:类型/magic/大小核对) 2. 结构检查(pngcheck/exiftool/hexdump 尾部) 3. 隐写扫描(zsteg/steghide/binwalk 按载体) 4. 提取 → 验证(magic/可读性/压缩头) 5. 枚举(顺序/通道/位平面)→ 仍无 → 标注未检出 + 方法清单 ## 实现教训(内化) - 检测结论分三级,熵/结构异常只是线索不是证据——定性必须提取成功或结构级异常确认 - 提取顺序枚举是最高频的失败修复手段,脚本化枚举比手工快 - 「未检出」要带方法清单与盲区声明(隐藏方可用非常规顺序/加密/新型载体) - 每步产物 sha256 存档,验证结论可复核 ## 使用注意 - 取证场景先确认授权范围(目标载体/数据类别) - 提取物初勘走 [[re-triage]];解密衔接 [[re-crypto-decrypt]] - CTF 场景留意 flag 格式(题目说明的 flag 前缀),提取物先 strings 扫一遍