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

李玉璋 等: BinDec: 面向  RISC-V  的  LLM  与符号执行协同反编译方法                                 2335


                                         表 2    BinDec 各阶段任务使用的    LLM  提示词  (续)

                 LLM任务                                      提示词模板
                         作为资深LLVM工具链专家, 需对从{asm_type}汇编提升得到的缺陷IR代码进行精准修复, 确保:
                         1) 版本合规性: 严格遵循LLVM 13.0.1工具链规范, 禁用LLVM 14+新增语法 (如 opaque ptr)
                 中间代码    2) 语义保真度: 功能等价于原始汇编代码 (特别是`{func_name}`函数)
                 错误修复
                         3) 修改最小化: 保持原始代码结构, 仅作必要修复
                         4) 输出格式: 仅输出修复后的LLVM IR代码, 允许注释但不要包含解释或其他额外文本
                         作为资深软件逆向工程与编程专家, 需将 LLVM IR 代码反编译为功能等价的 C 语言代码, 确保:
                         1) 语法合规性: 严格遵循C语言代码规范, 确保生成的代码可编译
                 中间代码    2) 语义保真度: `{func_name}`函数的功能与原始LLVM IR代码完全一致, 包含必要的外部函数和全局变量的声明
                  反编译
                         3) 生成质量: 符合人类程序员的代码编写习惯, 最小化冗余代码并保持合理的可读性
                         4) 输出格式: 仅输出反编译后的C语言代码, 允许注释但不要包含解释或其他额外文本
                         作为资深软件逆向工程与编程专家, 需对从 LLVM IR 反编译得到的缺陷 C 代码进行精准修复, 确保:
                         1) 语法合规性: 严格遵循C语言代码规范, 确保生成的代码可编译
                 源代码错
                         2) 语义保真度: 功能等价于原始LLVM IR代码 (特别是`{func_name}`函数)
                  误修复
                         3) 修改最小化: 保持原始代码结构, 仅作必要修复
                         4) 输出格式: 仅输出反编译后的C语言代码, 允许注释但不要包含解释或其他额外文本
                  2.5   函数级符号执行
                    为实现对单个函数的定向分析           (如测试用例生成或语义等价性验证), 需突破传统符号执行从程序入口                       (main
                 函数) 开始的限制. 在第     2.2  和  2.3  节所述的任务中, 我们通过生成产品程序        (测试驱动程序), 对目标函数参数进行
                 符号化. 函数级符号执行的关键在于, 如何在缺乏先验约束的情况下对参数进行有效的符号化建模, 以避免因过度
                 近似而引发不必要的路径搜索. Ramos 等人           [31] 提出的欠约束符号执行框架       UC-KLEE, 采用惰性初始化的方式对
                 参数进行动态符号化, 并允许用户通过手工定义不变式来约束符号空间. 反编译器测试框架                             D-Helix [19] 采用类似的
                 惰性初始化策略对函数参数进行符号化建模. 然而, 为了实现对大量函数的自动化分析, D-Helix                          并未为每个函数
                 单独定义不变式约束, 这导致其在处理具有复杂数据结构的参数时, 执行效率受到显著影响. 为应对现实代码中复
                 杂的参数类型     (特别是包含指针的嵌套结构体), 并在路径覆盖的完备性与执行效率之间取得平衡, 本文设计并实
                 现了一种分层式预先符号化初始化策略. 该策略在符号执行引擎启动之前, 即一次性完成对参数结构的完整符号
                 化构建. 具体而言, 本策略根据参数类型进行分层处理: 对于基本类型参数                      (例如  int、char、float), 直接将其声明
                 为符号化变量; 对于结构体参数, 则递归处理其每个字段——基本类型字段直接符号化, 对于指针字段的处理分
                 为  3  步: 1) 为该指针字段本身分配一个具体的、有效的地址值, 确保其非空; 2) 为该地址分配一个由指针基类型
                 决定大小的符号化内存对象; 3) 若指向结构体, 则对这块新内存递归应用本策略, 以符号化其内部字段. 为控制由
                 此可能引发的路径状态空间爆炸, 递归过程受到深度限制                   (如设定深度=3), 超限部分将被视为未初始化的符号字
                 节序列. 此外, 对于顶层的指针类型参数, 其处理方式与结构体中的指针字段完全一致.
                    与现有的欠约束符号执行方法所采用的惰性初始化相比, 我们的方法通过预先初始化在符号执行开始前即构
                 建了完整的符号输入结构, 实现上更为简单直接, 对于具有确定性、深度可控数据结构的函数, 能够确保路径探索
                 的起点一致且可控.
                  3   实验设计

                    本节介绍实验设计情况, 包括研究问题、基准方法、实验数据、评估指标和实现细节.
                  3.1   研究问题
                    为了评估本文提出方法的有效性, 我们设计了以下                4  个问题进行研究.
                    问题  1: 与基线方法相比, BinDec 方法在      RISC-V  二进制代码的反编译任务上表现如何? 该问题的目的是评
                 估  BinDec 方法的总体性能.
                    问题  2: 基于  LLM  迭代重试生成并修复代码的效果如何? 该问题的目的是讨论                   BinDec 方法中所采用的迭代
   11   12   13   14   15   16   17   18   19   20   21