Page 13 - 《软件学报》2026年第6期
P. 13

2332                                                       软件学报  2026  年第  37  卷第  6  期


                 代码  (步骤  (2)). 对生成的代码进行编译检查       (步骤  (3)), 若发现错误, 则重新构造提示词请求         LLM  修复  (步骤  (4)),
                 直至获得语法正确的 IR       代码.


                                                          (2) 提升
                                             汇编代码                      中间代码
                                                       (4) 修复             (5) 符号
                                                (1) 信息提取          (3) 重编译  执行
                                                           重编译
                                              RISC-V      二进制程序         测试集
                                                (6) 测试执行
                                           (7) 重试
                                             返回值比较
                                                (8) 提升成功

                                                          (9) 反编译
                                             中间代码                       C代码
                                                            (11) 修复
                                                (12) 符号执行                 (10) 重编译
                                           (13) 重试
                                                      (12) 符号执行         重编译
                                             符号约束
                                                                       中间代码
                                                (14) 反编译成功
                                                  图 2 BinDec 方法总体架构

                    (c) 中间代码检查: 对提升得到的        IR  代码进行符号执行      (步骤  (5)), 生成一组测试用例. 在原始二进制代码和
                 提升后的   IR  上分别运行这些测试用例        (步骤  (6)), 并对比运行结果, 以验证中间代码与原始二进制代码的一致性.
                 若结果不一致, 则返回上一阶段要求           LLM  重新生成   (步骤  (7)).
                    (d) 中间代码反编译: 基于已提升的         IR  代码构造提示词, 请求      LLM  生成相应的    C  代码  (步骤  (9)). 对生成的
                 C  代码进行编译检查      (步骤  (10)), 如存在错误, 则重新构造提示词请求         LLM  修复  (步骤  (11)), 直至获得语法正确
                 的  C  代码.
                    (e) 源代码检查: 将反编译得到的        C  代码重新编译为     IR  代码  (步骤  (10)), 并将其与前一阶段获得的     IR  进行合
                 并. 随后通过符号执行生成等价性约束            (步骤  (12)), 并借助 SMT 求解器进行验证. 若约束求解失败, 则返回上一阶
                 段要求   LLM  重新生成  C  代码  (步骤  (13)).
                    通过以上流程, BinDec 方法旨在有效结合          LLM  与符号执行, 实现具有可靠性保证的反编译. 具体来说, BinDec
                 方法以反汇编器分析为基础, 通过自动化的编译反馈循环和两阶段符号执行验证, 提供了可编译性与高置信度的
                 功能等价性保障. 当输入理想时, 其能输出可编译且功能等效的高质量代码; 当处理困难代码时, 则通过明确的失
                 败报告实现优雅降级, 从而确保结果的可靠性与可解释性.
                  2.2   二进制代码提升
                    本节阐述将     RISC-V  二进制代码提升至     IR  代码的过程, 其关键是利用       LLM  生成功能等价的     IR  代码. 考虑到
                 二进制代码的整体规模可能较大, 而实际编程中单个函数的规模通常是有限的, 因此本方法选择在函数粒度上对
                 二进制代码进行处理.
                    为准确描述二进制函数的特征, BinDec 借助反汇编工具               (如  riscv64-linux-gnu-objdump  或  Ghidra) 提取目标函
                 数的入口地址、指令序列、函数调用关系以及数据依赖信息. 入口地址和包含偏移量信息的指令序列完整刻画了
                 二进制函数的执行逻辑, 而函数调用关系与全局数据依赖信息则为后续基于多个独立反编译函数重建完整程序提
                 供了基础. 这些信息被组织为结构化提示词, 输入至               LLM  中, 请求生成对应的     IR  代码. 提示词中包含示例指令与
                 相应 IR 片段的映射关系, 以引导模型生成符合语法规范的代码. 对于                    LLM  输出的  IR  代码, BinDec 使用  LLVM
                 IR  编译器  (llc) 进行语法合法性验证. 若发现错误, BinDec 将捕获        llc 输出的错误信息, 构造修复性提示词反馈至
                 LLM, 要求其根据错误类型       (如类型不匹配、指令不支持或语法错误) 进行修正. 该过程迭代执行, 直至获得语法
                 正确的   IR  代码或达到预设的最大尝试次数.
   8   9   10   11   12   13   14   15   16   17   18