Page 10 - 《软件学报》2026年第6期
P. 10
李玉璋 等: BinDec: 面向 RISC-V 的 LLM 与符号执行协同反编译方法 2329
的分析. 第 5 节讨论本文方法的局限性和实验效度威胁. 第 6 节对本文进行总结并展望未来的研究.
1 研究背景和相关工作
本节介绍反编译的研究背景以及相关的研究工作. 首先说明传统反编译器的背景知识, 然后介绍与本文相关
的神经反编译相关工作.
1.1 研究背景
反编译器的核心功能是将低级语言代码恢复为高级语言代码. 反编译器通常处理两类低级语言: 一类是面向
特定硬件指令集架构的二进制代码; 另一类是基于虚拟机实现的程序语言所对应的字节码, 例如 Java 字节码. 字
节码的反编译通常属于语言支持的一部分, 实现相对容易; 而面向硬件的二进制代码反编译则是一个更为广泛且
复杂的问题. 本文所研究的反编译问题限定于针对二进制代码的情形. 与反编译密切相关的概念是反汇编, 后者指
通过解析二进制代码中的指令序列, 将其转换为等价的汇编代码. 反汇编器通常作为编译工具链的组成部分, 例
如 GCC 编译器工具链中包含针对不同硬件架构的 objdump 工具, 可用于完成反汇编操作.
反编译器的基本工作流程是: 首先对二进制代码进行反汇编得到汇编代码, 随后使用针对特定指令集架构的
提升器将得到的汇编代码提升为该反编译器内部所使用的中间表示形式; 在此基础上, 进一步开展控制流与数据
流分析, 以恢复高级语言代码的结构与语义特征; 最终生成目标高级语言形式的反编译代码. 其总体过程如图 1.
x86-64
优化
反汇编 提升 分析 反编译
AArch64 汇编代码 中间代码 中间代码 伪C代码
RISC-V
图 1 反编译器总体架构
中间代码在反编译器中起到关键作用, 作为一种代码抽象形式, 它为多个代码分析模块提供统一的输入与输
出接口. 表 1 展示了主流反编译产品或项目中所采用的中间表示. 可以看出, 大多数反编译器都为其自身定义了中
间代码的专用语言. 一个例外是 RetDec, 其采用了 LLVM 工具链中广泛使用的 LLVM IR 作为其中间表示. LLVM
IR 是 LLVM 编译器基础设施中原生支持的中间代码形式, 使用它作为反编译器的中间代码有助于复用或集成
LLVM 工具链中的现有处理能力. 本文所提出的方法同样采用 LLVM IR 作为中间代码.
表 1 主流反编译产品或项目
名称 性质 中间代码 目标代码 RISC-V支持 网址
IDA Pro 商业 microcode C 支持 https://hex-rays.com/ida-pro
JEB Decompiler 商业 未知 C 部分支持 https://www.pnfsoftware.com/jeb
Binary Ninja 商业 BNIL C 支持 https://binary.ninja
Ghidra 开源 P-code C 支持 https://github.com/NationalSecurityAgency/ghidra
angr 开源 VEX IR C 不支持 https://angr.io
RetDec 开源 LLVM IR C 不支持 https://github.com/avast/retdec
当前, 基于上述技术路线的反编译技术虽已成熟并催生了众多实用工具 (如表 1 所示), 但其在生成代码的可
读性和开发成本两方面均存在固有局限. 首先, 在可读性方面, 由于编译过程中源代码中的诸多可读性要素 (如变
量名称、结构体定义与控制流结构) 被大量剥离, 而传统反编译方法主要依赖语法与结构分析, 难以有效重建在编
译阶段丢失的高级语义信息. 因此, 基于传统方法生成的反编译代码虽然能够保持功能正确, 但其可读性较差, 例
如变量常被命名为“var1”等无意义标识符, 缺乏语义表达力. 这类输出通常被称为“伪代码”, 显著降低了人工分析
的效率. 受此影响, 反编译结果难以直接复用, 而在面对因源码遗失而需进行软件系统改造的任务时, 代码重用具
有重要的经济价值. 其次, 在开发成本方面, 现有反编译器普遍依赖针对特定指令集人工编写的规则库, 导致其开
发周期长、实现成本高, 且跨架构适应能力不足. 以 Avast 公司为例, 其历经了 7 年研发并于 2017 年开源的反编

