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  年开源的反编
   5   6   7   8   9   10   11   12   13   14   15