Page 20 - 《软件学报》2026年第6期
P. 20
李玉璋 等: BinDec: 面向 RISC-V 的 LLM 与符号执行协同反编译方法 2339
出了当前方法的局限性, 也为未来工作指明了方向, 如引入更精细的复杂度度量或针对高复杂度函数的专项优化,
以进一步提升方法的鲁棒性.
表 5 函数复杂度与测试通过率的相关性
方法 相关系数 (ρ) 显著性 (p)
Ghidra −0.125 >0.05
BinDec −0.393 <0.05
针对问题 1 的总结: 本文提出的 BinDec 方法能够生成在功能正确性与代码可读性两方面均优于传统反编译
器 Ghidra 的反编译结果. 尤其是在对经过高优化级别编译的二进制代码进行反编译时, 该方法所展现的综合优势
更为显著.
4.2 问题 2: 基于 LLM 迭代重试生成并修复代码的效果如何?
本文提出的 BinDec 方法采用迭代重试策略对 LLM 生成的初始代码进行错误修复, 以提升反编译结果的可
靠性. 由于每一次迭代过程均包含额外的 LLM 查询、代码编译与符号执行操作, 这些步骤会引入显著的时间开销
与计算资源消耗. 因此, 迭代过程的收敛效率成为影响方法实用性的关键因素. 针对问题 2, 本研究重点对迭代重
试过程的收敛性进行分析. 在实验设置中, 我们将二进制代码提升与中间代码反编译两个阶段的最大重试次数统
一设定为 10 次, 并完整记录每一轮重试所产生的代码版本、LLM 查询的输入与输出数据. 在此基础上, 对所有重
试步骤中生成的数据进行统计评估.
首先, 我们对重试任务的成功率进行了统计分析. 该成功率定义为在特定重试次数下生成语义一致代码的样
本比例, 统计结果如图 5 所示. 实验结果表明, 在二进制代码提升与中间代码反编译两个阶段中, 随着重试次数的
增加, 任务成功率均呈现上升趋势, 并在达到一定重试次数后逐渐趋于稳定. 具体而言, 在二进制代码提升阶段, 首
次重试的成功率为 51%, 即 51% 的样本无需重试即可生成语义一致的中间代码; 当重试次数达到 8 次时, 成功率
趋于稳定, 维持在 84%–85% 之间. 在中间代码反编译阶段, 首次成功率为 60%, 即 60% 的样本能够一次性生成语
义一致的 C 代码; 当重试次数达到 5 次时, 成功率趋于稳定, 保持在 72%–73% 的范围内. 两个阶段所呈现的不同
趋势说明, 二进制代码提升过程更依赖于重试机制, 并且能够从中获得更为显著的性能提升.
0.90 0.90
0.85 0.82 0.84 0.84 0.85 0.85
0.81
0.80 0.79 0.80
0.77
0.75 0.70 0.74 0.75 0.69 0.70 0.72 0.72 0.73 0.73 0.73 0.73
任务成功率 0.70 0.63 任务成功率 0.70 0.66 0.68
0.65
0.65
0.60
0.60
0.60
0.55 0.55
0.50 0.51 0.50
0.45 0.45
0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10
重试次数 重试次数
(a) 二进制代码提升阶段 (b) 中间代码反编译阶段
图 5 不同重试次数下的任务成功率
其次, 我们针对重试任务中编译器和符号执行引擎的累计调用次数进行了统计分析, 结果如图 6 所示. 在每次
重试过程中, 生成的代码必须经过编译器调用以完成编译, 而符号执行引擎仅在编译成功之后才会被调用. 实验结
果显示, 在二进制代码提升任务中, 随着重试次数的增加, 编译器调用次数与符号执行调用次数之间存在显著差
异, 这一现象表明 LLM 生成的中间代码在可编译性方面仍面临较大挑战, 重试过程主要用于修正编译错误. 相比
之下, 在中间代码反编译任务中, 编译器调用次数与符号执行调用次数基本保持一致, 并呈现近似线性的增长趋
势, 说明 LLM 生成的 C 源代码具有较好的可编译性, 但其语义一致性仍是需要重点解决的问题. 此外, 我们对两

