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 方法中所采用的迭代

