二进制逆向工程是通过分析可执行文件来理解程序逻辑与运行机制的过程,在安全审计、漏洞挖掘和遗留系统维护中具有重要意义
[1]。然而,传统逆向分析高度依赖专家经验。
尽管IDA Pro、Ghidra等逆向分析工具在反汇编、反编译和控制流恢复方面已经取得了较好效果,但其输出结果本质上仍属于对底层程序行为的近似重建,难以完整保留源程序中的语义信息
[2]。近期针对反编译能力的实证研究进一步表明,现有C反编译器在不同编译器和优化级别下仍存在明显的语义偏差与错误类型,这说明仅依赖反编译结果开展高层语义恢复仍面临输入噪声大、表示失真强和跨平台泛化不足等挑战。
为弥补上述不足,二进制语义恢复技术逐渐成为逆向工程领域的重要研究方向。相关研究已由早期基于启发式规则和程序分析的方法,发展到基于统计学习、深度学习以及生成式大语言模型的方法,研究对象也由函数名、变量名和类型信息恢复逐步扩展到功能摘要生成、数据结构推断和更高层次的程序行为理解。与此同时,国内研究者也围绕二进制安全分析、漏洞挖掘、代码表征和函数语义恢复等方向
[3-6]开展了系统研究,表明该领域正由单一程序分析问题演进为融合程序分析、表示学习与语义生成的综合研究方向。
基于此,本文对二进制语义恢复技术的发展脉络进行系统梳理,归纳不同技术路线的基本思想、代表性工作及其局限,并对未来发展趋势进行总结与展望。
1 语义恢复的分类
相较于源码分析,二进制分析在编译过程中丢失了大量高级结构与类型信息,导致底层指令与高层程序语义之间存在明显断层
[7]。二进制语义恢复的目标,就是从底层指令、控制流和数据流中重建这些丢失的高层语义信息。基于逆向工程的实际需求,本文将语义恢复归纳为以下4个核心任务。
1)变量名与函数名恢复:用于揭示程序功能语义和开发者意图。
2)基本类型恢复:推断变量、参数和返回值的基础类型,为数据流分析提供支持。
3)结构体恢复:识别复合数据结构的大小、成员偏移及组织关系。
4)控制流结构恢复:将底层跳转关系还原为高级语言中的分支、循环等结构。
2 基于启发式规则匹配的方法
早期二进制语义恢复主要依赖静态分析、动态分析和启发式规则匹配,通过控制流、数据流及指令依赖关系构建约束,以恢复类型信息、控制结构和数据布局。
2.1 基于静态约束的变量与类型推断
在类型恢复方面,2011年TIE
[8]率先将二进制类型恢复建模为静态约束求解问题,为后续研究奠定了基础,但其效果比较依赖指针分析精度。Retypd
[9]则在此基础上进一步发展出递归约束与子类型系统,将指针读写能力分离建模,从而缓解了复杂别名场景下的约束冲突问题。相比TIE,Retypd的核心创新不在于继续增加规则,而在于提升了类型系统本身对多态性、递归性与高优化机器码的表达能力。
总体上,在这一方向上,相关研究的演进并非简单增加规则,而是不断提升类型系统对复杂程序行为的表达能力。
2.2 基于图重构与动态监控的控制流及结构还原
在控制流恢复方面,DREAM
[10]通过语义保持的图重构方法,将非结构化控制流转化为更易理解的结构化形式,提高了反编译结果的可读性。
在数据结构恢复方面,REWARDS
[11]利用带时间戳的类型传播缓解运行时内存复用带来的歧义;随后,Howard
[12]在此基础上进一步面向数组与结构体长度恢复,引入基于栈帧与基指针相对访问模式的动态检测策略,将分析粒度从抽象内存对象推进到更具体的数据组织形式。DSI
[13]则继续向复杂动态数据结构场景扩展,不再局限于单个节点或单条访问轨迹,而是通过链与链图建模统一链接关系,并结合动态证据权重完成不规则结构分类。
总体上,这一方向的研究重点经历了从控制流可读性恢复扩展到复杂数据组织识别的演变。
2.3 基于概率推断与混合分析的复杂语义提取
随着分析对象日益复杂,部分研究开始引入概率推断与混合分析。OSPREY
[14]将类型和结构属性建模为随机变量,通过概率约束求解提升了结构推断覆盖率。OBJDIGGER
[15]则结合符号执行与跨过程数据流分析,实现了对C++对象成员和继承关系的恢复。
总体来看,基于启发式规则匹配的方法建立在静态约束、动态监控与概率推断等可解释分析机制之上,其优势在于推理链条明确、结果可验证性较强,尤其适用于类型、结构体布局与控制流等语义对象的精确恢复。然而,这类方法高度依赖专家设计的规则与程序分析器质量,当面对跨架构迁移、编译优化扰动以及大规模复杂程序时,往往存在规则扩展性不足与人工维护成本高的问题。后续深度学习方法正是在这一背景下发展起来,其核心转变在于,不再显式枚举恢复规则,而是通过数据驱动方式学习底层表示与高层语义之间的映射关系,从而提升模型对复杂模式的自动抽取能力。为便于比较,
表1总结了该阶段代表性方法的核心机制及适用场景。
3 基于深度学习的分类方法
随着二进制程序复杂度和数据规模不断增加,传统依赖人工规则的方法在可扩展性和维护成本上逐渐暴露局限。为此,研究者引入深度学习,将语义恢复建模为数据驱动的分类任务,通过学习底层表示与高层语义之间的映射关系提升恢复能力。
3.1 基于统计学习的函数语义推断
在函数语义恢复研究中,相关方法总体经历了从局部特征建模向全局语义建模的发展过程。早期工作主要基于指令模式、寄存器行为和内存访问等底层特征进行统计推断。DEBIN结合极端随机树与条件随机场模型(Conditional Random Field, CRF)实现联合结构化预测。Jaffe等
[16]借鉴统计机器翻译思想,将底层代码表示映射为高层语义标签。Punstrip
[17]进一步引入Symbol2Vec,对函数调用关系中的上下文依赖进行向量化表示,推动函数语义分析从局部模式匹配转向上下文感知建模。
随后,EKLAVYA
[18]利用Word2Vec和门控循环单元(Gated Recurrent Unit, GRU)实现端到端的参数语义推断。Nero通过构建增强调用站点图,利用图卷积网络(Graph Convolutional Network, GCN)直接对控制流拓扑与寄存器操作进行拓扑特征编码。SymLM
[19]则将这一思路扩展到跨过程层面,通过过程间控制流图(Interprocedural Control Flow Graph, ICFG)与上下文敏感嵌入显式建模调用者与被调用者之间的语义关联,使函数名预测从函数内部识别演进为过程间语义推断。
面向真实场景中的复杂问题,后续研究进一步从长尾分布、跨架构迁移和复杂编译扰动等方面开展优化。XFL
[20]面向真实数据集中的极端长尾分布问题,引入多标签学习框架,以提升未见标签下的泛化能力;Epitome
[21]则进一步面向跨架构与跨优化扰动,通过投票式分词与多任务学习增强语义稳定性。此外,MFNP
[22]利用LLVM RetDec将x86、ARM和MIPS等多架构二进制统一提升为中间表示,并结合基本块级控制流图与Seq2Seq模型实现跨架构函数名预测,缓解了底层指令差异带来的建模困难。
总体而言,该方向的技术路线已经由局部统计特征建模逐步发展为融合结构信息、过程间上下文、跨架构表示与生成式表达的综合建模范式。
3.2 基于序列联合建模的变量类型推断
在变量与类型恢复方面,TypeMiner
[23]代表了基于显式依赖图与传统分类器的早期路线,其主要价值在于证明了变量传播轨迹对于类型推断的重要性。CATI
[24]则针对“孤儿变量”这一特征稀疏问题,将关注点转向变量使用上下文,并引入卷积神经网络(Convolutional Neural Network, CNN)对局部语义片段进行建模从而补足传统依赖图难以覆盖的细粒度线索。随着恢复对象从基础标量扩展至复合数据类型,TYGR
[25]和ByteTR
[26]分别通过门控图神经网络(Gated Graph Neural Network, GGNN)建模与跨函数图追踪,增强了模型对复杂类型关系与存储别名扰动的表达能力。
进一步,StateFormer
[27]率先尝试将执行过程建模为生成式状态序列,通过引入状态归一化机制,成功消除了编译优化导致的指令重排干扰,在细粒度多级指针解析等极具挑战性的任务上表现卓越。然而,单一的时序建模仍难以实现命名与类型这两类强相关语义任务的互补。在此背景下,DIRTY
[28]的进一步创新则在于将变量命名与类型恢复进行联合优化,说明这两类语义任务之间并非彼此独立,而是存在显著的互补关系。由此,该研究分支的演进逻辑可以概括为,从单变量、单任务、局部建模,逐步发展到跨函数、复合类型与联合语义恢复
[29]。上述代表性方法的核心架构与适用场合如
表2所示。
4 基于大语言模型的生成式方法
由于早期深度学习方法多将语义恢复建模为封闭词表分类任务,因此在函数名预测等场景下容易受到词汇表外问题(Out-of-Vocabulary, OoV)的影响,即模型难以预测训练阶段未见过的新标签。相比传统深度学习方法,大语言模型具备开放词表生成能力,能够突破固定标签空间限制,直接生成更符合程序语义的高层符号。因此,二进制语义恢复研究正逐步从分类范式转向生成范式。
4.1 基于跨模态对齐的指令表征
大语言模型应用于二进制语义恢复的关键前提,是将底层二进制表示映射到语言模型可理解的语义空间。跨模态对齐的目标,正是在二进制表示与自然语言表示之间建立稳定关联。
在这一方向上,BinAdapter
[30]通过持续学习机制增强模型对新架构指令的适应能力。llasm
[31]采用编码器—解码器架构,先利用专用编码器提取汇编语义特征,再通过投影层映射到语言模型输入空间,从而缓解代码模态与文本模态之间的差异。总体来看,跨模态对齐是大语言模型理解二进制语义的关键基础,其关键不在于简单转换输入形式,而在于缓解底层指令表示与自然语言语义空间之间的模态鸿沟,使语言模型能够在保持执行语义的同时生成可解释的高层符号。
4.2 基于偏好对齐的语义符号生成
在具备语义理解能力后,生成结果是否符合开发者命名习惯与逆向分析需求,成为另一关键问题
[32]。偏好对齐的目标,使模型输出不仅语义相关,而且风格自然、粒度合理。与跨模态对齐侧重能否理解不同,偏好对齐更关注生成结果是否符合真实开发语境与逆向分析需求。
GENNM
[33]通过引入双向调用上下文和偏好优化机制,提升了命名结果的语义合理性与风格一致性。BLens
[34]则通过对比学习拉近汇编表示与文本描述之间的语义距离,增强了函数名称生成能力。该方向表明,生成式语义恢复正在向生成更符合人类习惯的命名方式发展。
4.3 基于混合推理的数据结构恢复
尽管大语言模型在语义归纳和开放生成方面具有优势,但在大型结构体恢复和跨函数关系分析中,仅依赖神经网络难以保证全局一致性。尤其在大型结构体恢复、跨字段依赖分析和不完整数据流场景中,局部生成结果难以直接满足程序结构约束。因此,需要借助逻辑规则或约束求解实现全局一致性校验。部分研究将语言模型与符号逻辑、约束求解等方法结合,形成混合推理框架。
ReSym
[35]将LLM生成的变量和字段候选结果交由Prolog逻辑引擎进一步消解与校验,从而结合局部语义预测与全局结构约束,提升复杂数据结构恢复的准确性。HyRES
[36]进一步在LLVM中间表示(LLVM Intermediate Representation, LLVM IR)上结合Datalog演绎,增强了跨架构和数据流不完整场景下的结构一致性。这类方法的核心在于将神经生成与符号约束相结合,形成候选生成、规则验证与全局一致性修正的统一框架,从而提升恢复结果的逻辑一致性与可验证性。本节涉及的基于大语言模型的生成式语义恢复方法对比如
表3所示。
5 面临挑战与未来展望
尽管生成式方法推动了二进制语义恢复的发展,但在工业软件、恶意代码和物联网固件等复杂场景下,相关研究仍面临诸多挑战。二进制分析的困难不仅来自模型能力有限,更与控制流不确定性、数据流复杂性以及编译优化扰动等底层因素密切相关。
5.1 当前技术面临的核心挑战
1)间接跳转导致控制流恢复困难。间接跳转目标依赖运行时状态,难以仅通过静态分析准确解析,进而影响函数边界识别和后续语义推断。
2)内存别名带来数据流分析复杂性。内存别名问题使静态分析常需采用保守近似,容易扩大分析范围,降低恢复精度与可扩展性。
3)编译优化模糊程序原始语义边界。函数内联、寄存器重用和代码重排等优化模糊了原始语义边界,增加了函数名、变量和类型恢复的难度
[37]。
5.2 未来研究方向
1)面向混淆与对抗变异的鲁棒语义恢复。真实场景中的恶意代码和固件程序常伴随加壳、控制流平坦化和垃圾指令插入等混淆手段,未来可进一步研究鲁棒表征方法,以及去混淆技术与语义恢复模型的协同机制。
2)动静结合的混合分析机制。针对间接跳转和内存别名等静态分析难以准确处理的问题,未来可结合动态执行、沙箱监测和模糊测试等手段,引入运行时信息与静态表征融合,以提升语义恢复的准确性。
6 结束语
二进制代码语义恢复旨在重建函数名、变量名、结构体等高层语义信息。该领域的核心困难不仅在于语义生成本身,更在于间接跳转、内存别名、编译优化和代码混淆等底层因素带来的分析障碍。未来,推动静态分析、动态分析与智能模型的协同融合,将是提升二进制语义恢复实用性与鲁棒性的关键方向。