ASAP: Assembly-Source Aligned Pseudocode Refinement for Binary Decompilation¶
会议: NeurIPS 2026
arXiv: 2610.06900
OpenReview: https://openreview.net/forum?id=x36xk9UY3Z
领域: 模型压缩
关键词: 二进制反编译, 汇编语义对齐, 伪代码精炼, Q-Former压缩, 注意力偏差抑制
一句话总结¶
针对传统反编译器伪代码易丢失底层细节、且大模型易产生伪代码注意力偏差的难题,ASAP 提出汇编-源码对比语义对齐与 Q-Former 压缩表征,配合随机伪代码掩码和相对汇编优势损失,将平均重执行率从 64.7% 提升至 71.9%。
研究背景与动机¶
二进制反编译旨在从编译生成的机器码中逆向还原出高级源码,在漏洞挖掘、恶意软件分析与闭源软件逆向工程中扮演着关键角色。然而,编译过程剥离了符号名、注释、高级类型与控制流元数据,导致反编译本质上是一个欠定逆问题。目前基于大语言模型(LLM)的反编译主要沿袭两条路径:一是纯伪代码精炼,利用反编译器(如 Ghidra、IDA Pro)生成的 C 语言伪代码作为输入,促使 LLM 重构高级源码;二是端到端汇编翻译,直接由汇编指令生成源码。前者借助反编译器已恢复的高层结构取得了不错效果,但规则型反编译器依赖启发式抽象,往往在重度编译器优化下丢失关键低级细节(如符号扩展、位宽转换、指针算术等),导致伪代码看似可读却存在功能语义错误,精炼 LLM 极易直接继承这些缺陷;后者虽然理论上保留了底层操作事实,但汇编序列长度爆炸且语法分布严重脱离预训练代码语料,使得端到端生成极难收敛。
将二者结合能够实现互补:伪代码提供紧凑的高层结构假设,汇编代码则保留低层操作证据,这与人类逆向工程师同时对照伪代码与汇编的分析逻辑高度契合。然而,简单的多模态文本拼接面临两大现实阻碍:首先是汇编与高级源码之间的表征鸿沟(Representation Gap),超长且异构的汇编无法直接被代码模型高效理解;其次是模型对伪代码的注意力偏差(Attention Bias),由于伪代码与目标源码在语法结构和词表分布上天然更接近,大模型在生成过程中会压倒性地偏向伪代码,从而在注意力机制中将汇编证据彻底边缘化。
为了打破这一困局,本文的核心思路是保留伪代码作为源码恢复的主界面,同时引入一个经过源码对齐且高度压缩的定长汇编语义前缀,并通过正则化强迫模型调用底层证据。核心 idea:将反编译重构为“对齐-精炼”两阶段流水线,通过函数级与代码片段级双重对比学习将汇编语义对齐至源码空间,用 Q-Former 压缩为定长提示 token,并在精炼微调中引入随机伪代码掩码与相对汇编优势损失,促使大模型主动提取底层汇编证据纠正伪代码抽象错误。
方法详解¶
整体框架¶
ASAP 的整体架构包含两个阶段:第一阶段为汇编-源码语义对齐(Assembly-Source Alignment, ASA),第二阶段为汇编增强精炼(Assembly-Augmented Refinement, AAR)。在对齐阶段,模型利用成对的编译函数与源码,以冻结的源码编码器作为语义锚点,通过多正例函数级对比损失与基于调试行映射的代码片段级对比损失,训练分块汇编编码器;在精炼阶段,冻结对齐后的汇编编码器,由 Q-Former 将分块汇编特征压缩映射为固定长度的汇编 token 序列,作为软提示拼接在伪代码前方,输入给反编译 LLM。为了防止 LLM 走伪代码捷径,训练过程中对伪代码施加随机非结构性掩码,并结合相对汇编优势损失强迫模型利用汇编信息。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
InAsm["二进制汇编代码"] --> Stage1["分块汇编编码器<br/>分块处理指令序列并提取特征"]
InSrc["高级源代码 (仅训练阶段)"] --> Anchor["冻结的源码编码器<br/>提供稳定语义锚点空间"]
Stage1 -.->|双层对比对齐| D1["1. 双层对比汇编语义对齐<br/>函数级多正例 + 片段级弱对齐"]
Anchor -.->|双层对比对齐| D1
Stage1 --> D2["2. 基于 Q-Former 的定长特征压缩<br/>可学习 Query 提炼 K 个紧凑汇编 Token"]
InPseudo["反编译器 C 伪代码"] --> D3["3. 结构感知随机伪代码掩码<br/>保留控制流关键字与括号,掩码局部表征"]
D2 --> Concat["汇编 Token 拼接掩码伪代码"]
D3 --> Concat
Concat --> D4["4. 相对汇编优势引导精炼<br/>反向传播惩罚汇编增益不足项"]
D4 --> OutCode["重编译与可执行 C 源代码"]
关键设计¶
1. 双层对比汇编语义对齐:跨越异构语法鸿沟建立底层到高层的语义映射
针对长汇编指令语法异构、语义难以直接被代码模型解析的问题,ASAP 在预训练阶段引入跨模态对比学习。由于汇编代码长度通常远超标准代码编码器的上下文窗口,ASAP 首先以指令边界为粒度将汇编切分为 \(P\) 个分块,每块至多包含 \(M\) 个子词 token,通过可学习汇编编码器 \(F_a\) 提取出块级表征矩阵 \(\mathbf{H}_{\mathrm{asm}} = [\mathbf{h}_1; \dots; \mathbf{h}_P]\)。为了对齐同源码在不同编译器优化等级(O0-O3)下功能等价但指令迥异的多版本二进制,函数级对齐采用多正例 InfoNCE 扩展损失:
其中 \(\mathcal{P}(i)\) 表示 mini-batch 内所有由相同源码编译而成的汇编样本集合。同时,为避免粗粒度全局对齐忽略符号位扩展、指针位移等底层细微操作,设计利用编译器调试信息建立弱对应的代码片段级对比损失 \(\mathcal{L}_{\mathrm{snip}}\),最终以 \(\mathcal{L}_{\mathrm{pre}} = \mathcal{L}_{\mathrm{func}} + \mathcal{L}_{\mathrm{snip}}\) 进行联合对齐优化,使得冻结后的汇编编码器输出兼具全局语义一致性与局部操作精确性的特征。
2. 基于 Q-Former 的定长特征压缩:以固定 token 预算向 LLM 注入高密度底层证据
单纯将对齐后的超长汇编特征与伪代码拼接会给 LLM 带来严重的显存负担与注意力分散。ASAP 借鉴视觉多模态架构,引入轻量化 Q-Former 作为汇编信息抽取器。Q-Former 配置 \(K\) 个可学习的查询向量 \(\mathbf{Q} \in \mathbb{R}^{K \times d}\),将块级汇编特征矩阵 \(\mathbf{H}_{\mathrm{asm}}\) 作为 Key-Value 记忆库执行交叉注意力操作,提炼出紧凑汇编表征 \(\mathbf{R}_a\),再经由线性投影层映射至 LLM 嵌入空间:
该设计不强求 \(K\) 个 token 完全覆盖每条汇编指令的语法细节,而是通过注意力机制自适应筛选出对校准伪代码最具指示意义的底层线索。无论原始汇编包含数百条还是上万条指令,输入给 LLM 的汇编提示长度始终恒定为 \(K\)(默认 \(K=32\)),极大兼顾了计算效率与证据供给。
3. 结构感知随机伪代码掩码:阻断模型对启发式伪代码的短路依赖
由于伪代码与高级源码在词汇和结构上高度重合,LLM 在常规训练中极易形成“短路认知”——完全依赖伪代码文本做改写,进而忽略软提示中的汇编信息。为此,ASAP 在精炼阶段对伪代码输入施加随机掩码策略。掩码过程严格保护控制流语法骨架(包括花括号、圆括号、分号以及 if、while、return 等控制关键字),而仅在局部变量名、常量、操作符与局部表达式等非结构性 token 上以比例 \(\rho \sim U[0, \rho_{\max}]\) 进行随机掩码。此举既保证了反编译器恢复出的程序拓扑大体可见,又迫使 LLM 无法仅靠单侧文字猜出完整的算术逻辑,必须借助汇编 token 中的底层线索来补全丢失的操作语义。
4. 相对汇编优势引导精炼:显式约束反向传播梯度的纠错偏置
伪代码掩码虽能制造信息缺口,却未显式量化汇编 token 的正向贡献。ASAP 设计了相对汇编优势目标(Assembly Advantage Objective),在同一被掩码伪代码 \(\tilde{\mathbf{p}}\) 下,对比激活真实汇编软提示 \(\mathbf{E}_a\) 与激活全零基准向量 \(\mathbf{0} \in \mathbb{R}^{K \times d_{\mathrm{LLM}}}\) 时模型对目标源码 \(\mathbf{y}\) 的 token 平均负对数似然:
其中 \(\mathrm{sg}[\cdot]\) 为停止梯度算子。随后根据基准损失自适应计算相对增益边际 \(m = \min(m_{\max}, \gamma \mathcal{L}_{\mathrm{pseudo}})\),并将精炼总损失定义为:
当带有汇编证据的前向生成表现未能以足够边际超越纯伪代码参考时,惩罚项激活,迫使梯度强力更新 Q-Former 与 LLM 投影层,确保汇编表征在推理期能作为决定性的校偏信号。
实验关键数据¶
主实验¶
评估基于经过 C 语言适配的 HumanEval 与 MBPP 基准,包含 GCC O0 至 O3 共四种优化级别,测试集均经过严格单测与可编译性验证。评估指标包括重执行通过率(Re-execution Rate)、重编译成功率(Recompilation Rate)、编辑相似度(Edit Similarity)以及 GPT-5-mini 评测分(GPT-Judge)。
| 方法 | 模型规模 | 重执行率 (%) O0/O1/O2/O3 (均值) | 重编译率 (%) O0/O1/O2/O3 (均值) | 编辑相似度 (均值) | GPT-Judge (均值) |
|---|---|---|---|---|---|
| Ghidra | 规则型工具 | 35.0 / 23.4 / 22.2 / 19.0 (24.9) | 38.2 / 28.8 / 27.5 / 22.9 (29.3) | 0.26 | 2.82 |
| IDA Pro | 规则型工具 | 27.3 / 25.6 / 21.9 / 20.8 (23.9) | 33.1 / 30.5 / 28.7 / 27.3 (29.9) | 0.27 | 2.87 |
| DeepSeek-v3.2 | 通用闭源 | 69.6 / 58.7 / 58.5 / 52.3 (59.8) | 80.5 / 77.5 / 78.3 / 74.5 (77.7) | 0.38 | 3.73 |
| Gemini-3.1-flash | 通用闭源 | 71.8 / 62.5 / 60.8 / 56.5 (62.9) | 81.0 / 81.6 / 81.7 / 77.8 (80.5) | 0.43 | 4.07 |
| Ref Decompile | 6.7B | 79.9 / 56.2 / 54.4 / 52.6 (60.8) | 91.4 / 91.6 / 90.3 / 90.0 (90.8) | 0.56 | 3.68 |
| LLM4Decompile | 9B | 72.8 / 60.6 / 59.7 / 54.9 (62.0) | 86.5 / 85.2 / 86.0 / 84.5 (85.5) | 0.56 | 3.84 |
| SK2Decompile | 2×6.7B | 76.3 / 64.3 / 61.3 / 56.9 (64.7) | 91.5 / 91.6 / 92.9 / 90.6 (91.6) | 0.57 | 3.88 |
| ASAP (本文) | 9.3B | 82.2 / 73.4 / 68.5 / 63.7 (71.9) | 96.9 / 96.5 / 97.0 / 95.9 (96.6) | 0.59 | 3.87 |
消融实验¶
消融实验深入验证了汇编-源码语义对齐阶段(ASA)和汇编增强精炼阶段(AAR)各个核心模块的有效性:
| 实验配置 | 模块说明 | 重执行率 (%) O0/O1/O2/O3 (均值) | 重编译率 (%) 均值 | 性能降幅与原因分析 |
|---|---|---|---|---|
| ASAP (完整模型) | 全配置双阶段训练 | 82.15 / 73.36 / 68.52 / 63.68 (71.92) | 96.57 | 完整模型展现最佳多层次优化抵抗力 |
| Raw-Asm | 替换 ASA,使用原始汇编文本拼接 | 80.36 / 67.13 / 63.32 / 60.06 (67.71) | 95.01 | 重执行率下降 4.21%,未对齐汇编引入语法噪声 |
| w/o CL | 移除两层对比学习对齐 | 77.54 / 67.89 / 63.03 / 60.89 (67.34) | 94.34 | 重执行率下降 4.58%,未对齐特征无法有效指导解码 |
| w/o SLA | 仅保留函数级对齐,移除代码片段对齐 | 79.91 / 69.83 / 65.77 / 60.61 (69.03) | 95.39 | 重执行率下降 2.89%,丢失符号位/指针等局部关键操作 |
| w/o FLA | 仅保留代码片段对齐,移除函数级对齐 | 80.26 / 69.94 / 64.35 / 60.98 (68.88) | 95.15 | 重执行率下降 3.04%,跨多优化级别的全局功能一致性减弱 |
| w/o AFC | 移除 Q-Former 压缩,直接池化投影 | 80.11 / 69.28 / 63.74 / 62.11 (68.81) | 96.70 | 重执行率在 O1/O2 下显著退化,无法自适应抽取深层线索 |
| w/o AAO | 移除相对汇编优势损失 | 78.22 / 67.43 / 64.24 / 59.14 (67.26) | 94.79 | 重执行率下降 4.66%,模型退化回伪代码捷径学习 |
| w/o PM | 移除伪代码随机掩码 | 79.91 / 70.50 / 64.24 / 61.89 (69.13) | 94.52 | 重执行率下降 2.79%,完整伪代码导致汇编注意力衰减 |
| FL | 冻结反编译 LLM (仅微调 Q-Former) | 75.01 / 64.33 / 59.61 / 56.34 (63.82) | 89.43 | 重执行率骤降 8.10%,LLM 无法将前缀软提示有效映射至代码生成 |
关键发现¶
- 对重度编译器优化的抗跌落性卓越:在高度激进的 O3 优化级别下,传统反编译器由于死代码消除、循环展开及复杂的寄存器复用,其伪代码的语义错误急剧增多,导致最强基准 SK2Decompile 的重执行率跌至 56.9%;而 ASAP 凭借紧凑的汇编底层证据依然维持了 63.7% 的重执行率,领先幅度扩大至 6.8 个百分点。
- 汇编依赖因果干预验证:在因果视图干预实验中,将汇编 token 置零(Zero-Asm)或打乱替换为无关函数(Shuffled-Asm),ASAP 的平均重执行率分别剧烈滑落 7.5% 和 11.2%;反之若保留正确汇编而对伪代码施加轻量掩码(Masked-Pseudo),模型性能仅微降 1.2%(仍达 70.7%)。这确凿地证实了 ASAP 并未受困于注意力偏差,而是实质性地将汇编提示作为纠错决策依据。
- 下游逆向工程任务泛化增益:将 ASAP 输出的代码输入给 Qwen3-Coder-30B、DeepSeek-Coder-V2-16B 和 CodeLlama-13B,在函数签名恢复(SR)、二进制代码摘要(BCS)和算法分类(AC)等下游任务中均取得了超越原反编译器输出及其他微调模型的综合效果。
亮点与洞察¶
- 多模态架构迁移至程序语义逆向:将计算机视觉中经典的“冻结编码器 + Q-Former 查询压缩 + 软提示驱动 LLM”范式迁移到二进制分析领域,用定长 token 优雅化解了汇编指令序列过长和语法失配的工程瓶颈。
- 正交解决注意力捷径的损失设计:提出了“结构保持掩码”与“相对优势损失”组合拳,使用带有
stop-gradient的零向量基准动态衡量汇编增益,确保大模型在复杂任务中避免陷入高信噪比单模态的局部最优。 - 弱监督片段对齐处理编译器失真:利用调试信息的源行映射进行弱正例对比学习,避开了编译器代码移动、内联和重排导致的精确对齐失效问题,增强了局部语义鲁棒性。
局限与展望¶
- 功能等价性依赖经验性测试用例:受制于莱斯定理(Rice's Theorem),任意程序的语义等价判定在理论上是不可判定的。本文评估依赖单测执行结果,虽具很强的经验说服力,但未来仍需探索形式化验证与符号执行的融合校验。
- 可读性变量重命名模块缺失:ASAP 核心专注在功能等价性与语法可编译性恢复,未集成针对标识符重命名(如恢复变量名语义)和函数级注释生成的专用组件,导致 GPT-Judge 主观可读性得分略逊于引入专用重命名分支的基线模型。
- 架构单向性与混淆二进制适配:当前验证主要针对 x86_64 平台 GCC 编译的常规二进制,尚未扩展到跨指令集(ARM、MIPS)以及带有控制流平坦化、死代码混淆的对抗性保护二进制。
相关工作与启发¶
- vs LLM4Decompile (EMNLP 2024): LLM4Decompile 尝试用大模型端到端由汇编直接恢复源码,受制于超长文本建模和语法偏差;ASAP 证明“保留伪代码为主体拓扑、仅将汇编作为定长纠偏依据”在可执行率上显著更优(71.9% vs 62.0%)。
- vs SK2Decompile (2025): SK2Decompile 采用两阶段流水线专门处理伪代码的代码骨架与变量命名,虽然提升了命名可读性,但由于输入仅依赖伪代码本身,无法纠正伪代码先天的语义抽象错误;ASAP 通过引入真实汇编底层线索,在核心的重执行率上取得了全面反超(+7.2%)。
评分¶
- 新颖性: ⭐⭐⭐⭐ [创新地将双层对比语义对齐与 Q-Former 压缩引入汇编-伪代码协同反编译,构思精巧]
- 实验充分度: ⭐⭐⭐⭐⭐ [覆盖 HumanEval/MBPP 两大基准、四级优化级别、充分的消融分析及严谨的因果干预分析]
- 写作质量: ⭐⭐⭐⭐⭐ [逻辑严密,数学表达与机制阐述条理清晰,实验数据详实可信]
- 价值: ⭐⭐⭐⭐⭐ [大幅提升反编译代码的功能可执行率与重编译成功率,为二进制分析与逆向工程提供了实用范式]