掌桥专利:专业的专利平台
掌桥专利
首页

基于BERT的二进制代码相似性检测方法

文献发布时间:2023-06-19 19:27:02


基于BERT的二进制代码相似性检测方法

技术领域

本发明涉及代码相似性检测技术领域,具体涉及基于BERT的二进制代码相似性检测方法。

背景技术

代码相似性检测常用于代码预测、知识产权保护和漏洞搜索等领域,可分为源代码相似性检测和二进制代码相似性检测。软件的源代码通常难以获得,因此针对二进制代码的相似性检测技术能够适用的场景更加广泛。由于二进制代码具有非常简洁的表示形式,因为编译时的大量转换导致了大多数高级概念(例如,变量名、结构、类型、类层次结构)的丢失,因此推断潜在的上下文含义非常具有挑战性。根据关注的代码信息的不同,当前的二进制代码相似性检测技术分为4类:基于文本、基于属性度量、基于程序逻辑、基于语义的检测技术。

基于语义的检测技术,它通过捕获程序汇编代码中的语义信息,来比较函数或组件的语义差异,已实现相似性度量。这类方法通常借鉴图像识别或其它领域的技术,利用深度神经网络来实现程序语义的嵌入,通过对嵌入向量的比较或查询操作来实现大规模任务的处理。例如BinDNN模型,利用了CNN,LSTM(长-短期存储器)和DNN这3种类型的神经网络模型,将模型进行分层,学习函数汇编代码并判断函数是否相似;SAFE模型,将基于Word2vec模型的函数语义嵌入模型,可实现跨架构函数相似性度量。

传统检测方法所采用的匹配算法通常是固定不变的,神经网络可以针对不同任务进行再训练,应用场景更加广阔;此外,神经网络不但可以自行学习和选择特征,还可以习得人工方法很难确定的不同特征对相似度影响的权重,从而降低甚至避免人工设计和筛选特征带来的拟合。然而,目前的很多神经网格模型还是存在一些缺点,例如RNN由于梯度消失问题,难以从长序列中捕获有用信息。虽然通过设计用于长距离错误传播的特殊单元来缓解这种短存储器问题,但是仍有几个问题:1)跟踪长期依赖性的能力有限;简单地说,来自编码器的暗示所有先前单词的单个向量可能会丢失部分信息。2)由于顺序性而禁止并行计算。而且,目前针对于二进制相似性检测在语义恢复方面仍有缺陷。由于二进制函数通常由多个指令组成,因此需要比RNN或其变体更好的体系结构。

发明内容

本发明的目的在于针对目前二进制相似性检测中基于语义的检测技术存在的缺陷,提供一种基于BERT的二进制代码相似性检测方法, 采用更加平衡的指令归一化方案,并且采用BERT模型深度推断底层代码语义,在预先训练的通用模型就绪后进行代码语义推断,从而进行相似性检测。

为了实现上述目的,本发明采用的技术手段是:基于BERT的二进制代码相似性检测方法,包括:

利用预训练数据集对BERT模型进行预训练,获得预训练后的通用模型;

利用新数据集对通用模型进行重训练,获得微调模型,所述微调模型用于预测两个二进制代码是否相似;

其中,所述预训练数据集为进行归一化处理的函数语料库,所述归一化处理是指针对函数中的每一个指令,采用静态分析的方式进行如下处理:

(1)将立即数按照跳转或调用目的地、调用的值本身、或者一个引用进行归一化处理;引用包括字符串、静态分配的常量或其它数据;

(2)将寄存器按大小或者类型进行归一化处理;

(3)指针表达式或当displacement为字符串引用时,其指令遵循原始格式:base+index*scale+displacement。

进一步地,所述新数据集包含若干带有标签的归一化函数对;该标签用于标识每一个归一化函数对中的两个函数是否相同。

进一步地,所述新数据集还包括补充信息,所述补充信息来源于函数原始的指令信息,包括字符串或数字常量。

进一步地,预训练的通用模型从输入的每个归一化函数对中获得两个隐藏向量和补充信息,计算两个函数的补充信息的余弦相似度;将两个隐藏向量与计算的余弦相似度传递到线性层,输出检测结果。

