本发明属于软件分析
技术领域:
:,特别是涉及一种基于深度学习的无符号二进制间接控制流识别方法。
背景技术:
::从无符号信息的二进制文件中重构控制流图是软件分析中许多问题的先决基础,如反汇编中的指令识别和函数识别。除此之外,二进制层面的控制流图重构在控制流完整性研究、恶意软件分类和溯源等问题上也具有重要作用。通常,在二进制中静态重构控制流图是一个递归的过程,然而,该过程往往受阻于间接控制流。对于直接控制流而言,跳转/调用指令的操作数即为控制流中指令的目标地址;而对于间接分支而言,对应指令的操作数往往是保存了目标地址的寄存器或内存单元,故而间接控制流的目标难以静态确定。鉴于动态分析方法覆盖率低、处理效率低等弊端,从无符号信息的二进制中静态识别间接控制流成为亟需解决的难题。已有的二进制分析工具通常采用不同的技术手段处理间接跳转和间接调用。间接跳转主要包括跳转表(由switch-case和if-else编译得到)。现有的跳转表静态处理方法可划分为a)基于反向切片和模式匹配的启发式方法,以及b)数据流分析或值集分析(vsa)等深度分析技术。启发式方法通过搜寻特定的模式以确定跳转表的基地址和索引的边界,从而确定跳转表的目标基本块。但是,基于模式匹配的方法在不同的编译器和体系架构下需人为设定不同的模式,故而缺乏可扩展性。深度分析技术可以保留一定的语义信息以提高识别精度,但是该类方法的计算成本较高,故而难以应用于大型的应用程序。对于间接调用而言,目前仍缺乏有效的二进制层面的静态分析手段。间接调用主要由函数指针和虚函数编译得到,该类函数用于实现程序的动态行为。主流分析工具通常使用常量传播技术以解析间接调用的目标。即,当一个常量流向一个间接调用指令时,该常量则被视作对应间接调用指令的一个目标。然而,通过该方法只能识别出少量间接调用的目标函数。鉴于此,本发明拟通过构建基于语义的二进制间接控制流识别方案,从而解决无符号信息的二进制中间接控制流指令的目标难以静态获取的问题。本发明利用间接跳转(调用)的源与目标之间的语义关联,基于深度学习方法,对间接控制流的目标进行自动识别。此外,本发明中的框架无需对间接跳转和间接调用采取不同的技术手段进行处理,在间接跳转方面,可达到与主流二进制分析工具相似的准确度,而本方法可以大幅度提高间接调用的目标函数识别的准确度,从而解决目前无可行方法静态获取二进制中间接调用目标的问题。技术实现要素:针对上述问题,本发明提出一种基于深度学习的无符号二进制间接控制流识别方法。该方法通过采集二进制中各字节间的语义信息,基于间接控制流源和目标之间的上下文关联,构建了以深度学习为中心的二进制间接控制流目标识别方案,具体步骤如下:步骤1:引入原始二进制代码文件,原始二进制代码文件中多个字节构成多个指令代码块,多个指令代码块构成多个基本块代码块,多个基本块代码块构成多个函数代码块,根据基本块代码块和函数代码块构建间接调用分支和函数序列,并进一步构建间接跳转的三元组样本、间接调用的三元组样本,对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集;步骤2:构建神经网络间接跳转目标识别分类模型,将间接跳转训练集中每个间接跳转的三元组样本依次输入神经网络间接跳转目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接跳转样本标签和分类模型的预测标签构建神经网络间接跳转目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接跳转目标识别分类模型;构建神经网络间接调用目标识别分类模型,将间接调用训练集中每个间接调用的三元组样本依次输入神经网络间接调用目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接调用样本标签和分类模型预测的标签建神经网络间接调用目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接调用目标识别分类模型;步骤3:将待检测的二进制文件通过步骤1提取待检测的二进制中指令代码块、待检测的二进制中基本块代码块、待检测的二进制中函数代码块,对于待检测的二进制中指令代码块,判别是否为间接跳转指令代码块或间接调用指令代码块;作为优选,步骤1所述原始二进制代码文件为:texti={ci,1,ci,2,...,ci,l}i∈[1,k]其中,texti表示第i个原始二进制代码文件,k表示原始二进制代码文件的数量,l表示第i个原始二进制代码文件中字节的数量,ci,j表示第i个原始二进制代码文件中第j个字节,j∈[1,l];步骤1所述原始二进制代码文件中多个字节构成多个指令代码块具体表示为:insi,k={ci,sins_k,ci,sins_k 1,...,ci,sins_k nins_k-1}k∈[1,nins]其中,insi,k表示第i个原始二进制代码文件中第k个指令代码块,nins表示第i个原始二进制代码文件中指令代码块的数量,sins_k为第k个指令代码块起始的字节的下标,nins_k表示第k个指令代码块中字节的数量,ci,sins_k j表示第i个原始二进制代码文件中第k个指令代码块中第sins_k j 1个字节,j∈[0,nins_k-1];步骤1所述多个指令代码块构成多个基本块代码块具体表示为:bi,m={insi,sbb_m,insi,sbb_m 1,...,insi,sbb_m nbb_m-1}m∈[1,nbb]其中,bi,m表示第i个原始二进制代码文件中第m个基本块代码块,nbb表示第i个原始二进制代码文件中基本块代码块的数量,sbb_m为第m个基本块代码块起始的指令代码块的下标,nbb_m表示第m个基本块代码块中指令代码块的数量,insi,sbb_m j表示第i个原始二进制代码文件中第m个基本块代码块中第sbb_m j 1个指令代码块,j∈[0,nbb_m-1];步骤1所述多个基本块代码块构成多个函数代码块的具体表示为:fi,n={bi,sfunc_n,bi,sfunc_n 1,...,bi,sfunc_n nfunc_n-1}n∈[1,nfunc]其中,fi,n表示第i个原始二进制代码文件中第n个函数代码块,nfunc表示第i个原始二进制代码文件中函数代码块的数量,sfunc_n为第n个函数代码块起始的基本块代码块的下标,nfunc_n表示第n个函数代码块中基本块代码块的数量,bi,sfunc_n j表示第i个原始二进制代码文件中第n个函数代码块中第sfunc_n j 1个基本块代码块,j∈[0,nfunc_n-1];步骤1所述根据基本块代码块和函数代码块构建间接调用分支和函数序列为:所述间接调用分支:bri,m={bi,entry_m,e,bi,entry_m 1,...,e,bi,call_m}m∈[1,ncall]其中,bri,m为第i个原始二进制代码文件中第m个间接调用指令代码块所在的间接调用分支序列,ncall表示第i个原始二进制代码文件中间接调用指令代码块的数量,entry_m为第m个间接调用分支序列的入口基本块的下标,entry_m 1为bi,entry_m的后继基本块代码块的下标,call_m为第m个间接调用指令代码块所在基本块代码块的下标;所述函数序列:fsi,n={bi,sfunc_n,e,bi,sfunc_n 1,...,e,bi,sfunc_n nfunc_n-1}n∈[1,nfunc]其中,fsi,n为函数fi,n对应的函数序列,e为函数内部的控制流;步骤1所述进一步构建间接跳转的三元组样本为:jdatai,k=(bi,m,e,bi,n)k∈[1,ndata_jmp]其中,jdatai,k表示第i个原始二进制代码文件生成的第k个间接跳转数据样本,即第i个原始二进制代码文件中第k个跳转表对应的样本,ndata_jmp表示第i个原始二进制代码文件中间接跳转样本的数量,e表示函数代码块内部的控制流,bi,m为第k个跳转表中间接跳转指令代码块所在的基本块代码块,bi,n为第k个跳转表所在函数代码块中除bi,m的任一基本块代码块,即假设bi,m∈fi,l,则bi,n∈fi,l-{bi,m},m,n∈[1,nbb];上述jdatai,k对应的第k个跳转表的构成为:jtablei,k={bi,m:{bi,sjt_k,bi,sjt_k 1,...,bi,sjt_k njt_k-1}}其中,sjt_k为第k个跳转表起始的基本块代码块的下标,njt_k表示第k个跳转表中跳转条目的数量,bi,sjt_k j表示第i个原始二进制代码文件中第k个跳转表中第sjt_k j 1个跳转条目,j∈[0,njt_k-1];步骤1所述进一步构建间接调用的三元组样本为:cdatai,k=(bri,k,e,fsi,n)k∈[1,ndata_call]其中,cdatai,k表示第i个原始二进制代码文件生成的第k个间接调用数据样本,即第i个原始二进制代码文件中第k个间接调用指令代码块对应的样本,假设为insi,l,ndata_call表示第i个原始二进制代码文件中间接调用样本的数量,e表示函数代码块之间的控制流,bri,k为第i个原始二进制代码文件中第k个间接调用指令代码块insi,l所在的间接调用分支,基于宽度优先搜索算法构造bri,k;fsi,n为第i个原始二进制代码文件中的第n个函数fi,n对应的函数序列,fi,n为所在二进制代码内任意address-taken函数;定义ctarget(insi,l)为insi,l实际调用的函数代码块列表,即:ctarget(insi,l)={fi,ct1,fi,ct2,...,fi,ctn}其中,fi,ct1,fi,ct2,...,fi,ctn为insi,l的实际目标函数。步骤1所述对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集为:对于间接跳转的三元组样本即jdatai,k=(bi,m,e,bi,n):若bi,n∈jtablei,k[bi,m],则jdatai,k的标签标记为jlabeli_k,1,反之为jlabeli_k,0;对于间接调用的三元组样本即cdatai,k=(bri,k,e,fsi,n):若fi,n∈ctarget(insi,l),则该样本标记为clabeli_k,1,反之为clabeli_k,0。步骤1所述构建间接跳转训练集,即:jdata={(jdata1,1,jlabel1_1,k1),(jdata1,2,jlabel1_2,k2),......,(jdatak,ndata_jmp_k,jlabelk_ndata_jmp_k,knjmp)}其中,jdata为间接跳转训练集,(jdata1,1,jlabel1_1,k1)为数据集中的第一个样本,如前所述,jdata1,1为第1个原始二进制代码文件中的第1个样本,jlabel1_1,k1为jdata1,1的标签,k1的取值为0或1;(jdatai,j,jlabeli_j,km)为数据集中第m个样本,jdatai,j为第i个原始二进制代码文件中的第j个样本,jlabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,k],j∈[1,ndata_jmp_i],k为原始二进制代码文件的数量,ndata_jmp_i表示第i个二进制的间接跳转样本总个数,njmp为间接跳转训练集中的样本总数。步骤1所述构建间接调用训练集,即:cdata={(cdata1,1,clabel1_1,k1),(cdata1,2,clabel1_2,k2),......,(cdatak,ndata_call_k,clabelk_ndata_call_k,kncall)}其中,cdata为间接调用训练集,(cdata1,1,clabel1_1,k1)为数据集中的第一个样本,如前所述,cdata1,1为第1个原始二进制代码文件中的第1个样本,clabel1_1,k1为cdata1,1的标签,k1的取值为0或1;(cdatai,j,clabeli_j,km)为数据集中第m个样本,cdatai,j为第i个原始二进制代码文件中的第j个样本,clabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,k],j∈[1,ndata_call_i],k为原始二进制代码文件的数量,ndata_call_i表示第i个二进制的间接跳转样本总个数,ncall为间接跳转训练集中的样本总数。作为优选,步骤2所述神经网络间接跳转目标识别分类模型由嵌入层、深度双向长短期记忆网络、注意力层和批标准化层串联级联构成;所述嵌入层,该层将单词从高维稀疏的one-hot向量转化为低维密集的向量。每个单词的低维密集向量jmp_embedding_vector,为待寻优的参数。所述深度双向长短期记忆网络,由第一双向长短期记忆层、第二双向长短期记忆层、随机失活层依次串联级联构成;所述第i层双向长短期记忆层,通过门控机制,用于首先将数据选择性丢弃,然后将数据结合网络记忆的旧状态值进行更新,得到确定的更新值并输出至下一层;所述第i层双向长短期记忆层的遗忘门的权重为jmp_weightsf_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的遗忘门的偏置为jmp_biasf_lstm_i;,为待寻优的参数;所述第i层双向长短期记忆层的输入门的权重为jmp_weightsi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输入门的偏置为jmp_biasi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的权重为jmp_weightsc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的偏置为jmp_biasc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的权重为jmp_weightso_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的偏置为jmp_biaso_lstm_i,为待寻优的参数;所述随机失活层用于通过一定概率丢弃双向长短期记忆层的输出数据,用于避免过拟合。所述注意力层,通过赋予重要单词更大的权重以减轻步骤3中长样本序列的梯度消失而导致的上下文缺失的问题;注意力层的权重为jmp_weights_attention,为待寻优的参数;注意力层的偏置为jmp_bias_attention,为待寻优的参数;注意力层的上下文向量为jmp_u_attention,为待寻优的参数。所述批标准化层,包括全连接层、批量标准化层、归一化指数层;所述全连接层,输出尺寸为w*h,w=256,h=1的一维矩阵,用于整合注意力层的输出数据,将其映射到下一层批量标准化层的样本空间;所述全连接层的权重为jmp_weights_dense,为待寻优的参数;所述全连接层的偏置为jmp_bias_dense,为待寻优的参数。所述批量标准化层用于加速步骤2所述优化训练收敛;批量标准化层的平移参数为jmp_shift_bn,为待寻优的参数;批量标准化层的缩放参数为jmp_scale_bn,为待寻优的参数。所述归一化指数层用于将批量标准化层连续的输出特征转化为离散的预测特征;该层先对批量标准化层的输出特征做sigmoid运算,然后使用更适合衡量两个概率分布差异的交叉熵损失函数作为测量函数,对上层的学习结果进行优化,使得最终结果是针对第i个样本预测的标签jlabeli,1*、jlabeli,2*的一个概率分布,i∈[1,n],n表示深度学习训练集中样本的数量,这里是二分类问题,故标签共两类;所述神经网络间接跳转目标识别分类损失函数模型为交叉熵损失函数,具体定义为:其中,n为训练样本的总数;预测概率分布为为第i个样本的是否为正确的间接控制流的概率分布,其中标签对应的概率值为真实的标签概率分布为y(i),为步骤2所述第i个样本是否为正确的间接控制流jlabeli,1、jlabeli,2的概率分布,如果第i个样本的标签为jlabeli,j,则设其对应的概率值y(i)j概率为一,其对应的另一标签jlabeli,k(k≠j)概率值y(i)k为零;损失函数定义为:其中,交叉熵损失函数l(θ)需要计算全部训练样本的值,并求平均。神经网络的训练目标设为使预测概率分布尽可能接近真实的标签概率分布y(i),即为使得交叉熵损失函数l(θ)最小化;最终计算得到预测分类的概率;通过adam优化算法对网络参数进行寻优,得到步骤2中所述的网络寻优化参数集为:每个单词的向量表示jmp_embedding_vector_best*;对于第i层双向长短期记忆层;寻优后的权重参数分别为jmp_weightsf_lstm_best_i*、jmp_weightsi_lstm_best_i*、jmp_weightsc_lstm_best_i*、jmp_weightso_lstm_best_i*;寻优后的偏置参数分别为jmp_biasf_lstm_best_i*、jmp_biasi_lstm_best_i*、jmp_biasc_lstm_best_i*、jmp_biaso_lstm_best_i*;对于注意力层:寻优后的参数包括权重jmp_weights_attention_best*;偏置jmp_bias_attention_best*和上下文向量jmp_u_attention_best*;全连接层寻优后的权重参数jmp_weights_dense_best*;全连接层寻优后的偏置参数分别jmp_bias_dense_best*;批量标准化层寻优后的平移参数为jmp_shift_bn_best*;批量标准化层寻优后的缩放参数为jmp_scale_bn_best*;步骤2所述神经网络间接调用目标识别分类模型由嵌入层、深度双向长短期记忆网络、注意力层和批标准化层串联级联构成;所述嵌入层,该层将单词从高维稀疏的one-hot向量转化为低维密集的向量。每个单词的低维密集向量call_embedding_vector,为待寻优的参数。所述双向长短期记忆网络,由第一双向长短期记忆层、第二双向长短期记忆层、随机失活层依次串联级联构成;所述第i层双向长短期记忆层,通过门控机制,用于首先将数据选择性丢弃,然后将数据结合网络记忆的旧状态值进行更新,得到确定的更新值并输出至下一层;所述第i层双向长短期记忆层的遗忘门的权重为call_weightsf_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的遗忘门的偏置为call_biasf_lstm_i;,为待寻优的参数;所述第i层双向长短期记忆层的输入门的权重为call_weightsi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输入门的偏置为call_biasi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的权重为call_weightsc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的偏置为call_biasc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的权重为call_weightso_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的偏置为call_biaso_lstm_i,为待寻优的参数;所述随机失活层用于通过一定概率丢弃双向长短期记忆层的输出数据,用于避免过拟合。所述注意力层,通过赋予重要单词更大的权重以减轻步骤3中长样本序列的梯度消失而导致的上下文缺失的问题;注意力层的权重为call_weights_attention,为待寻优的参数;注意力层的偏置为call_bias_attention,为待寻优的参数;注意力层的上下文向量为call_u_attention,为待寻优的参数。所述批标准化层,包括全连接层、批量标准化层、归一化指数层;所述全连接层,输出尺寸为w*h,w=256,h=1的一维矩阵,用于整合注意力层的输出数据,将其映射到下一层批量标准化层的样本空间;所述全连接层的权重为call_weights_dense,为待寻优的参数;所述全连接层的偏置为call_bias_dense,为待寻优的参数。所述批量标准化层用于加速步骤3所述优化训练收敛;批量标准化层的平移参数为call_shift_bn,为待寻优的参数;批量标准化层的缩放参数为call_scale_bn,为待寻优的参数。所述归一化指数层用于将批量标准化层连续的输出特征转化为离散的预测特征;该层先对批量标准化层的输出特征做sigmoid运算,然后使用更适合衡量两个概率分布差异的交叉熵损失函数作为测量函数,对上层的学习结果进行优化,使得最终结果是针对第i个样本预测的标签clabeli,1*、clabeli,2*的一个概率分布,i∈[1,n],n表示深度学习训练集中样本的数量,这里是二分类问题,故标签共两类;所述神经网络间接跳转目标识别分类损失函数模型为交叉熵损失函数,具体定义为:其中,n为训练样本的总数;预测概率分布为为第i个样本的是否为正确的间接控制流的概率分布,其中标签对应的概率值为真实的标签概率分布为y(i),为步骤2所述第i个样本是否为正确的间接控制流clabeli,1、clabeli,2的概率分布,如果第i个样本的标签为clabeli,j,则设其对应的概率值y(i)j概率为一,其对应的另一标签clabeli,k(k≠j)概率值y(i)k为零;损失函数定义为:其中,交叉熵损失函数l(θ)需要计算全部训练样本的值,并求平均。神经网络的训练目标设为使预测概率分布尽可能接近真实的标签概率分布y(i),即为使得交叉熵损失函数l(θ)最小化;最终计算得到预测分类的概率;通过adam优化算法对网络参数进行寻优,得到步骤2中所述的网络寻优化参数集为:每个单词的向量表示call_embedding_vector_best*;对于第i层双向长短期记忆层;寻优后的权重参数分别为call_weightsf_lstm_best_i*、call_weightsi_lstm_best_i*、call_weightsc_lstm_best_i*、call_weightso_lstm_best_i*;寻优后的偏置参数分别为call_biasf_lstm_best_i*、call_biasi_lstm_best_i*、call_biasc_lstm_best_i*、call_biaso_lstm_best_i*;对于注意力层:寻优后的参数包括权重call_weights_attention_best*;偏置call_bias_attention_best*和上下文向量call_u_attention_best*;全连接层寻优后的权重参数call_weights_dense_best*;全连接层寻优后的偏置参数分别call_bias_dense_best*;批量标准化层寻优后的平移参数为call_shift_bn_best*;批量标准化层寻优后的缩放参数为call_scale_bn_best*;作为优选,步骤3所述对于待检测的二进制中指令代码块,判别是否为间接跳转指令代码块或间接调用指令代码块,具体为:若待检测的二进制中指令代码块属于间接跳转指令代码块,将间接跳转指令代码块所在函数代码块、基本块代码块、对应的跳转表通过步骤1进行预处理以得到待检测的二进制的间接跳转三元组样本,进一步通过训练后步骤2定义的神经网络间接跳转目标识别分类模型,预测得到待检测的二进制的样本标签,基于步骤1的三元组定义根据样本标签复原每个间接跳转指令代码块的目标基本块代码块,即若第i个二进制原始文件中的第k个间接跳转数据样本jdatai,k=(bi,m,e,bi,n)预测得到的样本标签为jlabeli_k,1,则bi,n为目标基本块代码块;若待检测的二进制中指令代码块属于间接调用指令代码块,将间接调用指令代码块及其所在二进制原始文件、所在函数代码块通过步骤1进行预处理以得到待检测的二进制的间接调用分支、待检测的二进制的函数序列,进一步构成步骤一所述间接调用三元组样本,进一步通过训练后步骤2定义的神经网络间接调用目标识别分类模型,预测得到待检测的二进制的样本标签,基于步骤1的三元组定义根据样本标签复原每个间接调用指令代码块的目标函数代码块,即对于第i个原始二进制文件中第k个间接调用数据样本cdatai,k=(bri,k,e,fsi,n),若预测得到其对应的样本标签为clabeli_k,1,则fsi,n对应的fi,n为目标函数代码块。本发明区别于传统的基于数据流等技术恢复间接控制流目标的方法,从间接控制流的源与目标对象之间的语义关联入手,将二进制类比于自然语言,构建了基于深度学习的二进制控制流指令目标自动识别框架。本发明中为充分保留二进制中的上下文关联信息,提出了三元组样本编码方式,基于宽度优先搜索的间接调用分支构建算法和函数序列的构建方法。本发明提出了基于中间代码的间接控制流基本信息获取方法,构建了从中间代码到二进制的映射机制。本发明通过bi-lstm attention的神经网络模型对二进制间接控制流的源与目标之间的语义关联特征进行学习,进而能够识别二进制中跳转表和函数指针的目标基本块或函数。经验证,该模型可提供较高的识别正确率。本发明不同于以往的静态分析方法,无需对二进制进行反汇编处理,在经过较少的数据预处理操作后,通过预先训练好的分类器即可复原间接控制流指令的目标对象。附图说明图1是本发明系统设计框架的设计图。图2是本发明实施例的二进制间接控制流提取模块的流程图。图3是本发明实施例构建的bi-lstm attention神经网络结构示意图。图4是本发明实施例的间接控制流指令目标分类检测模块的流程图。图5是本发明实施例提出的间接调用分支生成算法流程图。具体实施方式以下结合附图和实施例详细说明本发明技术方案。下面结合图1至图5介绍本发明的具体实施方式为:步骤1:引入原始二进制代码文件,原始二进制代码文件中多个字节构成多个指令代码块,多个指令代码块构成多个基本块代码块,多个基本块代码块构成多个函数代码块,根据基本块代码块和函数代码块构建间接调用分支和函数序列,并进一步构建间接跳转的三元组样本、间接调用的三元组样本,对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集;步骤1所述原始二进制代码文件为:texti={ci,1,ci,2,...,ci,l}i∈[1,k]其中,texti表示第i个原始二进制代码文件,k表示原始二进制代码文件的数量,l表示第i个原始二进制代码文件中字节的数量,ci,j表示第i个原始二进制代码文件中第j个字节,j∈[1,l];步骤1所述原始二进制代码文件中多个字节构成多个指令代码块具体表示为:insi,k={ci,sins_k,ci,sins_k 1,...,ci,sins_k nins_k-1}k∈[1,nins]其中,insi,k表示第i个原始二进制代码文件中第k个指令代码块,nins表示第i个原始二进制代码文件中指令代码块的数量,sins_k为第k个指令代码块起始的字节的下标,nins_k表示第k个指令代码块中字节的数量,ci,sins_k j表示第i个原始二进制代码文件中第k个指令代码块中第sins_k j 1个字节,j∈[0,nins_k-1];步骤1所述多个指令代码块构成多个基本块代码块具体表示为:bi,m={insi,sbb_m,insi,sbb_m 1,...,insi,sbb_m nbb_m-1}m∈[1,nbb]其中,bi,m表示第i个原始二进制代码文件中第m个基本块代码块,nbb表示第i个原始二进制代码文件中基本块代码块的数量,sbb_m为第m个基本块代码块起始的指令代码块的下标,nbb_m表示第m个基本块代码块中指令代码块的数量,insi,sbb_m j表示第i个原始二进制代码文件中第m个基本块代码块中第sbb_m j 1个指令代码块,j∈[0,nbb_m-1];步骤1所述多个基本块代码块构成多个函数代码块的具体表示为:fi,n={bi,sfunc_n,bi,sfunc_n 1,...,bi,sfunc_n nfunc_n-1}n∈[1,nfunc]其中,fi,n表示第i个原始二进制代码文件中第n个函数代码块,nfunc表示第i个原始二进制代码文件中函数代码块的数量,sfunc_n为第n个函数代码块起始的基本块代码块的下标,nfunc_n表示第n个函数代码块中基本块代码块的数量,bi,sfunc_n j表示第i个原始二进制代码文件中第n个函数代码块中第sfunc_n j 1个基本块代码块,j∈[0,nfunc_n-1];步骤1所述根据基本块代码块和函数代码块构建间接调用分支和函数序列为:所述间接调用分支:bri,m={bi,entry_m,e,bi,entry_m 1,...,e,bi,call_m}m∈[1,ncall]其中,bri,m为第i个原始二进制代码文件中第m个间接调用指令代码块所在的间接调用分支序列,ncall表示第i个原始二进制代码文件中间接调用指令代码块的数量,entry_m为第m个间接调用分支序列的入口基本块的下标,entry_m 1为bi,entry_m的后继基本块代码块的下标,call_m为第m个间接调用指令代码块所在基本块代码块的下标;所述函数序列:fsi,n={bi,sfunc_n,e,bi,sfunc_n 1,...,e,bi,sfunc_n nfunc_n-1}n∈[1,nfunc]其中,fsi,n为函数fi,n对应的函数序列,e为函数内部的控制流;步骤1所述进一步构建间接跳转的三元组样本为:jdatai,k=(bi,m,e,bi,n)k∈[1,ndata_jmp]其中,jdatai,k表示第i个原始二进制代码文件生成的第k个间接跳转数据样本,即第i个原始二进制代码文件中第k个跳转表对应的样本,ndata_jmp表示第i个原始二进制代码文件中间接跳转样本的数量,e表示函数代码块内部的控制流,bi,m为第k个跳转表中间接跳转指令代码块所在的基本块代码块,bi,n为第k个跳转表所在函数代码块中除bi,m的任一基本块代码块,即假设bi,m∈fi,l,则bi,n∈fi,l-{bi,m},m,n∈[1,nbb];上述jdatai,k对应的第k个跳转表的构成为:jtablei,k={bi,m:{bi,sjt_k,bi,sjt_k 1,...,bi,sjt_k njt_k-1}}其中,sjt_k为第k个跳转表起始的基本块代码块的下标,njt_k表示第k个跳转表中跳转条目的数量,bi,sjt_k j表示第i个原始二进制代码文件中第k个跳转表中第sjt_k j 1个跳转条目,j∈[0,njt_k-1];步骤1所述进一步构建间接调用的三元组样本为:cdatai,k=(bri,k,e,fsi,n)k∈[1,ndata_call]其中,cdatai,k表示第i个原始二进制代码文件生成的第k个间接调用数据样本,即第i个原始二进制代码文件中第k个间接调用指令代码块对应的样本,假设为insi,l,ndata_call表示第i个原始二进制代码文件中间接调用样本的数量,e表示函数代码块之间的控制流,bri,k为第i个原始二进制代码文件中第k个间接调用指令代码块insi,l所在的间接调用分支,基于宽度优先搜索算法构造bri,k;fsi,n为第i个原始二进制代码文件中的第n个函数fi,n对应的函数序列,fi,n为所在二进制代码内任意address-taken函数;定义ctarget(insi,l)为insi,l实际调用的函数代码块列表,即:ctarget(insi,l)={fi,ct1,fi,ct2,...,fi,ctn}其中,fi,ct1,fi,ct2,...,fi,ctn为insi,l的实际目标函数。步骤1所述对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集为:对于间接跳转的三元组样本即jdatai,k=(bi,m,e,bi,n):若bi,n∈jtablei,k[bi,m],则jdatai,k的标签标记为jlabeli_k,1,反之为jlabeli_k,0;对于间接调用的三元组样本即cdatai,k=(bri,k,e,fsi,n):若fi,n∈ctarget(insi,l),则该样本标记为clabeli_k,1,反之为clabeli_k,0。步骤1所述构建间接跳转训练集,即:jdata={(jdata1,1,jlabel1_1,k1),(jdata1,2,jlabel1_2,k2),......,(jdatak,ndata_jmp_k,jlabelk_ndata_jmp_k,knjmp)}其中,jdata为间接跳转训练集,(jdata1,1,jlabel1_1,k1)为数据集中的第一个样本,如前所述,jdata1,1为第1个原始二进制代码文件中的第1个样本,jlabel1_1,k1为jdata1,1的标签,k1的取值为0或1;(jdatai,j,jlabeli_j,km)为数据集中第m个样本,jdatai,j为第i个原始二进制代码文件中的第j个样本,jlabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,k],j∈[1,ndata_jmp_i],k为原始二进制代码文件的数量,ndata_jmp_i表示第i个二进制的间接跳转样本总个数,njmp为间接跳转训练集中的样本总数。步骤1所述构建间接调用训练集,即:cdata={(cdata1,1,clabel1_1,k1),(cdata1,2,clabel1_2,k2),......,(cdatak,ndata_call_k,clabelk_ndata_call_k,kncall)}其中,cdata为间接调用训练集,(cdata1,1,clabel1_1,k1)为数据集中的第一个样本,如前所述,cdata1,1为第1个原始二进制代码文件中的第1个样本,clabel1_1,k1为cdata1,1的标签,k1的取值为0或1;(cdatai,j,clabeli_j,km)为数据集中第m个样本,cdatai,j为第i个原始二进制代码文件中的第j个样本,clabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,k],j∈[1,ndata_call_i],k为原始二进制代码文件的数量,ndata_call_i表示第i个二进制的间接跳转样本总个数,ncall为间接跳转训练集中的样本总数。步骤2:构建神经网络间接跳转目标识别分类模型,将间接跳转训练集中每个间接跳转的三元组样本依次输入神经网络间接跳转目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接跳转样本标签和分类模型的预测标签构建神经网络间接跳转目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接跳转目标识别分类模型;构建神经网络间接调用目标识别分类模型,将间接调用训练集中每个间接调用的三元组样本依次输入神经网络间接调用目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接调用样本标签和分类模型预测的标签建神经网络间接调用目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接调用目标识别分类模型;步骤2所述神经网络间接跳转目标识别分类模型由嵌入层、深度双向长短期记忆网络、注意力层和批标准化层串联级联构成;所述嵌入层,该层将单词从高维稀疏的one-hot向量转化为低维密集的向量。每个单词的低维密集向量jmp_embedding_vector,为待寻优的参数。所述深度双向长短期记忆网络,由第一双向长短期记忆层、第二双向长短期记忆层、随机失活层依次串联级联构成;所述第i层双向长短期记忆层,通过门控机制,用于首先将数据选择性丢弃,然后将数据结合网络记忆的旧状态值进行更新,得到确定的更新值并输出至下一层;所述第i层双向长短期记忆层的遗忘门的权重为jmp_weightsf_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的遗忘门的偏置为jmp_biasf_lstm_i;,为待寻优的参数;所述第i层双向长短期记忆层的输入门的权重为jmp_weightsi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输入门的偏置为jmp_biasi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的权重为jmp_weightsc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的偏置为jmp_biasc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的权重为jmp_weightso_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的偏置为jmp_biaso_lstm_i,为待寻优的参数;所述随机失活层用于通过一定概率丢弃双向长短期记忆层的输出数据,用于避免过拟合。所述注意力层,通过赋予重要单词更大的权重以减轻步骤3中长样本序列的梯度消失而导致的上下文缺失的问题;注意力层的权重为jmp_weights_attention,为待寻优的参数;注意力层的偏置为jmp_bias_attention,为待寻优的参数;注意力层的上下文向量为jmp_u_attention,为待寻优的参数。所述批标准化层,包括全连接层、批量标准化层、归一化指数层;所述全连接层,输出尺寸为w*h,w=256,h=1的一维矩阵,用于整合注意力层的输出数据,将其映射到下一层批量标准化层的样本空间;所述全连接层的权重为jmp_weights_dense,为待寻优的参数;所述全连接层的偏置为jmp_bias_dense,为待寻优的参数。所述批量标准化层用于加速步骤2所述优化训练收敛;批量标准化层的平移参数为jmp_shift_bn,为待寻优的参数;批量标准化层的缩放参数为jmp_scale_bn,为待寻优的参数。所述归一化指数层用于将批量标准化层连续的输出特征转化为离散的预测特征;该层先对批量标准化层的输出特征做sigmoid运算,然后使用更适合衡量两个概率分布差异的交叉熵损失函数作为测量函数,对上层的学习结果进行优化,使得最终结果是针对第i个样本预测的标签jlabeli,1*、jlabeli,2*的一个概率分布,i∈[1,n],n表示深度学习训练集中样本的数量,这里是二分类问题,故标签共两类;所述神经网络间接跳转目标识别分类损失函数模型为交叉熵损失函数,具体定义为:其中,n为训练样本的总数;预测概率分布为为第i个样本的是否为正确的间接控制流的概率分布,其中标签对应的概率值为真实的标签概率分布为y(i),为步骤2所述第i个样本是否为正确的间接控制流jlabeli,1、jlabeli,2的概率分布,如果第i个样本的标签为jlabeli,j,则设其对应的概率值y(i)j概率为一,其对应的另一标签jlabeli,k(k≠j)概率值y(i)k为零;损失函数定义为:其中,交叉熵损失函数l(θ)需要计算全部训练样本的值,并求平均。神经网络的训练目标设为使预测概率分布尽可能接近真实的标签概率分布y(i),即为使得交叉熵损失函数l(θ)最小化;最终计算得到预测分类的概率;通过adam优化算法对网络参数进行寻优,得到步骤2中所述的网络寻优化参数集为:每个单词的向量表示jmp_embedding_vector_best*;对于第i层双向长短期记忆层;寻优后的权重参数分别为jmp_weightsf_lstm_best_i*、jmp_weightsi_lstm_best_i*、jmp_weightsc_lstm_best_i*、jmp_weightso_lstm_best_i*;寻优后的偏置参数分别为jmp_biasf_lstm_best_i*、jmp_biasi_lstm_best_i*、jmp_biasc_lstm_best_i*、jmp_biaso_lstm_best_i*;对于注意力层:寻优后的参数包括权重jmp_weights_attention_best*;偏置jmp_bias_attention_best*和上下文向量jmp_u_attention_best*;全连接层寻优后的权重参数jmp_weights_dense_best*;全连接层寻优后的偏置参数分别jmp_bias_dense_best*;批量标准化层寻优后的平移参数为jmp_shift_bn_best*;批量标准化层寻优后的缩放参数为jmp_scale_bn_best*;步骤2所述神经网络间接调用目标识别分类模型由嵌入层、深度双向长短期记忆网络、注意力层和批标准化层串联级联构成;所述嵌入层,该层将单词从高维稀疏的one-hot向量转化为低维密集的向量。每个单词的低维密集向量call_embedding_vector,为待寻优的参数。所述双向长短期记忆网络,由第一双向长短期记忆层、第二双向长短期记忆层、随机失活层依次串联级联构成;所述第i层双向长短期记忆层,通过门控机制,用于首先将数据选择性丢弃,然后将数据结合网络记忆的旧状态值进行更新,得到确定的更新值并输出至下一层;所述第i层双向长短期记忆层的遗忘门的权重为call_weightsf_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的遗忘门的偏置为call_biasf_lstm_i;,为待寻优的参数;所述第i层双向长短期记忆层的输入门的权重为call_weightsi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输入门的偏置为call_biasi_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的权重为call_weightsc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的输出门的偏置为call_biasc_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的权重为call_weightso_lstm_i,为待寻优的参数;所述第i层双向长短期记忆层的计算单元状态的偏置为call_biaso_lstm_i,为待寻优的参数;所述随机失活层用于通过一定概率丢弃双向长短期记忆层的输出数据,用于避免过拟合。所述注意力层,通过赋予重要单词更大的权重以减轻步骤3中长样本序列的梯度消失而导致的上下文缺失的问题;注意力层的权重为call_weights_attention,为待寻优的参数;注意力层的偏置为call_bias_attention,为待寻优的参数;注意力层的上下文向量为call_u_attention,为待寻优的参数。所述批标准化层,包括全连接层、批量标准化层、归一化指数层;所述全连接层,输出尺寸为w*h,w=256,h=1的一维矩阵,用于整合注意力层的输出数据,将其映射到下一层批量标准化层的样本空间;所述全连接层的权重为call_weights_dense,为待寻优的参数;所述全连接层的偏置为call_bias_dense,为待寻优的参数。所述批量标准化层用于加速步骤3所述优化训练收敛;批量标准化层的平移参数为call_shift_bn,为待寻优的参数;批量标准化层的缩放参数为call_scale_bn,为待寻优的参数。所述归一化指数层用于将批量标准化层连续的输出特征转化为离散的预测特征;该层先对批量标准化层的输出特征做sigmoid运算,然后使用更适合衡量两个概率分布差异的交叉熵损失函数作为测量函数,对上层的学习结果进行优化,使得最终结果是针对第i个样本预测的标签clabeli,1*、clabeli,2*的一个概率分布,i∈[1,n],n表示深度学习训练集中样本的数量,这里是二分类问题,故标签共两类;所述神经网络间接跳转目标识别分类损失函数模型为交叉熵损失函数,具体定义为:其中,n为训练样本的总数;预测概率分布为为第i个样本的是否为正确的间接控制流的概率分布,其中标签对应的概率值为真实的标签概率分布为y(i),为步骤2所述第i个样本是否为正确的间接控制流clabeli,1、clabeli,2的概率分布,如果第i个样本的标签为clabeli,j,则设其对应的概率值y(i)j概率为一,其对应的另一标签clabeli,k(k≠j)概率值y(i)k为零;损失函数定义为:其中,交叉熵损失函数l(θ)需要计算全部训练样本的值,并求平均。神经网络的训练目标设为使预测概率分布尽可能接近真实的标签概率分布y(i),即为使得交叉熵损失函数l(θ)最小化;最终计算得到预测分类的概率;通过adam优化算法对网络参数进行寻优,得到步骤2中所述的网络寻优化参数集为:每个单词的向量表示call_embedding_vector_best*;对于第i层双向长短期记忆层;寻优后的权重参数分别为call_weightsf_lstm_best_i*、call_weightsi_lstm_best_i*、call_weightsc_lstm_best_i*、call_weightso_lstm_best_i*;寻优后的偏置参数分别为call_biasf_lstm_best_i*、call_biasi_lstm_best_i*、call_biasc_lstm_best_i*、call_biaso_lstm_best_i*;对于注意力层:寻优后的参数包括权重call_weights_attention_best*;偏置call_bias_attention_best*和上下文向量call_u_attention_best*;全连接层寻优后的权重参数call_weights_dense_best*;全连接层寻优后的偏置参数分别call_bias_dense_best*;批量标准化层寻优后的平移参数为call_shift_bn_best*;批量标准化层寻优后的缩放参数为call_scale_bn_best*;综上,待测数据集以三维矩阵的形式进行输入,其中一维代表最长样本序列的长度,二维代表待测样本序列的总个数,三维代表词典维度,本发明中为258。每个样本先后经过一个嵌入层、两个双向长短期记忆层。得到的结果经过随机失活层后再输入注意力层。注意力层的输出交由全连接层、批量标准化层处理。最后的输出通过sigmoid得到该样本是正常间接控制流的可能性概率。步骤3:将待检测的二进制文件通过步骤1提取待检测的二进制中指令代码块、待检测的二进制中基本块代码块、待检测的二进制中函数代码块,对于待检测的二进制中指令代码块,判别是否为间接跳转指令代码块或间接调用指令代码块;若待检测的二进制中指令代码块属于间接跳转指令代码块,将间接跳转指令代码块所在函数代码块、基本块代码块、对应的跳转表通过步骤1进行预处理以得到待检测的二进制的间接跳转三元组样本,进一步通过训练后步骤2定义的神经网络间接跳转目标识别分类模型,预测得到待检测的二进制的样本标签,基于步骤1的三元组定义根据样本标签复原每个间接跳转指令代码块的目标基本块代码块,即若第i个二进制原始文件中的第k个间接跳转数据样本jdatai,k=(bi,m,e,bi,n)预测得到的样本标签为jlabeli_k,1,则bi,n为目标基本块代码块;若待检测的二进制中指令代码块属于间接调用指令代码块,将间接调用指令代码块及其所在二进制原始文件、所在函数代码块通过步骤1进行预处理以得到待检测的二进制的间接调用分支、待检测的二进制的函数序列,进一步构成步骤一所述间接调用三元组样本,进一步通过训练后步骤2定义的神经网络间接调用目标识别分类模型,预测得到待检测的二进制的样本标签,基于步骤1的三元组定义根据样本标签复原每个间接调用指令代码块的目标函数代码块,即对于第i个原始二进制文件中第k个间接调用数据样本cdatai,k=(bri,k,e,fsi,n),若预测得到其对应的样本标签为clabeli_k,1,则fsi,n对应的fi,n为目标函数代码块。本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属
技术领域:
:的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。当前第1页1 2 3 当前第1页1 2 3 
技术特征:1.一种基于深度学习的无符号二进制间接控制流识别方法,其特征在于,包括以下步骤:
步骤1:引入原始二进制代码文件,原始二进制代码文件中多个字节构成多个指令代码块,多个指令代码块构成多个基本块代码块,多个基本块代码块构成多个函数代码块,根据基本块代码块和函数代码块构建间接调用分支和函数序列,并进一步构建间接跳转的三元组样本、间接调用的三元组样本,对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集;
步骤2:构建神经网络间接跳转目标识别分类模型,将间接跳转训练集中每个间接跳转的三元组样本依次输入神经网络间接跳转目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接跳转样本标签和分类模型的预测标签构建神经网络间接跳转目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接跳转目标识别分类模型;构建神经网络间接调用目标识别分类模型,将间接调用训练集中每个间接调用的三元组样本依次输入神经网络间接调用目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接调用样本标签和分类模型预测的标签建神经网络间接调用目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接调用目标识别分类模型;
步骤3:将待检测的二进制文件通过步骤1提取待检测的二进制中指令代码块、待检测的二进制中基本块代码块、待检测的二进制中函数代码块,对于待检测的二进制中指令代码块,判别是否为间接跳转指令代码块或间接调用指令代码块。
2.根据权利要求1所述的基于深度学习的无符号二进制间接控制流识别方法,其特征在于,
步骤1所述原始二进制代码文件为:
texti={ci,1,ci,2,...,ci,l}
i∈[1,k]
其中,texti表示第i个原始二进制代码文件,k表示原始二进制代码文件的数量,l表示第i个原始二进制代码文件中字节的数量,ci,j表示第i个原始二进制代码文件中第j个字节,j∈[1,l];
步骤1所述原始二进制代码文件中多个字节构成多个指令代码块具体表示为:
insi,k={ci,sins_k,ci,sins_k 1,...,ci,sins_k nins_k-1}
k∈[1,nins]
其中,insi,k表示第i个原始二进制代码文件中第k个指令代码块,nins表示第i个原始二进制代码文件中指令代码块的数量,sins_k为第k个指令代码块起始的字节的下标,nins_k表示第k个指令代码块中字节的数量,ci,sins_k j表示第i个原始二进制代码文件中第k个指令代码块中第sins_k j 1个字节,j∈[0,nins_k-1];
步骤1所述多个指令代码块构成多个基本块代码块具体表示为:
bi,m={insi,sbb_m,insi,sbb_m 1,...,insi,sbb_m nbb_m-1}
m∈[1,nbb]
其中,bi,m表示第i个原始二进制代码文件中第m个基本块代码块,nbb表示第i个原始二进制代码文件中基本块代码块的数量,sbb_m为第m个基本块代码块起始的指令代码块的下标,nbb_m表示第m个基本块代码块中指令代码块的数量,insi,sbb_m j表示第i个原始二进制代码文件中第m个基本块代码块中第sbb_m j 1个指令代码块,j∈[0,nbb_m-1];
步骤1所述多个基本块代码块构成多个函数代码块的具体表示为:
fi,n={bi,sfunc_n,bi,sfunc_n 1,...,bi,sfunc_n nfunc_n-1}
n∈[1,nfunc]
其中,fi,n表示第i个原始二进制代码文件中第n个函数代码块,nfunc表示第i个原始二进制代码文件中函数代码块的数量,sfunc_n为第n个函数代码块起始的基本块代码块的下标,nfunc_n表示第n个函数代码块中基本块代码块的数量,bi,sfunc_n j表示第i个原始二进制代码文件中第n个函数代码块中第sfunc_n j 1个基本块代码块,j∈[0,nfunc_n-1];
步骤1所述根据基本块代码块和函数代码块构建间接调用分支和函数序列为:
所述间接调用分支:
bri,m={bi,entry_m,e,bi,entry_m 1,...,e,bi,call_m}
m∈[1,ncall]
其中,bri,m为第i个原始二进制代码文件中第m个间接调用指令代码块所在的间接调用分支序列,ncall表示第i个原始二进制代码文件中间接调用指令代码块的数量,entry_m为第m个间接调用分支序列的入口基本块的下标,entry_m 1为bi,entry_m的后继基本块代码块的下标,call_m为第m个间接调用指令代码块所在基本块代码块的下标;
所述函数序列:
fsi,n={bi,sfunc_n,e,bi,sfunc_n 1,...,e,bi,sfunc_n nfunc_n-1}
n∈[1,nfunc]
其中,fsi,n为函数fi,n对应的函数序列,e为函数内部的控制流;
步骤1所述进一步构建间接跳转的三元组样本为:
jdatai,k=(bi,m,e,bi,n)
k∈[1,ndata_jmp]
其中,jdatai,k表示第i个原始二进制代码文件生成的第k个间接跳转数据样本,即第i个原始二进制代码文件中第k个跳转表对应的样本,ndata_jmp表示第i个原始二进制代码文件中间接跳转样本的数量,e表示函数代码块内部的控制流,bi,m为第k个跳转表中间接跳转指令代码块所在的基本块代码块,bi,n为第k个跳转表所在函数代码块中除bi,m的任一基本块代码块,即假设bi,m∈fi,l,则bi,n∈fi,l-{bi,m},m,n∈[1,nbb];
上述jdatai,k对应的第k个跳转表的构成为:
jtablei,k={bi,m:{bi,sjt_k,bi,sjt_k 1,...,bi,sjt_k njt_k-1}}
其中,sjt_k为第k个跳转表起始的基本块代码块的下标,njt_k表示第k个跳转表中跳转条目的数量,bi,sjt_k j表示第i个原始二进制代码文件中第k个跳转表中第sjt_k j 1个跳转条目,j∈[0,njt_k-1];
步骤1所述进一步构建间接调用的三元组样本为:
cdatai,k=(bri,k,e,fsi,n)
k∈[1,ndata_call]
其中,cdatai,k表示第i个原始二进制代码文件生成的第k个间接调用数据样本,即第i个原始二进制代码文件中第k个间接调用指令代码块对应的样本,假设为insi,l,ndata_call表示第i个原始二进制代码文件中间接调用样本的数量,e表示函数代码块之间的控制流,bri,k为第i个原始二进制代码文件中第k个间接调用指令代码块insi,l所在的间接调用分支,基于宽度优先搜索算法构造bri,k;fsi,n为第i个原始二进制代码文件中的第n个函数fi,n对应的函数序列,fi,n为所在二进制代码内任意address-taken函数;
定义ctarget(insi,l)为insi,l实际调用的函数代码块列表,即:
ctarget(insi,l)={fi,ct1,fi,ct2,...,fi,ctn}
其中,fi,ct1,fi,ct2,...,fi,ctn为insi,l的实际目标函数;
步骤1所述对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集为:
对于间接跳转的三元组样本即jdatai,k=(bi,m,e,bi,n):
若bi,n∈jtablei,k[bi,m],则jdatai,k的标签标记为jlabeli_k,1,反之为jlabeli_k,0;
对于间接调用的三元组样本即cdatai,k=(bri,k,e,fsi,n):
若fi,n∈ctarget(insi,l),则该样本标记为clabeli_k,1,反之为clabeli_k,0;
步骤1所述构建间接跳转训练集,即:
jdata={(jdata1,1,jlabel1_1,k1),(jdata1,2,jlabel1_2,k2),......,(jdatak,ndata_jmp_k,jlabelk_ndata_jmp_k,knjmp)}
其中,jdata为间接跳转训练集,(jdata1,1,jlabel1_1,k1)为数据集中的第一个样本,如前所述,jdata1,1为第1个原始二进制代码文件中的第1个样本,jlabel1_1,k1为jdata1,1的标签,k1的取值为0或1;(jdatai,j,jlabeli_j,km)为数据集中第m个样本,jdatai,j为第i个原始二进制代码文件中的第j个样本,jlabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,k],j∈[1,ndata_jmp_i],k为原始二进制代码文件的数量,ndata_jmp_i表示第i个二进制的间接跳转样本总个数,njmp为间接跳转训练集中的样本总数;
步骤1所述构建间接调用训练集,即:
cdata={(cdata1,1,clabel1_1,k1),(cdata1,2,clabel1_2,k2),......,(cdatak,ndata_call_k,clabelk_ndata_call_k,kncall)}
其中,cdata为间接调用训练集,(cdata1,1,clabel1_1,k1)为数据集中的第一个样本,如前所述,cdata1,1为第1个原始二进制代码文件中的第1个样本,clabel1_1,k1为cdata1,1的标签,k1的取值为0或1;(cdatai,j,clabeli_j,km)为数据集中第m个样本,cdatai,j为第i个原始二进制代码文件中的第j个样本,clabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,k],j∈[1,ndata_call_i],k为原始二进制代码文件的数量,ndata_call_i表示第i个二进制的间接跳转样本总个数,ncall为间接跳转训练集中的样本总数。
3.根据权利要求1所述的基于深度学习的无符号二进制间接控制流识别方法,其特征在于,
步骤2所述神经网络间接跳转目标识别分类模型由嵌入层、深度双向长短期记忆网络、注意力层和批标准化层串联级联构成;
所述嵌入层,该层将单词从高维稀疏的one-hot向量转化为低维密集的向量;
每个单词的低维密集向量jmp_embedding_vector,为待寻优的参数;
所述深度双向长短期记忆网络,由第一双向长短期记忆层、第二双向长短期记忆层、随机失活层依次串联级联构成;
所述第i层双向长短期记忆层,通过门控机制,用于首先将数据选择性丢弃,然后将数据结合网络记忆的旧状态值进行更新,得到确定的更新值并输出至下一层;
所述第i层双向长短期记忆层的遗忘门的权重为jmp_weightsf_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的遗忘门的偏置为jmp_biasf_lstm_i;,为待寻优的参数;
所述第i层双向长短期记忆层的输入门的权重为jmp_weightsi_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的输入门的偏置为jmp_biasi_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的输出门的权重为jmp_weightsc_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的输出门的偏置为jmp_biasc_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的计算单元状态的权重为jmp_weightso_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的计算单元状态的偏置为jmp_biaso_lstm_i,为待寻优的参数;
所述随机失活层用于通过一定概率丢弃双向长短期记忆层的输出数据,用于避免过拟合;
所述注意力层,通过赋予重要单词更大的权重以减轻步骤3中长样本序列的梯度消失而导致的上下文缺失的问题;
注意力层的权重为jmp_weights_attention,为待寻优的参数;
注意力层的偏置为jmp_bias_attention,为待寻优的参数;
注意力层的上下文向量为jmp_u_attention,为待寻优的参数;
所述批标准化层,包括全连接层、批量标准化层、归一化指数层;
所述全连接层,输出尺寸为w*h,w=256,h=1的一维矩阵,用于整合注意力层的输出数据,将其映射到下一层批量标准化层的样本空间;
所述全连接层的权重为jmp_weights_dense,为待寻优的参数;
所述全连接层的偏置为jmp_bias_dense,为待寻优的参数;
所述批量标准化层用于加速步骤2所述优化训练收敛;
批量标准化层的平移参数为jmp_shift_bn,为待寻优的参数;
批量标准化层的缩放参数为jmp_scale_bn,为待寻优的参数;
所述归一化指数层用于将批量标准化层连续的输出特征转化为离散的预测特征;该层先对批量标准化层的输出特征做sigmoid运算,然后使用更适合衡量两个概率分布差异的交叉熵损失函数作为测量函数,对上层的学习结果进行优化,使得最终结果是针对第i个样本预测的标签jlabeli,1*、jlabeli,2*的一个概率分布,i∈[1,n],n表示深度学习训练集中样本的数量,这里是二分类问题,故标签共两类;
所述神经网络间接跳转目标识别分类损失函数模型为交叉熵损失函数,具体定义为:
其中,n为训练样本的总数;预测概率分布为为第i个样本的是否为正确的间接控制流的概率分布,其中标签对应的概率值为真实的标签概率分布为y(i),为步骤2所述第i个样本是否为正确的间接控制流jlabeli,1、jlabeli,2的概率分布,如果第i个样本的标签为jlabeli,j,则设其对应的概率值y(i)j概率为一,其对应的另一标签jlabeli,k(k≠j)概率值y(i)k为零;
损失函数定义为:
其中,交叉熵损失函数l(θ)需要计算全部训练样本的值,并求平均;神经网络的训练目标设为使预测概率分布尽可能接近真实的标签概率分布y(i),即为使得交叉熵损失函数l(θ)最小化;最终计算得到预测分类的概率;
通过adam优化算法对网络参数进行寻优,得到步骤2中所述的网络寻优化参数集为:
每个单词的向量表示jmp_embedding_vector_best*;
对于第i层双向长短期记忆层;
寻优后的权重参数分别为jmp_weightsf_lstm_best_i*、jmp_weightsi_lstm_best_i*、jmp_weightsc_lstm_best_i*、jmp_weightso_lstm_best_i*;
寻优后的偏置参数分别为jmp_biasf_lstm_best_i*、jmp_biasi_lstm_best_i*、jmp_biasc_lstm_best_i*、jmp_biaso_lstm_best_i*;
对于注意力层:
寻优后的参数包括权重jmp_weights_attention_best*;偏置jmp_bias_attention_best*和上下文向量jmp_u_attention_best*;
全连接层寻优后的权重参数jmp_weights_dense_best*;
全连接层寻优后的偏置参数分别jmp_bias_dense_best*;
批量标准化层寻优后的平移参数为jmp_shift_bn_best*;
批量标准化层寻优后的缩放参数为jmp_scale_bn_best*;
步骤2所述神经网络间接调用目标识别分类模型由嵌入层、深度双向长短期记忆网络、注意力层和批标准化层串联级联构成;
所述嵌入层,该层将单词从高维稀疏的one-hot向量转化为低维密集的向量;每个单词的低维密集向量call_embedding_vector,为待寻优的参数;
所述双向长短期记忆网络,由第一双向长短期记忆层、第二双向长短期记忆层、随机失活层依次串联级联构成;
所述第i层双向长短期记忆层,通过门控机制,用于首先将数据选择性丢弃,然后将数据结合网络记忆的旧状态值进行更新,得到确定的更新值并输出至下一层;
所述第i层双向长短期记忆层的遗忘门的权重为call_weightsf_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的遗忘门的偏置为call_biasf_lstm_i;,为待寻优的参数;
所述第i层双向长短期记忆层的输入门的权重为call_weightsi_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的输入门的偏置为call_biasi_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的输出门的权重为call_weightsc_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的输出门的偏置为call_biasc_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的计算单元状态的权重为call_weightso_lstm_i,为待寻优的参数;
所述第i层双向长短期记忆层的计算单元状态的偏置为call_biaso_lstm_i,为待寻优的参数;
所述随机失活层用于通过一定概率丢弃双向长短期记忆层的输出数据,用于避免过拟合;
所述注意力层,通过赋予重要单词更大的权重以减轻步骤3中长样本序列的梯度消失而导致的上下文缺失的问题;
注意力层的权重为call_weights_attention,为待寻优的参数;
注意力层的偏置为call_bias_attention,为待寻优的参数;
注意力层的上下文向量为call_u_attention,为待寻优的参数;
所述批标准化层,包括全连接层、批量标准化层、归一化指数层;
所述全连接层,输出尺寸为w*h,w=256,h=1的一维矩阵,用于整合注意力层的输出数据,将其映射到下一层批量标准化层的样本空间;
所述全连接层的权重为call_weights_dense,为待寻优的参数;
所述全连接层的偏置为call_bias_dense,为待寻优的参数;
所述批量标准化层用于加速步骤3所述优化训练收敛;
批量标准化层的平移参数为call_shift_bn,为待寻优的参数;
批量标准化层的缩放参数为call_scale_bn,为待寻优的参数;
所述归一化指数层用于将批量标准化层连续的输出特征转化为离散的预测特征;该层先对批量标准化层的输出特征做sigmoid运算,然后使用更适合衡量两个概率分布差异的交叉熵损失函数作为测量函数,对上层的学习结果进行优化,使得最终结果是针对第i个样本预测的标签clabeli,1*、clabeli,2*的一个概率分布,i∈[1,n],n表示深度学习训练集中样本的数量,这里是二分类问题,故标签共两类;
所述神经网络间接跳转目标识别分类损失函数模型为交叉熵损失函数,具体定义为:
其中,n为训练样本的总数;预测概率分布为为第i个样本的是否为正确的间接控制流的概率分布,其中标签对应的概率值为真实的标签概率分布为y(i),为步骤2所述第i个样本是否为正确的间接控制流clabeli,1、clabeli,2的概率分布,如果第i个样本的标签为clabeli,j,则设其对应的概率值y(i)j概率为一,其对应的另一标签clabeli,k(k≠j)概率值y(i)k为零;
损失函数定义为:
其中,交叉熵损失函数l(θ)需要计算全部训练样本的值,并求平均;神经网络的训练目标设为使预测概率分布尽可能接近真实的标签概率分布y(i),即为使得交叉熵损失函数l(θ)最小化;最终计算得到预测分类的概率;
通过adam优化算法对网络参数进行寻优,得到步骤2中所述的网络寻优化参数集为:
每个单词的向量表示call_embedding_vector_best*;
对于第i层双向长短期记忆层;
寻优后的权重参数分别为call_weightsf_lstm_best_i*、
call_weightsi_lstm_best_i*、call_weightsc_lstm_best_i*、
call_weightso_lstm_best_i*;
寻优后的偏置参数分别为call_biasf_lstm_best_i*、call_biasi_lstm_best_i*、call_biasc_lstm_best_i*、call_biaso_lstm_best_i*;
对于注意力层:
寻优后的参数包括权重call_weights_attention_best*;偏置call_bias_attention_best*和上下文向量call_u_attention_best*;
全连接层寻优后的权重参数call_weights_dense_best*;
全连接层寻优后的偏置参数分别call_bias_dense_best*;
批量标准化层寻优后的平移参数为call_shift_bn_best*;
批量标准化层寻优后的缩放参数为call_scale_bn_best*。
4.根据权利要求1所述的基于深度学习的无符号二进制间接控制流识别方法,其特征在于,
步骤3所述对于待检测的二进制中指令代码块,判别是否为间接跳转指令代码块或间接调用指令代码块,具体为:
若待检测的二进制中指令代码块属于间接跳转指令代码块,将间接跳转指令代码块所在函数代码块、基本块代码块、对应的跳转表通过步骤1进行预处理以得到待检测的二进制的间接跳转三元组样本,进一步通过训练后步骤2定义的神经网络间接跳转目标识别分类模型,预测得到待检测的二进制的样本标签,基于步骤1的三元组定义根据样本标签复原每个间接跳转指令代码块的目标基本块代码块,即若第i个二进制原始文件中的第k个间接跳转数据样本jdatai,k=(bi,m,e,bi,n)预测得到的样本标签为jlabeli_k,1,则bi,n为目标基本块代码块;
若待检测的二进制中指令代码块属于间接调用指令代码块,将间接调用指令代码块及其所在二进制原始文件、所在函数代码块通过步骤1进行预处理以得到待检测的二进制的间接调用分支、待检测的二进制的函数序列,进一步构成步骤一所述间接调用三元组样本,进一步通过训练后步骤2定义的神经网络间接调用目标识别分类模型,预测得到待检测的二进制的样本标签,基于步骤1的三元组定义根据样本标签复原每个间接调用指令代码块的目标函数代码块,即对于第i个原始二进制文件中第k个间接调用数据样本cdatai,k=(bri,k,e,fsi,n),若预测得到其对应的样本标签为clabeli_k,1,则fsi,n对应的fi,n为目标函数代码块。
技术总结本发明涉及一种基于深度学习的无符号二进制间接控制流识别方法,通过深度学习识别二进制中间接跳转指令的目标基本块。本发明基于二进制代码文件中的指令、基本块和函数代码块,构建间接调用分支和函数序列,以构建间接跳转及间接调用的三元组样本,生成间接跳转训练集、间接调用训练集;分别构建神经网络间接跳转和间接调用目标识别分类模型,分别构建神经网络间接跳转和间接调用目标识别分类损失函数模型;将待检测的二进制文件通过预处理,针对间接跳转和间接调用指令生成间接跳转和间接调用样本,通过神经网络间接跳转和间接调用目标识别分类损失函数模型进行目标识别,通过分类结果复原间接控制流目标。本发明提高了识别的正确率。
技术研发人员:王鹃;王蕴茹;杨梦达;王杰;钟璟
受保护的技术使用者:武汉大学
技术研发日:2021.04.02
技术公布日:2021.08.03