先确认输入是原始报文、文件格式、PCAP 或 PCAPNG,以及需要回答的协议问题。需要静态定位时,默认 engine=reverse、reverseProvider=bundled 使用随包服务,实际 provider=ghidra,无需本机商业安装;显式 Ghidra 使用独立车道,商业扩展仅在显式配置 reverseProvider=commercial 时使用。工具按当前 provider 与 capabilities 选择。需要高级工具时调用 ig5_profile toolset=full;按返回的 toolsetScope 判断作用域:支持作用域的宿主仅切换当前 agent,旧宿主明确返回 plugin-instance 时才影响插件实例。两种切换均不持久化,不授权样本或网络执行。ig5_protocol 处理离线字节,提供未知 framing/字段候选推断,不抓实时网络、不主动发包。记录 capture 来源、样本身份、方向、时间与截断;字段假设和观察事实分开陈述。
input 选择一种来源:{encoding:"hex"|"base64",data:"..."}、{path:"完整本地文件路径"}、{ref:"sha256:...",result_id:"产生该 ref 的报告 UUID"},或静态字节 {source:{target,engine,ea,size,expected_revision}}。引用来源优先提供明确 producer ID;省略 input.result_id 标记 unbound,不能从共享 hash 猜测样本归属。先用 action=inspect 查看有限字节/字符串预览、长度、熵与长度前缀候选。对 PCAP/PCAPNG 调用 action=capture,按需要设置 max_packets、max_frames、max_reassembly_bytes 与预览预算。检查实际支持的 link/IP 层、capture 截断、TCP 缺口、重传/重叠冲突和序号回绕,并分别核对响应 value 内的 parseComplete/reassemblyComplete/decodingComplete;不能把有缺口的片段拼成“完整流”,不能把一个方向流当作完整会话,也不能把时间顺序当作 TCP 字节顺序。UDP 保留单个报文边界,TCP 保留方向和连续 span。即使省略 packet 预览,也应读取 unsupportedSummary 的原因计数。
沿字符串、导入、调用和反编译定位收发、解压、解密与解析函数,再用字节、CFG、结构体与实际端序读取核验字段。ig5_slice 只是标识符焦点行,不是完备污点证明。需要动态缓冲区时,只有目标执行已获授权后才通过审批调用 ig5_dbg 或 ig5_emulate,记录真实暂停/返回身份;不可用只读工作台请求启动调试或绕开审批。内置 Reverse 与显式 Ghidra 默认调试后端为随包 x64dbg;native win32 仅用于显式商业扩展且实际能力支持的情况,失败不静默换后端。仿真架构与 ABI 按当前 provider、capabilities 和目标核验,不能仅凭 engine 名称推断 ARM64 等架构支持。若报文是加密/压缩数据,先按 ig5-crypto 的显式参数与验证流程处理;协议模块不会自动破解加密。
仅当已有静态目标时,用 ig5_profile target=... workspace={action:create,goal:...} 建立调查任务,或用 workspace={action:get,id:...} 恢复。候选解析函数优先用 ig5_decompile style=dossier task_id=... 聚合反编译、CFG、调用者/被调函数和栈帧;检查章节 ok/truncated/unsupported/error、provenance、partial 与 stale,正文响应预算不等于全部后端计算预算。以本次 taskRevision 作为 expected_task_revision 更新假设/下一步/结论,冲突后重读。任务只存分析元数据,不写 IDB、不授权执行,status 是调用者进度声明;复开或数据库修订变化后重新取证。任务文本保留捕获和结果引用,不复制密钥原值;纯离线协议分析无需为建任务打开数据库,继续使用独立 result_id/ref。
未知边界/字段时用 action=infer,inference.format=auto|stream|messages|capture。默认 stream boundary=unknown,只有证据支持时才给 message-start;samples 必须是已知完整应用消息,不能直接把 TCP packets 当成消息。用不同报文作 holdout_samples,检查候选在独立数据是否成立。capture 模式按 flow/方向分组,不能将缺口、冲突或未确定起点强行参与训练。保留等价候选、分数、覆盖、尾部与截断,单报文不足以确认协议。
候选的 framing/schema 直接交给 action=decode;支持 fixed、length-prefix 和 delimiter。长度规则保留位置/大小/端序/headerLength/长度是否含头;换行 delimiter 保留准确字节与是否包含分隔符。验证最短/零/极端/缺尾报文和 holdout;字段保持中性,u64/i64 不转换成失真 Number。可读结果不证明完整语义,未知状态机保持未确定。
引用所选 chunk/datagram 时,将其 dataRef.ref 与产生该捕获的顶层 result_id 配对,作为下一步的 input.ref 和 input.result_id。解密或解压结果转入协议车道时,同样配对前一步的 output.ref 与顶层 result_id,例如:
json{"action":"decode","input":{"ref":"<前一步 output.ref 或所选 dataRef.ref>","result_id":"<产生所选 ref 的顶层 result_id>"},"framing":{"type":"fixed","length":4},"schema":{"fields":[{"name":"value","offset":0,"type":"u32","endian":"big"}]}}
此例只有显式 4 字节整数假设,需按真实边界与字段证据替换配置及占位符。若使用嵌套 dataRef.result_id,先确认它绑定所选 ref。action=result 的顶层 result_id 读取历史报告,不是 input.result_id 的替代写法。
至少对多条独立报文检查方向、帧边界、长度、字段值和剩余字节,并包含截断或错误长度样本。将解码结果与真实解析函数的分支、返回值或已授权暂停观察对账;同一报文成功解码只说明显式 schema 可读,不证明完整协议已恢复。协议状态机需由多阶段会话和函数状态迁移支持,当前工具不自动推导状态机。报告所有 unsupported、incomplete、conflict、truncated 或 budget 标记。
保留 result_id、输入 ref、流/报文 buffer ref、capture indices/spans、明确的 framing/schema 和复核结果。用 action=result result_id=... select=... 选择报告的相关部分,避免将大报文反复塞入上下文;select 是路径选择,不能假定它提供分页游标。模型响应截断不等于磁盘报告丢失。工作台只读显示证据,composer 草稿需由用户发送;名称、注释、结构体或补丁回写继续经过宿主审批。最终交付可重复使用的显式解码配置和产物引用,同时列明未知字段、未验证方向及状态迁移。