进一步地,归一化处理的步骤(2)中,具有特殊用途的指针保持不变,包括堆栈指针、指令指针或基指针。

本发明与现有技术相比,具有如下优点与有益效果:

(1)该模型基于最前沿的BERT (transformer的双向编码器表示)架构,保留了更多的语义信息;

(2)该模型经过了精心设计,以便能够利用BERT来实现本发明的目标,包括:函数级粒度,例如,嵌入的单位是二进制函数;函数嵌入作为一个整体,例如,根据函数的位置,每个指令可能有多个表示;良好平衡的指令归一化,在太粗粒度和太细粒度归一化之间取得平衡;基于预训练模型的两阶段训练模型来支持广泛的其他下游任务;

(3)模型由两个独立的训练阶段组成,采用两阶段训练的关键优势是支持潜在的应用程序,允许重新利用预训练的模型,以使用更低成本的计算资源快速应用其他下游任务。

附图说明

图1为本发明实施例中BERT模型结构的简化图;

图2为本发明实施例中基于BERT的二进制代码相似性检测方法的流程示意图;

图3为本发明实施例中的二元相似度预测模型(DS-BinSim)。

具体实施方式

下面将结合本发明的实施例和附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。以下对至少一个示例性实施例的描述实际上仅仅是说明性的,绝不作为对本发明及其应用或使用的任何限制。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

二进制代码是类似于自然语言的机器指令序列。事实上,InnerEye将神经机器翻译(Neural Machine Translation, NMT)的思想借鉴到二进制函数相似性比较任务中,将指令视为单词,将基本块视为句子。为了成功地用深度神经网络表示二进制代码,必须仔细理解它的性质。

1、机器指令遵循齐夫定律

本发明的研究发现,指令分布曲线像自然语言一样密切遵循齐夫定律,这意味着在自然语言处理领域中利用有效的技术(如BERT)对二进制任务有效。

2、函数通常传达有意义的上下文

本发明在语料库中分析了1,681,467个函数(18,751,933个基本块或108,466,150条指令),排除了链接器插入的函数。本发明测量了几个统计数据:1)每个函数的平均指令数(I/F)为64.5(中位数=19,标准差=374.7)。2)每个函数的基本块数(B/F)平均为5.8(中位数=4,标准差=16.4),以及3)每个基本块的平均指令数(I/B)为11.2(中位数=3,标准差=95.8)。由于标准差相当大,本发明通过截断大于标准差三倍的值(约为12%)来去除异常值,最终得到(I/F,B/F,I/B)=(25.1,3.9,3.7)的平均值。本发明发现大约70%的基本块包括五条或更少指令,其中二进制函数平均包含大约四个基本块和25条指令。本发明选择一个粒度为单个函数,该函数足够大,能够传达有上下文意义的信息。

3、Word2vec缺乏不同位置相同指令的不同表示形式

大多数先前的技术采用 Word2vec算法来表示二进制代码。 Word2vec 是一种嵌入技术,旨在从大型语料库文本中学习单词关系,用向量表示每个不同的单词。由于缺少位置信息,Word2vec本身不能在不同的上下文中不同地表示相同的指令。例如,函数末尾弹出寄存器的行为不同于函数中间其他计算的行为。然而,Word2vec表示同一个词的相同表示(嵌入),而不管它们的上下文差异如何,这需要一个更好的嵌入方式来限制词汇量。

4、函数中的控制流图可能没有成效

以前的工作通常使用控制流图(基本块作为顶点,流作为边)或图同构作为比较二进制代码的特征。然而,本发明的发现表明,顶点和边的数量在不同的优化级别上通常并不相同,同构不能适用于这些优化级别。

下面详细介绍本发明提供的基于BERT的二进制代码相似性检测方法。如图1所示,本发明的方法由两个独立的阶段组成:1)预训练阶段,创建一个适用于下游任务的通用模型;2)微调阶段,在预训练的通用模型之上为特定任务生成另一个模型,本发明的特定任务为二进制代码相似度检测。如图2所示,首先使用预定义的二进制语料库,通过静态分析收集工件,预处理步骤用归一化处理所有指令,整个语料库用BERT预训练,生成预训练的通用模型,定义一个下游任务(二进制相似性比较),并准备另一个带有相应标签的数据集,最后,在为下游任务重新训练数据集后,获得一个微调模型。

