Page 17 - 《软件学报》2026年第6期
P. 17
2336 软件学报 2026 年第 37 卷第 6 期
式生成策略的时间和计算资源开销以及相应的算力成本.
问题 3: 基于符号执行的代码等价性检查准确性如何? 该问题的目的是探讨将符号执行技术应用于反编译任
务时的可靠性.
问题 4: 与传统反编译器相比, BinDec 方法的失败模式有何异同? 该问题的目的是探究 BinDec 方法是否克服
了传统反编译器的常见错误类型以及是否引入了新的错误类型.
3.2 基准方法
为评估本文所提出方法的有效性, 我们选取传统反编译工具作为主要基准进行比较. 在对 Ghidra、IDA Pro、
angr 及 RetDec 等主流工具进行调研后, 发现仅有 Ghidra 与 IDA Pro 对 RISC-V 架构提供了较为完善的支持. 综合
考虑工具的可获取性与集成开发复杂度, 我们最终选用 Ghidra 作为基准方法. Ghidra 首先将二进制代码提升为一
种寄存器传输级中间表示 (P-code), 随后基于预设规则对 P-code 进行优化, 并借助启发式方法将其反编译为 C 代
码. 需要说明的是, 尽管在二进制代码提升阶段我们使用了 Ghidra 的反汇编器组件, 但这并不影响将其反编译器
组件作为基准方法的公平性. 此外, 目前尚无针对 RISC-V 架构反编译任务的专用深度学习方法, 为对本文方法中
的程序分析部分进行对照评估, 我们构建了一个基于 LLM 的独立工作流作为另一基准方法 (称为 PureLLM), 其
直接使用 LLM 根据汇编代码生成对应的反编译 C 代码.
3.3 实验数据
本文选取 ExeBench 作为基础数据集以构建实验所需的样本集合. ExeBench [32] 是一个基于 GitHub 开源仓库
构建的大规模代码数据集, 其中包含 450 万个可编译的 C 语言函数, 涵盖约 70 万个可执行函数. ExeBench 的特点
在于其采用专门设计的自动化方法, 从真实代码环境中提取函数级片段, 并为部分样本函数生成了大量单元测试
用例 (基于 3 组随机种子, 每组生成 10 个测试用例, 每个函数共包含 30 个测试用例). 这一特性为本文开展反编译
代码的语义评估提供了重要支持.
为构建适用于本研究的实验数据集, 按照以下流程对基础数据进行处理. 首先, 对样本进行初步筛选. 由于本
文提出的 BinDec 方法依赖于符号执行技术进行代码等价性检查, 该过程需使用函数的参数与返回值, 因此过滤掉
无参数和无返回值的样本. 此外, 为避免极端函数长度对实验产生干扰, 我们根据函数字节长度剔除了长度最短与
最长的各 5% 的样本. 这一处理基于以下考虑: 其一, 这些样本属于统计异常值 (如极短的无效桩函数或极长的冗
余模板函数); 其二, 剔除它们可使评估更聚焦于典型函数, 从而提升结果的代表性和稳健性. 随后, 使用 Clang 将
筛选后的源代码分别在 O0、O1、O2 和 O3 这 4 个优化级别下编译为 IR 代码, 形成中间代码样本集; 再进一步
将 IR 代码编译为面向 RISC-V 平台的二进制程序. 之后, 借助 Ghidra 反编译工具对生成的二进制文件进行反编
译, 以获取基准反编译代码. 需要说明的是, Ghidra 在处理部分样本时可能出现报错或长时间无响应的情况. 鉴于
本研究主要聚焦于评估 BinDec 方法的反编译性能, 本文未对这类失败案例进行深入分析, 而是将其直接剔除, 仅
保留可在限定时间内成功反编译的样本. 最后, 对数据集中所有源代码 (包括原始代码及由 Ghidra 反编译生成的
代码) 进行统一格式化处理, 以消除代码风格差异对后续比较评估的潜在干扰. 经过上述处理, 最终共采用 16 543
个有效代码样本, 其详细统计信息如表 3 所示.
表 3 数据集样本统计特征 (字节)
样本类别 最小长度 平均长度 最大长度
源代码 614 771.74 1 062
中间代码 169 1 390.09 20 318
二进制代码 760 963.49 2 656
3.4 评估指标
本文提出的 BinDec 反编译方法, 旨在追求所生成的反编译代码与传统反编译器的输出具有相当准确性的同
时, 能够提供更好的可读性. 为此, 我们参考 SLaDe [24] 中所采用的评估方式, 从代码功能准确性和可读性两个方面

