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

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


                 码反编译中表现出色. 总体来看, 该阶段研究的发展主要受益于                   Transformer 模型架构的广泛应用以及大规模数据
                 预训练范式的成功实践, 使得反编译任务在性能上取得显著提升, 并展现出一定的泛化能力. 然而, 当前研究在走
                 向实用化的过程中仍面临若干关键限制. 首先, 模型所能处理的上下文长度通常较为有限                               (例如仅支持    512  个
                 token), 导致其难以有效处理长代码片段. 其次, 现有基于大规模预训练的反编译模型通常仅支持将单一指令集架
                 构的二进制代码转换为某一种特定的高级编程语言, 这种一对一的映射方式在实际应用中的适应性与性价比均存
                 在明显局限.
                    第  3  阶段的研究主要集中于对        LLM  进行提示工程以实现反编译, 重点是利用             LLM  对传统反编译器生成的
                 代码进行优化. Xu    等人  [27] 提出了结合  LLM  与程序分析技术的反编译代码优化框架              GenNm. 该框架通过程序分
                 析提取反编译代码片段, 构造提示词请求             LLM  生成变量命名建议, 并再次借助程序分析完成全局变量替换, 从而
                 提升代码可读性. Wong     等人  [28] 提出了基于  GPT-3.5/4  的反编译框架  DecLLM, 其首先使用    IDA Pro  将二进制代码
                 反编译为伪    C  代码, 随后尝试编译和执行该代码, 针对编译或执行过程中出现的错误, 构造提示词请求大语言模
                 型对代码进行修复. Hu      等人  [29] 提出了基于三角色机制的反编译代码优化框架             DeGPT, 将对  LLM  的查询划分为优
                 化建议与优化执行两个阶段, 并进一步通过代码模拟执行实现语义一致性检查, 以评估优化后代码的质量. 相较于
                 前两个研究阶段, 本阶段工作主要立足于             LLM  所具备的强大能力, 通过零样本学习的方式将其直接应用于反编译
                 任务中. 由于   LLM  能够生成质量较高的代码, 研究重点已不再局限于评估生成代码与参考代码之间的相似性, 而
                 是进一步转向关注其实际可用性, 例如生成代码是否具备可编译性与可执行性等实用属性.
                    回顾神经反编译研究的         3  个阶段, 可以发现尽管现有研究已构建了将神经网络模型应用于反编译任务的基本
                 范式, 但仍存在若干尚未解决的问题. 首先, 当前将               LLM  应用于反编译任务时, 主要仍以辅助形式出现. 例如,
                 DecLLM  与  DeGPT  均利用  LLM 对现有反编译器的输出进行修复与完善. 然而, 与早期基于小规模语言模型的反
                 编译方法已取得的成效相比, 我们认为此类范式未能充分发挥                    LLM  在代码理解与生成方面的潜力, 并可能继承现
                 有反编译器固有的局限性, 例如语义还原不准确以及对新硬件架构支持滞后等问题. 其次, 当前研究普遍缺乏对生
                 成的反编译代码进行可靠验证的机制. 尽管部分研究已开始关注验证问题, 例如                         SLaDe [24] 基于类型系统对反编译
                 代码进行了修正与完善, DeGPT       [29] 提出了基于代码路径模拟的评估方法, 但尚未有研究系统性地提出保障反编译
                 代码可靠性的综合措施. 最后, 现有研究对反编译代码的粒度关注不足, 现实世界中程序规模差异显著, 若忽略这
                 种差异, 可能导致神经反编译方法在处理大规模代码时超出模型上下文长度的限制, 进而导致方法失效.
                    针对上述问题, 本研究提出了          BinDec 方法. 首先, 我们探索了直接将二进制代码作为            LLM  输入的可行性, 以
                 避免对现有反编译器的依赖, 从而使该方法能够适用于                  RISC-V  等新兴架构. 其次, 我们将符号执行技术引入反编
                 译流程, 对所有生成的反编译代码实施严格的形式化验证, 以保障其正确性. 最后, 我们聚焦于函数粒度的二进制
                 代码反编译, 并恢复函数间的调用关系, 以支持程序级别反编译代码的完整重建.

                  2   基于大语言模型与符号执行协同的反编译方法

                    本节介绍本文所提出的基于大语言模型的两阶段反编译方法 BinDec. 该方法结合了大语言模型的文本理解
                 与生成能力以及基于符号执行的代码分析技术, 通过大语言模型生成与符号执行判别之间的多轮迭代, 首先将二
                 进制代码提升为中间代码, 继而将其进一步反编译为                 C  代码. 本节将从总体方法、二进制代码提升、中间代码反
                 编译、LLM   提示工程和函数级符号执行这           5  个方面对该方法进行介绍.
                  2.1   总体方法

                    BinDec 方法的关键是结合      LLM  与符号执行技术, 以协同迭代的方式实现二进制代码的反编译                    (如图  2  所示).
                 其具体流程如下.
                    (a) 二进制代码信息提取: 利用现有二进制代码分析工具, 以函数为单位从二进制文件中提取代码信息, 包括
                 入口地址、指令序列、调用关系及数据依赖等                (图  2  步骤  (1)).
                    (b) 二进制代码提升: 根据函数的指令序列构造提示词, 请求                 LLM  生成语义一致的     LLVM IR (以下简称    IR)
   7   8   9   10   11   12   13   14   15   16   17