本发明模型背后的四个设计决策及其基本原理为:

(1)函数级别粒度:将函数确定为可以隐含有意义语义的最小单位;

(2)函数嵌入:为每个函数生成了一个整体的嵌入,而不是每条指令(例如word2vec)用于代码表示。这意味着即使是相同的指令,其位置和周围的指令也会有不同的嵌入;

(3)平衡的归一化:利用现有的静态二进制分析来归一化指令,以便预训练模型可以自然地在深度神经网络中包含重要特征;

(4)模型分离:模型需要两个训练:一个用于预训练,另一个用于对每个用户定义的任务进行微调。

本发明提供的基于BERT的二进制代码相似性检测方法,详细步骤和过程如下描述:

一、预训练数据集的平衡的归一化处理

指令归一化过程对于准备将其矢量化形式输入神经网络至关重要,正如许多先前方法所采用的那样。然而,过于粗粒度的归一化,例如剥离所有立即值会丢失大量上下文信息,而过于细粒度的归一化接近指令反汇编,则会由于大量看不见的指令(token)会引发OOV 问题。本发明发现,之前的方法只是简单地执行操作码或操作数的机械转换,而没有全面考虑它们的上下文含义。

为此,本发明设计了一个平衡的归一化策略,以在尽可能精确地表达二进制代码语义和保持合理数量的词之间取得平衡,即少量词可能会失去原始语义,而词可能会遇到OOV 问题。指令归一化的质量很重要,因为词嵌入最终依赖于单个归一化指令,保存最终的上下文信息。例如,立即数可以表示以下内容之一:库的目标、当前二进制文件内部或外部的调用、跳转到的目标、字符串引用或静态分配的变量;然而,放弃这样的含义使得嵌入很难彼此区分。例如,根据本发明的实验,在应用粗粒度归一化时,两千个词汇表中最常见的两个词(mov_reg8_ptr 和 mov_reg8_reg8)占出现次数的 20% 以上,这无法传达有效的上下文。

本发明采用以下方法对指令进行归一化处理,如表1所示:

1、一个立即数可以按照以下任一项进行分类:

(a)一个跳转或调用目的地,例如:0x401d00→externfunc, 0x40a130→innerfunc;

(b)一个值本身,例如,0x38→immval;

(c)按照字符串,静态分配的常量或其它数据的一个引用,例如,0x425530→dispbss。

2、寄存器默认可以按大小或类型分类,例如,r14→reg8, eax→reg4;但具有特殊用途的指针则保持不变(指针原本是什么就是什么),如堆栈指针、指令指针或基指针,例如:ebp→bp4。

3、指针表达式遵循原始格式“base+index*scale+displacement”,例如:DWORDPTR [r14]→dwordptr[reg8],这样可以保留某些内存访问信息。此外,当且仅当displacement为字符串引用时,表达式遵循原始格式“base+index*scale+displacement”。注意,操作码不是归一化过程的一部分。

表1本发明中用于表示x86_64指令操作数的平衡归一化规则

预训练阶段(通用模型)

本发明使用语料库中的机器指令和完全不同的词汇表(例如,归一化指令),经过静态分析,采用上述的归一化处理方法处理获得的归一化指令来训练模型。

BERT,来自Transformers的双向编码器表示,是最先进的架构之一,通过采用Transformer的编码器层,捕捉单词和句子的上下文意义(本发明模型的指令和函数),提供自然语言的丰富矢量表示。BERT包括两个训练阶段,如图1所示:预训练过程使用大量语料库构建通用模型,微调过程更新适用于特定下游任务的预训练模型。前者采用两种策略:掩蔽语言模型(MLM)和下一句预测(NSP)考虑上下文以及单词和句子的顺序,这可以通过使用未标记的数据集进行无监督学习来实现。在图1中,[MASK]标记表示一个被屏蔽的输入单词,[SOS]和[EOS]分别是句子开头和结尾的标记。[UNK]标记用于未知单词。这个示例一次有256个固定长度的输入(254个单词,带有掩码,不包括两个特殊标记:句子的开头/结尾位于两端)。一旦预训练完成,预训练的通用模型可以通过监督学习被回收用于不同的用户定义的下游任务。本发明采用BERT是因为该模型可以无缝地符合本发明的目标:创建一个包含通用二进制代码表示的预训练模型,并用相对较低的计算资源对该模型进行再训练,以用于各种不同的分类任务。

