二进制与源代码相似性检测是计算机安全领域的重要研究问题,广泛应用于漏洞定位、代码复用识别和逆向工程等场景
[1-2]。例如,在已知漏洞源代码的情况下,若能够准确识别目标二进制程序中是否包含相应编译代码,将有助于开展软件漏洞预警与风险分析。
然而,源代码与二进制代码之间存在显著的语义鸿沟。源代码保留了函数名、变量名和数据结构等高层语义信息,而二进制代码在编译过程中被转换为底层指令序列,大量高层语义信息被剥离。同时,不同优化等级和指令集架构还会进一步改变指令形式与程序结构,使得相同源代码生成的二进制呈现出明显差异。
现有研究主要包括基于静态分析和基于表征学习两类方法
[3-4]。前者依赖人工设计的常量、控制流和调用关系等特征,难以适应复杂编译环境下的结构变换;后者虽然能够借助图神经网络或序列模型自动学习代码表示
[5],但往往仍停留于指令符号模式或拓扑结构层面,容易受到寄存器分配、编译优化等底层实现细节干扰,缺乏对函数高层逻辑意图的显式建模。近年来,大语言模型(Large Language Model, LLM)展现出较强的代码理解能力
[6-8],能够有效提升跨架构检测的精度。但其生成式架构并不天然适配判别式检索任务,直接用于大规模相似性匹配时仍面临特征边界不清、推理开销较大以及可扩展性不足等问题。
针对上述问题,本文提出一种函数级二进制到源代码相似性检测框架BinThink。该方法引入语义归一化中间层,对二进制函数中的变量、操作语义和逻辑结构进行统一建模,将底层异构指令转化为与架构无关的语义流,从而缓解编译差异带来的结构噪声,并增强二进制与源代码之间的深层语义对齐能力。在此基础上,本文进一步设计上下文增强型提示机制,并结合自适应推理与差异化训练策略,以提升模型在检索任务中的判别能力与计算效率。本文主要工作如下。
1)提出BinThink框架,通过构建语义归一化中间层,将异构二进制指令转译为与架构无关的语义流,提升二进制到源代码相似性检测的准确性。
2)设计面向检索任务的上下文增强提示与自适应推理机制,缓解大语言模型在向量匹配任务中的生成偏置、计算开销大和收敛慢等问题。
3)在大规模真实数据集上的实验结果表明,BinThink在跨优化等级和跨架构场景下均具有较好的鲁棒性与泛化能力,整体性能优于现有方法。
1 相关工作
二进制与源代码相似性检测旨在判定两者的语义对应关系,是漏洞定位及逆向分析的关键技术
[9-10]。由于源代码保留了丰富的语法结构与符号信息,而二进制代码仅包含底层机器指令,二者在表示形式上存在显著差异。此外,编译优化、目标架构变化及符号剥离等因素还会进一步扭曲代码表层结构,加剧跨模态匹配难度。现有方法大致可分为基于静态特征的方法和基于表征学习的方法。
1.1 基于静态特征的方法
基于静态特征的方法主要依赖人工设计的特征进行匹配。代表性工作如BinPro
[11]利用字符串常量、整数立即数和函数调用等特征,通过二分图匹配计算源代码与二进制代码间的对应关系;B2SFinder
[12]进一步结合字符串、常量和控制流等多类特征,并通过加权策略提升匹配精度;OSSPolice
[13]则利用字符串字面量、导出函数等特征识别开源代码复用关系。此类方法通常具有较好的可解释性和较高的计算效率,但其本质上依赖表层特征,当面对常量折叠、函数内联以及跨架构转换等复杂编译扰动时,容易因关键特征缺失或变形而性能下降
[14]。
1.2 基于表征学习的方法
基于表征学习的方法通过学习统一向量表示来缩小源代码与二进制代码之间的模态差异,可进一步分为基于图建模和基于序列建模两类。
基于图建模的方法通常将二进制函数表示为控制流图,并利用图神经网络提取结构语义。CodeCMR
[15]采用双塔架构,在源代码侧和二进制侧分别学习表示并进行对齐;Order Matters
[16]结合基本块级表示与消息传递机制建模函数语义;VulHawk
[17]通过将不同架构二进制提升为与架构无关的中间表示,并结合预训练任务学习函数嵌入。该类方法能够较好利用控制流结构信息,但也容易受图结构复杂性限制,在处理长距离依赖和细粒度操作语义时存在不足。
基于序列建模的方法则将汇编代码视为指令序列,借助自然语言处理模型捕捉上下文语义
[18]。SAFE
[19]利用自注意力机制学习函数嵌入表示;PalmTree
[20]基于BERT预训练指令表示,以增强对汇编语义的建模能力;BinaryAI
[21]通过将二进制反编译为类C伪代码,并结合对比学习实现与源代码的语义对齐。此类方法将具有复杂拓扑关系的程序表示线性化,往往会损失控制流结构信息
[22];同时,在跨架构场景下,不同指令集之间显著的分布差异也会限制模型的泛化能力。
总体来看,现有方法虽然在二进制相似性检测任务中取得了较大进展,但仍普遍存在对表层模式依赖较强、对深层逻辑语义建模不足的问题。如何在复杂编译环境下实现更稳健的跨模态语义对齐,仍是该方向需要进一步解决的关键问题。
2 BinThink方法
2.1 问题定义
给定一个二进制函数集合B={b1,b2,…,bN }和一个源代码函数集合S={s1,s2,…,sM },二进制到源代码函数相似性检测的目标是学习一个相似度度量函数Sim(bi,sj )∈[0,1]。对于每一对互为编译关系的(bi,sj ),模型应使得Sim(bi,sj )趋近于1,而对于非同源对(bi,sj ),j≠i,模型应使得Sim(bi,sj )趋近于0。
2.2 框架概览
本文提出BinThink框架,如
图1所示。该框架首先利用Qwen3-Coder-30B模型作为推理引擎,通过自适应推理机制,将二进制代码转化为包含丰富语义意图的中间表征。之后,采用Qwen3-7B作为骨干网络,配合非线性投影层,将推理生成的语义流与源代码映射到统一的高维向量空间,实现跨模态特征对齐。
2.3 自适应语义推理与增强型输入构建
为在深度语义理解与计算开销之间取得平衡,并实现跨模态数据的形式化对齐,BinThink构建了一套从复杂度评估到增强型输入生成的处理流程。
2.3.1 复杂度评估与调度
根据函数的循环嵌套深度、条件分支数量等结构特征计算复杂度得分C(f)。本文将C(f)定义为边数E与节点数V的加权和,作为圈复杂度的近似度量。当C(f)超过预设阈值τ时,判定该函数为高复杂度,系统激活Qwen3的思考模式;反之,对于低复杂度函数,则采用标准推理模式以节省资源。复杂度得分C(f)定义如下:
式中:E为控制流边数;V为基本块块数;w1 和w2 为权重系数,用于平衡节点规模与控制流分支对复杂度的贡献。
2.3.2 语义流生成
在推理过程中,模型生成语义流
Ti,用于将底层指令序列转化为与架构无关的逻辑操作表示。其构建主要包括3个方面。1)变量归一化,即识别寄存器在数据流中的语义角色,并统一标记为参数、计数器或返回值等逻辑变量;2)操作语义标准化,即利用预定义词表对机器指令进行统一转译与降噪,将语义相近或由编译优化产生的指令模式映射为一致的原子操作;3)逻辑结构重构,即结合控制流信息恢复循环、条件分支和函数调用等高层控制范式。
图2展示了数组求和函数经推理后得到的标准语义流示例。
2.3.3 增强型输入
为适配嵌入模型输入形式并减弱LLM的生成偏置,本文分别为二进制语义流和源代码函数设计了任务导向的增强提示。其目标是引导模型聚焦深层语义理解与特征提取,而非代码补全或文本生成。
在二进制侧,将推理生成的语义流Ti 嵌入提示模板,通过加入“关注数据流与控制逻辑、忽略格式噪声”等约束,引导模型从逻辑执行角度理解输入,形成增强表示:
在源码侧,对源代码施加相似的任务约束,引导模型弱化变量命名、注释和语法风格等表层因素的影响,提取与二进制语义流对应的核心计算逻辑,形成增强表示Xsrc:
2.4 特征投影与度量学习策略
在获得Xbin与Xsrc后,系统将其输入到基于Qwen3-7B的嵌入模型中。
2.4.1 共享投影与解耦微调机制
为提升相似性度量能力,本文在模型末端引入非线性投影层,将原始隐藏状态映射到统一的相似性空间,并通过计算 Vbin与 Vsrc的余弦相似度完成匹配。
训练阶段,BinThink基于QLoRA采用差异化学习率策略。对基座模型及LoRA适配器使用较低学习率,以保留预训练知识;对投影层使用较高学习率,以加快二进制代码与源代码特征在统一度量空间中的对齐。
2.4.2 困难负样本挖掘与边界约束优化
为提升度量空间的区分度,优化目标采用带边界约束的InfoNCE损失函数。本文通过计算投影后的向量 Vbin与 Vsrc的余弦相似度来评估相似性。针对随机负样本梯度贡献不足的问题,在同一批次内在线挖掘困难负样本,即寻找与二进制锚点bi 相似度最高但非同源的源码函数sj (例如strcpy与strncpy)。同时引入Margin约束m,强制正样本对的相似度必须显著高于最难负样本对的相似度,从而在特征空间中形成清晰的类间边界。
2.5 复杂度与误差传播分析
2.5.1 相关分析
本文提出框架的计算开销主要来源于大语言模型推理与下游嵌入映射。设待检测二进制函数的规模为N,指令序列平均长度为L。若直接应用全量LLM推理,其时间复杂度高达(d为隐藏层维度),且面临极大的显存开销(P为模型参数量,b为批大小)。为此,BinThink引入自适应推理机制,仅对圈复杂度越界的复杂样本(占比)触发LLM分析,将核心时间复杂度降至;同时,将LLM输出固化为轻量级的规范化文本(语义流),避免在内存中持续维护海量稠密向量,显著降低了空间复杂度,有效提升模型在大规模代码库中的可扩展性。
2.5.2 推理误差传播影响
在基于LLM的检测范式中,局部推理偏差可能在下游引发级联误差。为缓解该问题,BinThink设计了两级容错机制。首先,中间表示“语义流”通过标准化对底层指令进行抽象,过滤细粒度噪声。其次,下游对比学习在统一语义空间中进行全局优化,引导模型关注函数的高层语义意图而非局部细节。因此,即使中间语义流中存在少量结构性噪声,非线性投影层仍可将其稳定映射至正确的语义簇,有效阻断局部推理误差向整体匹配结果的传播,保障模型在复杂编译环境下的鲁棒性。
3 实验
3.1 实验设置
本文构建了大规模跨模态函数检索数据集,以评估BinThink在跨架构和跨优化场景下的鲁棒性。数据集来源于GitHub上多个高流行度C/C++开源项目,包括OpenSSL、Coreutils和SQLite等,共包含60 000余对二进制函数与源代码函数。编译环境覆盖O0~O3这4种优化等级及x86-32、x86-64、ARM64、MIPS32等主流架构。
实验中,BinThink采用Qwen3-Coder-30B作为推理模型、Qwen3-7B作为嵌入模型,并基于4-bit QLoRA进行微调。硬件环境为Intel Xeon Silver 4116、128 GB内存和2×RTX4090。主要超参数设置如下:训练轮次为150,批次大小为16,学习率分别为和,温度系数为0.07,Margin为0.2。
3.2 评估指标
1)平均倒数排名(Mean Reciprocal Rank, MRR):反映了真实结果在推荐列表中的位置,MRR越高,位置越靠前。
2)Recall@k:衡量检索结果前k个候选中包含真实对应源码函数的比例,是检索任务中最核心的指标。
式中:为前次命中数;为查询总数。
3.3 对比实验
本文选取BinPro、B2SFinder、CodeCMR和BinaryAI作为基线方法。其中BinaryAI以Pythia-410M为骨干,并在本文数据集上完成预训练与微调;BinPro和B2SFinder则严格依照原论文实现。
BinThink在跨优化等级(Cross-Optimization, XO)和跨架构(Cross-Architecture, XA)两个场景下评估了各模型的检索性能。在候选池大小(Pool Size)分别为100和10 000的设置下,实验结果如
表1所示。
实验结果表明,BinThink在所有评估指标上均取得了最优性能。当候选池大小为100时,BinThink在XO和XA任务上的Recall@1分别达到了89.4%和88.7%,整体MRR高达0.91。与BinaryAI相比,BinThink在XO和XA任务上的Recall@1分别提高了7.8和8.5个百分点。
结果表明,BinThink通过“自适应推理—增强表征—对比检索”框架,有效缓解了编译环境带来的结构噪声,提升了二进制代码与源代码之间的语义对齐能力。
从对比结果看,BinPro和B2SFinder等基于静态特征的方法性能最低,说明浅层特征容易受编译优化影响。CodeCMR借助图结构建模取得了一定提升,但对细粒度指令语义的刻画仍有限。BinaryAI依靠大规模预训练进一步提高了性能,但在跨模态表征差异较大的场景下仍存在不足。相比之下,BinThink通过显式语义推断直接建模底层汇编的功能意图,减少了对表层结构和反编译结果的依赖,因此取得了更优的检测效果。
在候选池大小为100时,BinThink在XO和XA任务上的Recall@1分别达到89.4%和88.7%,二者仅相差0.7个百分点,表明BinThink在不同编译优化等级和不同指令集架构下均具有较强的鲁棒性。相比之下,BinaryAI在XO和XA任务上的Recall@1分别为81.6%和80.2%,其在XA任务上的性能较XO任务下降1.4个百分点。
当候选池扩展至10 000时,所有方法性能均有所下降,但BinThink仍保持较强判别能力:在XO场景下Recall@1达到62.3%,高于BinaryAI,MRR为0.78,也优于BinaryAI的0.72。结果说明,BinThink在大规模检索场景下仍能维持较清晰的特征边界和较好的抗干扰能力。
3.4 消融实验
为验证BinThink各个核心组件的贡献,本文设计了消融实验,重点关注模型选择和损失函数设计。实验结果如
表2所示。
3.4.1 嵌入模型的规模与推理模块的影响
表2结果表明,在同为Qwen3-7B嵌入模型的条件下,启用推理模式后Recall@1由74.1%提升至92.3%,增幅达18.2个百分点。需要指出的是,该overall指标并非仅由XO和XA等困难样本构成,还包含一定比例的同架构、同优化等级的基础样本。由于BinThink在这些结构未显著变异的场景中表现出接近饱和的对齐精度,从而进一步抬升了整体加权性能。因此,该结果不仅反映了模型在复杂编译环境下的有效性,也体现了其在常规场景中的稳定表现。相比之下,单纯增大嵌入模型规模仅带来有限收益,说明思维链推理比参数扩展更能促进模型对二进制代码深层语义的理解。这表明,跨模态对齐不仅依赖表层特征匹配,更依赖对代码逻辑意图的显式建模。
此外,FNN投影层在生成式表征向判别式检索迁移中起到了关键作用。即使启用推理模式,若去除投影层而直接使用LLM隐藏状态进行检索,Recall@1仍会降至61.4%。这说明LLM原始特征空间并不适合直接用于相似度度量,而投影层能够有效将推理获得的语义信息映射到更适合检索的对比空间。
3.4.2 损失函数设计的演进
为了验证对比学习目标函数中各关键组件的有效性,本文逐步叠加了困难负样本挖掘与Margin约束,实验结果如
表3所示。
实验配置A与B的对比表明,样本采样策略对模型收敛具有重要影响。仅采用标准InfoNCE时,Recall@1为75.0%;引入难负样本挖掘后,Recall@1提升至81.2%。这说明随机负样本区分难度较低,而难负样本挖掘能够促使模型关注细粒度语义差异,从而提升检索性能。
实验配置B与C的对比进一步表明,Margin约束有助于优化特征空间结构。加入Margin后,Recall@1提升至89.1%,MRR达到0.91;同时,平均正样本相似度由0.659 6提升至0.730 9,平均负样本相似度降至0.006 0。结果说明,Margin约束能够增强类内聚合和类间分离,从而提高模型的判别性与鲁棒性。
3.4.3 效率与开销分析
本文评估了自适应推理策略在性能与效率间的平衡效果。对比了3种策略:1)Full Reasoning(Qwen3-coder-30B);2)No Reasoning(仅使用7B嵌入);3)Adaptive(BinThink自适应策略)。实验结果如
表4所示。
表4结果表明,Full Reasoning虽取得最高Recall@1(90.2%),但平均推理延迟达45 s,部署成本较高(表格中*表示该策略的显存占用已达到当前实验环境可用显存总容量48 GB,实际峰值显存需求可能高于48 GB,受硬件条件限制无法进一步测得)。No Reasoning虽将延迟降至1.8 s、显存降至14.5 GB,但Recall@1仅为82.1%,精度下降明显。相比之下,BinThink(Adaptive)在较小精度损失下显著提升了效率:相较Full Reasoning,其平均推理延迟降低约65%,Recall@1仅下降0.8个百分点;相较No Reasoning,Adaptive策略将Recall@1由82.1%提升至89.4%,提高了7.3个百分点,即相对提升约8.9%,同时仅增加了有限的计算开销。结果表明,BinThink在检测精度与运行效率之间实现了更优平衡。
4 结束语
本文提出了BinThink框架,将二进制到源代码相似性检测建模为“自适应推理—增强表征—对比检索”过程,从而提升了跨模态语义对齐能力。实验结果表明,BinThink在准确性、跨架构鲁棒性和大规模检索能力方面均优于现有方法。但是,BinThink仍存在一定局限:1)深度推理仍带来较高计算开销,在超大规模代码库场景下的效率仍有提升空间;2)在高强度混淆或超长函数场景下,模型性能可能受到一定影响。未来将进一步探索轻量化推理与复杂场景下的鲁棒语义建模方法。