用途:逆向 Haskell/OCaml 编译产物,还原闭包/堆对象、求值顺序与模式匹配分支,判别 OCaml 原生/字节码产物。不适用于命令式语言产物,也不适用于控制流完整、只需抽函数逻辑的场景。
主要能力:一是运行时识别,用 readelf/llvm-nm 查符号(GHC 的 stg_/RTS/HsMain/_closure/info,OCaml 的 caml*),用 file 判别字节码脚本头。二是闭包与堆对象分析,GHC 关注 closure 首字段 info 表指针、thunk 与已求值 WHNF 区分、CAF 惰性求值;OCaml 关注 block 头(64 位 header=(size<<10)|(color<<8)|tag)与 tagged int 最低位判别。三是调用约定,GHC 参数经栈、返回值在 R1-R3、info 表为枢纽;OCaml 参数走寄存器、闭包调用经 caml_applyN。四是数据流优先策略,以闭包字段初始化点、构造器 tag 分发、常量引用替代控制流分析,并输出构造器/字段/使用点格式供后续分析消费。五是 OCaml 字节码结构分析,用 xxd 看 #!ocamlrun 脚本头与 T/C 魔数,用 ocamlobjinfo 解析导入单位与 CRC。
使用方式:可选安装 ghc(apt/brew/ghcup,ghc --version 验证)做同版本对照,安装 ocaml 工具链(apt/brew/opam,ocamlobjinfo 验证)做结构分析,配合 Ghidra/IDA 反编译及 file/xxd/Python struct 字节核对;步骤与产物请按各环节存档。
适用场景:GHC RTS 符号与闭包布局还原、OCaml 原生链还原、字节码产物判别与结构分析。
限制:RTS 版本差异大(字段表基于 9.14/4.14 实测);惰性求值致顺序不可预测、控制流打散,静态控制流分析价值低;字节码非 native、需按字节码结构分析;tagged int 需先解标记;GHC 模块名有 z 编码需手工还原;info 表与 entry code 是同一指针的两个视图,字段表按负偏移读;TCO 使递归变跳转;须排除 stg_/hs_ 机械符号。具体收益、费用、价格等资料暂未提供。