本发明采用原始 BERT 的掩码语言模型 (MLM),该模型以概率方式掩码归一化指令的预定义部分(例如15%),然后在预训练期间在给定函数中预测它们。表2显示了本发明和其他二进制相似性检测模型采用的不同归一化策略。 DeepBinDiff考虑用寄存器大小来表示一个m字节寄存器;但是,它将所有立即数转换为imme 。 同时,InnerEye 丢弃了64 位机器指令集的寄存器的大小信息。 SAFE保留立即值。 此外,所有这三种情况都将调用的目标转换为单个符号(例如 HIMM、imme 或 FOO),从而使每个调用指令都相同。值得注意的是,本发明的模型不使用 NSP(即预测下一句),因为两个连续的函数通常不会在语义上连接。此外,本发明的模型利用了 Transformer(与其它的RNN模型相比),它允许有效地直接连接所有指令和高度并行化的计算,例如:GPU 资源。

表2本发明模型与其他模型的归一化处理比较

重训练阶段(微调模型)

本发明的模型旨在支持特定的下游任务,这些任务需要通过基于预训练的通用代码表示模型的相对快速的重新训练来推断二进制代码的上下文信息。在本发明中,下游任务是预测两个函数是否相似的二进制相似性(DS-BinSim)检测任务。

1、 二进制相似性检测模型

本发明定义了一个新数据集,该数据集包含若干带有标签的归一化函数对;该标签用于标识每一个归一化函数对中的两个函数(NF

新数据集还包括补充信息,称为 Bag of Signature (BoS),以增强二进制相似性任务,因为即使是本发明设计的平衡良好的归一化策略(表1)也会放弃字符串或数字常量本身,这些字符串或数字常量本身可能有助于更好地理解函数的上下文。通过静态分析同时枚举字符串或数字常量等,记录下来,将这些字符串或数字常量称为函数的补充信息,作为重要的特征向量向神经网络提供额外信息帮助二进制相似性预测分类。

图3为本发明的微调模型,该模型本质上为二元相似度预测模型(DS-BinSim)。该模型的算法原理为:加载预训练的通用模型作为基础,从每一个归一化函数对中获得两个隐藏向量(大小=h)。将字符串或者数字常量信息转化为特征向量,并计算两个函数的补充信息的余弦相似度,计算公式如下:

其中,向量

接下来,将三个向量,即两个隐藏向量和两个 BoSes 的余弦相似度,传递到一个线性层,其中,输入的数量为2*h+1,输出的数量为 2,h为隐藏向量的大小。

2、模型和损失函数

本发明的下游任务是一个二元分类问题。具体来说,该任务的logits可以计算为:

(1);

是预训练通用模型返回的给定函数的隐藏向量,F(·)是全连接层返回的给定函数的隐藏向量。为了在微调阶段获得最优的网络参数,使用交叉熵作为损失函数,找到网络参数θ满足:

(2);/>

其中,C表示一组类(函数相似度的判定); p(c|y)表示类的ground-truth分布;

四、实现

本发明使用TensorFlow和PyTorch在几个现有的BERT实现之上开发本发明的模型。与原始的BERT体系结构不同,在构建语言模型时,深度语义不计算NSP,因为函数的语义与其相邻函数的语义是位置无关的。本发明用96个序列的批大小进行预训练,其中每个序列包含256个词(例如,256*96=24,576个词/批,包括特殊的词),在1.3M个二进制函数经历5轮迭代。使用ADAM优化器,学习率为0.0005, β

表3 本发明模型训练阶段的(B)ERT、(O)Ptimizer和(T)Rainer的超参数

。/>

相关技术
  • 一种基于代码特征的二进制代码与源代码相似性分析方法与装置
  • 一种基于代码特征的二进制代码与源代码相似性分析方法与装置
技术分类

06120115918650