一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

软件基因视角下多粒度信息融合的二进制代码溯源方法与流程

2021-10-24 05:44:00 来源:中国专利 TAG:
1.本发明属于网络安全
技术领域
:,尤其涉及一种软件基因视角下多粒度信息融合的二进制代码溯源方法。
背景技术
::2.二进制代码溯源是指通过二进制代码作者相关的特征找出潜藏在幕后的作者或团队,通过自动化手段来代替易错且费时的手工逆向工程任务。“恶意代码的背后究竟是谁?”,现今安全社区一个非常重要的问题就是代码的追踪溯源问题。通过找到恶意代码的来源,并且与先前已知威胁相关联,从而更好的进行防御,并开发技术来应对未来可能面临的危险。随着越来越多的恶意代码以及经过改变之后的恶意代码数量急剧增加。恶意软件的组织和作者正在创造大量的恶意软件变种。虽然已经做出了大量的努力来开发源代码的方法。另外还有不乏还有使用诸如间距和变量名之类的特征来反应源代码的特征。但是这些技术通常依赖于编译过程之后可能丢失的信息如变量、函数重命名、注释、代码组织、开发环境、编程语言、文件编辑器等等信息。并且在现实世界中,如商业软件和恶意软件分析,很难找到其源代码,这就意味着这些特征必须基于二进制文件来进行提取,而这也意味着大多数源代码的工作在这里并不适用。另一方面,程序二进制文件没有保留源代码中的特征,这些特征在编译过程中被剥离掉,但一些论文表明,二进制文件还是有非常丰富的特征,并且通过二进制文件来进行提取特征并且分析是可行的。然而现在的二进制级别的文件不一定是由单独一个作者编写而成,而有可能是某个团队、组织、国家机构。因为现在软件包括恶意软件,往往都是团队努力的成果,恶意软件开发已经变得与普通软件开发比较类似,从一个黑客攻击变为多个程序员之间的合作关系。3.最先研究此类问题的是rosenblum(n.rosenblum,x.zhu,andb.p.miller,“whowrotethiscode?identifyingtheauthorsofprogrambinaries,”p.17.),他通过监督式机器学习方法,把指令序列、各种调用图、调用序列、n‑gram作为特征最后用svm进行训练,这些特征只是简单的进行堆叠而并没用将其进行信息融合;之后的alrabaee(s.alrabaee,“oba2:anonionapproachtobinarycodeauthorshipattribution,”digitalinvestigation,p.10,2014.)(s.alrabaee,“bingold:towardsrobustbinaryanalysisbyextractingthesemanticsofbinarycodeassemanticflowgraphs(sfgs),”digitalinvestigation,p.12,2016.)通过增加了寄存器流图和通过语义流图方法来溯源,而meng(x.meng,b.p.miller,andk.‑s.jun,“identifyingmultipleauthorsinabinaryprogram,”incomputersecurity–esorics2017,vol.10493,s.n.foley,d.gollmann,ande.snekkenes,eds.cham:springerinternationalpublishing,2017,pp.286–304.)则是从基本块级别来识别多个作者,使用有监督机器学习技术(线性条件随机场crf);2018年caliskan(a.caliskanetal.,“whencodingstylesurvivescompilation:de‑anonymizingprogrammersfromexecutablebinaries,”presentedatthenetworkanddistributedsystemsecuritysymposium,sandiego,ca,2018,doi:10.14722/ndss.2018.23304.)通过将二进制文件进行反汇编以及反编译获得更多的特征,最后用随机森林进行分类。但这些方法都没有从多层次多粒度的角度去分析,在人数增多的情况下准确率明显下降。本发明通过使用新的特征提取方法来提取特征从而使用基于深度学习模型进行多粒度下的二进制代码分析,以此达到比较高的溯源准确率。4.虽然最近工作发现源代码可以实现高精度溯源,而二进制文件溯源则相对具有挑战性。但若从恶意代码角度出发,我们很难获得其源代码。我们发现最近的一些研究利用了序列以及图结构的信息,但仅仅只是将其分开利用并没有融合利用,也并没有从多粒度多层级的进行语义提取,造成二进制代码语义信息丢失。技术实现要素:5.本发明针对从恶意代码角度出发很难获得其源代码,且现有二进制代码溯源方法造成二进制代码语义信息丢失的问题,提出一种软件基因视角下多粒度信息融合的二进制代码溯源方法。6.为了实现上述目的,本发明采用以下技术方案:7.一种软件基因视角下多粒度信息融合的二进制代码溯源方法,包括:8.步骤1:提取目标程序的软件基因序列、软件基因、软件基因图及从ida直接可提取的常用信息至sqlite数据库;9.步骤2:将sqlite数据库中的软件基因序列使用词嵌入之后再进行双向gru模型的训练,得到特征向量;10.步骤3:基于步骤2训练后得到的特征向量及sqlite数据库中的信息进行多粒度序列信息融合,得到包含多粒度信息的特征向量,然后通过图卷积进行结构化学习;11.步骤4:通过全连接层将学习到的隐层空间特征向量表示映射到样本标记空间,作为判决的投票值,最终得出分类结果。12.进一步地,所述从ida直接可提取的常用信息包括:通过ida提取的正常指令序列、基本块、以及控制流图cfg和程序调用图cg的信息。13.进一步地,所述提取目标程序的软件基因序列、软件基因、软件基因图包括:14.在提取二进制控制流语义的开始对二进制代码进行软件基因序列程序切分,并将其一维二进制代码序列根据控制流关系转化为软件基因图。15.进一步地,所述软件基因序列程序切分包括:16.将分支指令作为软件基因的划分边界,并记录切分、调用、回调关系以构成流路并最终生成软件基因图。17.进一步地,所述步骤2中词嵌入过程包括:18.首先将单词转成字典的形式,直接建立词典索引结构,使用一句话看成一个单词的形式,然后再以句子为列,为每个句子建立索引结果,接下来进行padding操作,然后再进行词的初始化。19.进一步地,所述步骤3中,多粒度序列信息融合过程包括:20.通过字典的最大长度进行从下标1开始的遍历,通过字典中的键值对查找到软件基因所对应的向量维度,然后通过搜索函数在序列向量中找到所对应的向量维度,并且通过向量叠加的方式将其信息进行融合,最后通过拼接将提取出来的各个向量整合在一起,得到包含多粒度信息的特征向量。21.与现有技术相比,本发明具有的有益效果:22.本发明从二进制文件中使用切片算法得到软件基因序列(sgs)、以及软件基因(sg)、软件基因图(sgg),将其作为特征用于深度学习模型训练上,通过粒度的分析,将序列与图之间的信息进行融合,软件基因序列的信息在一直执行块中进行体现和利用,而软件基因的信息则在软件基因图中可以体现,充分利用了上下文和结构化的信息,使得sgs、sg、sgg的信息充分的得以保留避免信息丢失,最后通过序列学习以及图卷积学习可以在恶意代码数据集上取得非常良好的效果;23.本发明从二进制逆向工程实战角度出发,提出了软件基因序列、软件基因以及软件基因图的概念并将其使用于具体任务,二进制代码溯源准确率提升明显;基于rnn和gcn的基础上提出了多层信息融合模型,从多个不同粒度下进行模型创新并且效果提升显著,具有鲁棒性;将二进制代码作者识别追踪溯源问题运用到了恶意代码家族分类问题上,并通过极少样本数量即可取得非常好的效果,具有现实意义。附图说明24.图1为本发明实施例一种软件基因视角下多粒度信息融合的二进制代码溯源方法的流程图;25.图2为软件基因与编译原理以及idapro定义基本块之间的差别示例图;26.图3为反汇编代码段、软件基因、软件基因图示例图;27.图4为本发明实施例一种软件基因视角下多粒度信息融合的二进制代码溯源方法的词嵌入示例图;28.图5为本发明实施例一种软件基因视角下多粒度信息融合的二进制代码溯源方法的双向gru模型示意图;29.图6为本发明实施例一种软件基因视角下多粒度信息融合的二进制代码溯源方法的图卷积学习流程图;30.图7为不同方法在gcj数据集上的溯源准确率对比图;31.图8为不同方法在gcj数据集上的召回率对比图;32.图9为不同模型的组合的准确率实验结果图;33.图10为不同模型组合与caliskan、rosenblum之间的准确率对比图;34.图11为相同模型不同特征与caliskan的准确率对比图;35.图12为针对相同架构及编译器下不同优化选项的溯源准确率对比图;36.图13为针对相同架构相同优化选项不同编译器的溯源准确率对比图;37.图14为本发明方法在恶意软件家族数据集上的实验结果图。具体实施方式38.下面结合附图和具体的实施例对本发明做进一步的解释说明:39.如图1所示,一种软件基因视角下多粒度信息融合的二进制代码溯源方法,包括:40.步骤1:提取目标程序的软件基因序列、软件基因、软件基因图及从ida直接可提取的常用信息至sqlite数据库;41.进一步地,所述从ida直接可提取的常用信息包括:通过ida提取的正常指令序列、基本块、以及控制流图和程序调用图的信息。42.具体地,软件基因序列定义如下:43.对二进制可执行文件f,p是f中所有指令的集合,si是一系列影响程序控制流的因素,exec(si)是在因素si影响下被执行过的指令序列集合,即[0044][0045]假设pi和pj是指令集合p中的两条指令,定义指令pi和指令pj是软件基因序列当且仅当:[0046][0047]其中,si是各种影响二进制程序执行控制流的因素,其中包括:用户输入,程序参数,环境变量等。[0048]具体地,本发明提出的软件基因划分原则,是从二进制软件逆向的实战需求出发,修正编译优化问题中的基本块过于琐碎的问题。软件基因的划分原则建立在程序控制流图中定义的基本块之上,但是基本块的定义为:一个基本块是一段顺序执行的代码序列,并且基本块有且仅有一个入口和一个出口。但是我们定义的软件基因不止一个入口点和出口点,如果一个基本块的最后一条指令是api或者库函数调用(exit类除外),则该基本块与地址上紧邻的下一基本块发生合并,形成新的代码块,当合并达到最大限度,无法进行合并时,所得代码块即为软件基因,众多控制流返回指令均返回到调用点的下一跳指令处,造成软件基因的多入口和多出口,我们与编译原理中严格定义的基本块以及idapro中所定义的基本块有严格的区别,如图2所示。在此给出软件基因(softwaregene,sg)的定义,b是连续的指令序列,其中:[0049][0050]当二进制可执行文件f执行到指令pm时,若满足以下情况,则视为软件基因:[0051][0052]若满足以下情况,则不将其视为软件基因:[0053][0054]另外,软件基因的起始指令pm‑1和终止指令pm n都是控制流分支指令(branchinstruchtions,bi)。[0055]软件基因是控制流图上基本块的重新整合,因此其中之间的关系也体现了二进制程序执行的跳转关系,并构成了软件基因图。[0056]软件基因图(softwaregenegraph,sgg):g是一个有向图,表示为g=(v,e,lv,le),其中v是图中的节点的集合,e是一些有向边的集合。lv代表图中节点的标记功能,例如lv:v‑>∑v。le代表图中有向边的标记功能,例如:le:‑>∑e。其中∑v全部是软件基因,∑e是连接块间的分支指令。[0057]图3中显示的这一小部分二进制代码片段来自eternalblue恶意软件。其中,图3中(a)部分里,黑色加粗处则是我们分支指令,而注意到在p12也是一条call指令,但是不符合我们针对软件基因的定义,所以并不会将其划分为一个基本块。而图3中(c)部分中也是展示了一部分恶意代码的sgg,其中问号表示我们例子中没有出现的sg,而且sg还有多个入口和出口。[0058]这里可以看出软件基因图(sgg)和控制流图(cfg)、程序调用图(cg)、过程间控制流图的区别还是非常明显的。首先是因为sgg属于跨过程图,它的生成范围其实并不仅仅限制在某个过程一种,但是针对控制流图则只有单过程当中。另外sgg的节点以及边都是软件基因以及块的分支指令边,其节点和边的属性性质是一样的,而其他的图,则是有不同的组成性质,并且sgg还包含了二进制代码内几乎所有的语义信息,特别是提取的所有二进制代码指令序列,这相对于程序调用图而言多了许多信息,因为程序调用图仅仅包含程序的过程调用信息。并且不同粒度的程序片段都能够通过程序切片的方法生成sgg,这说明了sgg具有较强的统一性和适用性。[0059]进一步地,所述提取目标程序的软件基因序列、软件基因、软件基因图包括:[0060]在提取二进制控制流语义的开始对二进制代码进行软件基因序列程序切分,并将其一维二进制代码序列根据控制流关系转化为软件基因图。[0061]进一步地,所述软件基因序列程序切分包括:[0062]将分支指令作为软件基因的划分边界,并记录切分、调用、回调关系以构成流路并最终生成软件基因图。[0063]在上面过程详细介绍了软件基因的划分原则,本节则给出提取算法的详细过程,首先在使用反汇编器对二进制可执行文件进行反汇编时,通常会在二进制文件的编译和链接过程中将部分与用户源代码无关的二进制代码加入可执行文件中,也可能因为编译选项等问题在二进制文件中加入不相关指令来进行二进制文件对齐以确保可执行文件能够顺利被操作系统加载并运行。因此在二进制可执行文件通过反汇编后,对于本研究不关注的非用户段或函数,本发明通过反汇编器的脚本接口进行过滤以减轻分析工作量,并且同时也提高了语义提取的针对性和准确性。[0064]在提取二进制控制流语义的开始对二进制代码进行软件基因序列程序切分,当生成图之后在进行后续处理,这样能最大可能保留控制流信息,并将其一维二进制代码序列根据控制流关系转化为拓扑程度更高,语义信息更加丰富的软件基因图。[0065]区分是否为软件基因的重点在于识别分支指令,从而形成了代码中的分支和循环。通过这一点的不同造成了二进制代码控制流的执行不一致性。我们将分支指令作为软件基因的划分边界,并记录切分,调用,回调关系以构成流路并最终生成软件基因图。[0066]关于切片准则c=<n,v,l>,程序中所有语句或者指令p的软件基因序列切片p’为满足下列条件的任何语法:[0067]1、p’是从p中删除零条或多条语句或指令获得的;[0068]2、无论何时,当p输入i的状态轨迹t停止,p’也在输入i的状态轨迹t’停止,projc(t)=projc(t');[0069]3、对所有n个p的程序切片,限制条件l为:[0070]而根据软件基因序列定义以及程序切片准则c,设计出程序切片算法sgs如下:[0071][0072][0073]算法1中,输入中包括程序p的起始地址pstart和终止地址pend以及指令i所在的地址a;所有分支指令集合bi,而输出则是我们想得到的软件基因图以及过程中得到的软件基因的集合。可以看出(第二行)定义了函数,接着获取分支指令i,通过判断地址是否为终止地址来跳出循环,接着判断i的类型是否为我们所定义的分支指令bi,若是的话进行更新sgg的节点和边的集合,然后通过递归遍历从起始地址到终止地址(17行)。最后通过for循环来再次进行递归调用函数进行程序切片,得到所有的软件基因。[0074]在算法1当中,num是sg数目的索引,而b则是集合变量来存储遍历的指令序列构成软件基因。其中e同样是集合变量,其存储sgg的边由三个要素构成,分别为源指令,目标指令,分支指令[cul,cal,i]。算法通过递归调用slicer(第19行)函数进行程序切片,得到程序p的所有sg。在slicer的函数中,通过遍历程序中的所有指令确定是否为分支指令(第7行),然后同时更新sgg的节点集合v和边集合e。对于每个分支指令,按照切片准则进行程序切分,直到遍历到二进制程序的最后一条指令a==pend(第4行)。[0075]为了实验效果好并且能够避免产生词表过大,语义分散问题,并且还需要再语法层面尽可能保留二进制代码的语义,需要进行语法规范化。在特征工程中我们还需将提取的软件基因序列语法规范化。[0076]首先,我们设计了我们的sql表,它们之间的关系以及features‑to‑dbapi。其中不光包括了我们提出的软件基因序列、软件基因、以及软件基因图的信息,还有通过ida提取的正常指令序列、基本块、以及cfg和cg图的信息以此来进行后续的对比实验。[0077]所有二进制代码指令的语法结构主要分为两个部分,操作码和操作数,其中操作码只有一个,操作数的个数为大于等于零的正整数。本发明将操作数元素种类分为立即数类(imms),内存类(mems),寄存器类(regs),和地址类(addrs),并将其进行替换并通过数据库工作将所有通过前面特征工程所提取到的特征以及各种基本特征如指令序列、cfg、cg、原始字节、序列和基本块和函数之间的索引和地址、序列和基本块以及函数的大小、函数名称以及函数的出入度和邻居节点及地址、基本块的出入度和邻居节点及地址等等一系列后续可能用到的特征都写入数据库中方便后续工作使用。[0078]步骤2:将sqlite数据库中的软件基因序列使用词嵌入之后再进行双向gru模型的训练,得到特征向量;[0079]进一步地,所述步骤2中词嵌入过程包括:[0080]首先将单词转成字典的形式,直接建立词典索引结构,使用一句话看成一个单词的形式,然后再以句子为列,为每个句子建立索引结果,接下来进行padding操作,然后再进行词的初始化。[0081]首先通过将规范化后的软件基因序列进行词嵌入之后再进行双向gru的训练,并将得出的向量投入到后续的训练当中。借鉴自然语言处理的思想,二进制代码中的指令序列也可以看作是单词来处理,而软件基因序列就是一句话,通过词嵌入将序列变成神经网络中的向量表示,在这里使用的是torch.nn.embedding。其方法获得的向量只是随机初始化的,并不代表任何含义,并且不会有word2vec等训练出来的效果,但是可以利用这样的方法先赋值然后再通过后续的双向gru进行序列信息学习。[0082]其过程如图4,首先将单词转成字典的形式,直接建立词典索引结构,在这里我们直接使用一句话看成一个单词而非将其分开,因为通过以前的工作证明直接使用一句话效果更好。然后再以句子为list,为每个句子建立索引结果,list[[sentence1],[sentence2]]。以上面字典的索引来说,最终建立的就是[[1,2,3],[1,4,5,6]]。这样长短不一的句子。接下来进行padding操作,由于tensor结果中都是等长的,所以要对上面那样的句子做padding操作然后再利用nn.embedding进行词的初始化,padding后的可能是这样的结构[[1,2,3,0],[1,4,5,6]],其中0作为填充。[0083]门控递归单元(gru)是近年来发展起来的长短记忆单元(lstm)的变体,两者其实都是rnn的变体。rnn在语音识别、自然语言处理、机器翻译等方向有广泛应用并且最近引入的gru在长序列应用中效果十分突出,而本发明使用了双向gru,其中lstm和gru的主要区别在于gru结合了遗忘门和输入门并合并成为了更新门,从而与lstm使用遗忘门、输入门、输出门不同,gru采用了更新门和复位门。此外混合细胞状态和隐藏状态也发生了一些变化,最终gru模型比标准的lstm模型要简洁,而通过双向gru网络经过训练后,就可以学习到序列的语义信息以及恶意代码团队的风格信息,gru定义如下:[0084]z(t)=σ(wzx(t) uzh(t‑1) bz)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ(6)[0085]r(t)=σ(wrx(t) urh(t‑1) br)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ(7)[0086][0087][0088]其中式子(6)和(7)表示更新门和复位门,wz、wr、wh、uz、ur和uh都是权重矩阵bz、br和bh都是偏置矢量。并且在我们实验中,我们使用了双向gru(bigru)因为其充分利用了来自两个方向的上下文信息,具体来说,bigru分别在时间以顺序和逆序‑‑‑即前向和后向‑‑‑依次处理输入序列并将每个时间步rnn的输出拼接成为最终的输出层。如图5展示,该网络有一个前向一个后向rnn,其中有六个权重矩阵:输入到前向隐层的后向隐层的权重矩阵(w1,w3)隐层到隐层自己的权重矩阵(w2,w5),前向隐层和后向隐层到输出层的权重矩阵(w4,w6)。注意,该网络的前向隐层和后向隐层之间没有连接。[0089]本发明提出一种新颖的多层信息融合图卷积深度学习模型dif‑gcn(doubleinformationfusiongcn),而整个图学习的整体结构如图6所示。[0090]首先,我们的输入是从上一部分通过软件基因序列切分后的序列进行深度学习得到的特征向量以及从数据库中提取的sg包含序列的索引、sgg关联关系、cg中sg的索引、cg图关联关系作为输入进入我们的dif‑gcn模型中,在informationfusion模块中将特征向量通索引进行多粒度序列信息融合,然后在gcn之中我们分别将软件基因图以及cg图通过信息融合后包含多粒度信息的特征向量来进行结构化学习,最后通过全连接层完成多分类任务。接下来将详细介绍其中过程。[0091]步骤3:基于步骤2训练后得到的特征向量及sqlite数据库中的信息进行多粒度序列信息融合,得到包含多粒度信息的特征向量,然后通过图卷积进行结构化学习;[0092]进一步地,所述步骤3中,多粒度序列信息融合过程包括:[0093]通过字典的最大长度进行从下标1开始的遍历,通过字典中的键值对查找到软件基因所对应的向量维度,然后通过搜索函数在序列向量中找到所对应的向量维度,并且通过向量叠加的方式将其信息进行融合,最后通过拼接将提取出来的各个向量整合在一起,得到包含多粒度信息的特征向量。[0094]具体地,以前的工作直接将特征变成序列形式借助nlp的方法来进行单层次的学习,或者通过向量矩阵简单拼接的方式将结构化信息加入进行学习,这样的方式并不能更多的学习到潜在的语义信息,让结构化特征与内部指令序列之间产生了间隔,实验效果也不佳。因此本发明提出了多粒度信息融合算法如算法2所示。[0095][0096]算法2在本发明整个模型中被使用了两次,第一次使用中,x是上一阶段通过提取软件基因序列并进行序列训练后得到的特征向量,dict则是我们构建的字典索引,其中包括了每个软件基因中所包含的指令序号及地址,vec则是通过算法得出的经过信息融合之后的特征向量。其主要过程是通过遍历dict中每一个软件基因中包含指令的索引来找到向量x中属于同一个软件基因的指令对应的向量维度并将其进行信息融合成为一个软件基因的特征向量。算法通过针对字典进行循环(第2行),找出每个字典下标中所包含的指令索引(第4、8行)之后通过地址索引以及序号从训练向量中找出相对应的向量维度(第5、9行)。将对应的向量进行信息融合,将低层级特征信息融合进高层级特征中,通过后续的gcn使得当模型进行图结构化信息学习时也将序列信息同时包含其中,避免了特征信息的割裂。最后进行训练向量的整合(第6、11行)。第二次使用中,x则是表示通过第一次图训练之后得到软件基因的训练向量,而dict则是每个函数中所包含的软件基因序号以及地址。[0097]算法2中输入有通过前面词嵌入以及双向gru得到的向量,以及包含图结构关系的字典。而输出则是经过信息融合后的训练向量。通过字典dict的最大长度进行从下标1开始的遍历,通过字典中的键值对找到软件基因所对应的向量维度,然后通过搜索函数(第5,9行)在x序列向量中找到所对应的向量维度,并且通过向量叠加的方式将其信息进行融合(第6,10行),最后通过拼接将提取出来的各个向量整合在一起放入下面的图卷积训练中。[0098]gcn从大体上基本分为两类:基于空间和基于频谱的。其主要思想是通过汇总其自身的特征和邻居的特征来生成节点的表示形式。基于光谱的模型通过计算图拉普拉斯算子的本征分解来定义图卷积在傅里叶域中,同时基于光谱的gcn缺点是必须要同时处理整个图,这样会消耗大量资源并且降低速度。但是在基于空间的gcn中并不是使用整个图来进行运算,因此本发明使用基于空间的gcn进行二进制代码溯源,并且本发明中每个图中的每个节点都是通过序列训练之后包含的整个软件基因序列以及软件基因的信息,再通过图卷积来进行二进制代码结构化信息学习,更加能够学习到整个二进制代码的语义信息以及二进制背后团队的隐藏特征信息。[0099]其中gcn的计算过程如下:[0100]x(l 1)=f(x(l),a)ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ(10)[0101]第一步是式子(10)中从前一个隐藏层到后一个隐藏层,并且对节点进行特征变化。其中x(l)是第l层节点的特征,a是对应于节点的图结构描述,如邻接矩阵。[0102]x(l 1)=σ(ax(l)w(l) b(l))ꢀꢀꢀꢀꢀꢀꢀꢀꢀ(11)[0103]第二步是式子(11)对第一步进行具体的实现步骤,其中σ指的是非线性变换,w(l)是第l层的权重,而b(l)则是第l层的截距。[0104]x(l 1)=σ(d‑1ax(l)w(l) b(l))ꢀꢀꢀꢀꢀꢀꢀꢀꢀ(12)[0105][0106]第三步是式子(12)(13)中,通过对邻接矩阵进行归一化,并且可以通过度矩阵d来实现(即通过d‑1*a来实现对a的归一化)。[0107][0108][0109]第四步是式子(14)(15)中,通过每个节点从自身出发,又指向自己,实际上就是把邻接矩阵对角线上全部由0变为1,并且还同时考虑到每个节点和邻接点的关系,在这里通常进行的是求和运算。其中xi(l 1)为节点i在第l 1层的特征,xj(l)为节点i的所有邻居节点(包括自身)在第l层的特征,为a的自循环,为对应的度矩阵,ni为节点i的所有邻居,包含节点i自身。[0110][0111][0112]第五步则是通过式子(16)将归一化运算简化,如果省略掉截距,用h来表示每个节点的特征,则公式最终则是式子(17)。[0113]步骤4:通过全连接层将学习到的隐层空间特征向量表示映射到样本标记空间,作为判决的投票值,最终得出分类结果。[0114]为验证本发明效果,进行如下实验:[0115]我们的数据集包含以下几种文件:1)googlecodejam谷歌代码大赛(2008年‑2020年)和2)恶意代码数据集。在表1中提供了数据集的统计数据。[0116]表1实验数据集的统计数据[0117][0118]我们在一年一度的编程竞赛gcj上来评估模型。这个大赛每年都有几万人参与并且涵盖了全球的专业人士、学生等等,并且针对同种功能写出不一样的代码,就类似于恶意代码可能具有相似的功能类型但是却是由不同组织机构完成,而我们则通过他们的二进制代码从而进行溯源分析找出他们。[0119]值得一提的是我们在gcj数据集中选择了一共900名作者,并且每个位作者都超过20个程序,其中500人超过30个程序,不同年份的相同作者所写样本在这里并没有重复,同时我们提取的文件只包括c和c ,并不含有脚本项目(例如python、php等)。[0120]而针对恶意代码数据集(大致信息如表2所示),通过我们实验室自十几年间一直不断收集恶意代码家族样本,恶意代码家族数量已达一万多种,而样本数量更是达到几十万个。其中有很大一部分是通过公共恶意软件存储库virusshare获得的,从中本发明选择出100个家族,其中每个家族共有8个样本共800个样本来进行实验。为了恶意软件的真实,我们通过virustotal的在线第三方病毒扫描服务获得恶意软件真实标签,获得文件的md5,sh1,sha256以及vt所提供的流行的防病毒引擎的检测信息,此信息还包括每个病毒扫描引擎的元数据,例如目标平台,恶意代码类型以及家族等,并且为了进一步确认virustotal上得到的信息准确,我们还通过人工的方式针对800个样本进行抽样恶意性分析,这部分筛选工作耗时巨大。[0121]表2恶意代码数据集[0122][0123](a)良性数据集溯源能力[0124]这是我们实验主要的一个部分,通过针对gcj数据集来证明我们模型针对溯源任务的有效性,并且在后续实验中证明模型能够很好的在恶意代码问题上使用。[0125]这一部分我们采用准确率和召回率两种评价方式,通过针对数据集进行了预处理并且经过第二部分的特征工程进行提取新颖的特征包括sg、sgg等等。通过不同人数训练,我们从20人至900人进行了实验,其中在人数达到150人之前我们的实验效果都接近于98%,当人数达到900人时,我们的准确率也能达到77%。其中我们将本发明方法(简称为huang)与现有的方法进行比较,其中rosenblum等人提出的方法可以找到源代码,但是没有数据集。caliskan等人的方法有源代码以及数据集。[0126]图7、8中展示了精确度以及召回率和人数数量之间的关系,并且很明显的可以看出随着人数的增加,准确率在急剧的下降,但是也不妨碍说明我们通过这种方法来实现溯源任务是可行的,并且本发明的方法在二进制代码溯源上有较好的准确性,在人数达到200左右时,rosenblum的准确率已经降至70%左右而达到人数900人时已经达到20%,而同时caliskan的方法相对而言却保持了不错的效果,在200人时基本维持在90%左右,而达到900人时则在53%左右。通过我们的实验可以发现rosenblum的特征是用户与编译器相混合,而当人数大量增加时,分类明显变得困难。而caliskan的方法则是主要针对编译的二进制文件中ast中提取出来的特征,而当作者人数激增之后这类特征则相对普遍且相似,使得效果不佳,通过我们的新特征及模型,从多种不同粒度去进行学习,同时在dif‑gcn学习之后通过信息融合以及gcn还不断地针对上下文以及结构化信息进行递进加权,从而学习到深层的隐藏的作者信息。[0127](b)新特征和模型的有效性[0128]为了证明每个单独特征以及特征所对应的模型对整体任务的准确率贡献有多大,我们通过使用单独特征以及特征之间的相互组合来进行验证,并且随着作者人数的增加分别展示相对应的准确率,效果如图9、10、11所示:[0129]显而易见的是,不管是哪种单独特征以及特征组合,随着作者人数的增加,溯源任务的准确率也是越来越困难。通过图9中我们也可以看到单独效果最好的还是软件基因序列效果超过了其他特征,而cg的效果则是最差的。这是因为sgg以及cg的特征只包含了结构化信息,其中所包含的语义信息非常少,肯定是不如软件基因序列的效果的好,并且一个样本中所包含的函数调用关系肯定远远少于基本块之间的调用关系,其所含的结构化信息自然也就不如基本块。但是从图中同样可以看出软件基因序列加上sg和gg之后,整体的准确率也大幅度上涨,并且上涨的幅度大于仅仅只有sgg和sg特征的效果。[0130]这是因为当sg中包含了软件基因序列的语义信息之后再经过图卷积进行学习相对于只有结构化特征,gcn能够学习到更多的语义信息,通过不同粒度的角度针对语义信息进行提取学习。当加入最后一层cg特征之后,效果略有增长,但是增加的效果不是特别的显著,我们也同样认为是因为一个程序之中函数的调用次数肯定远远小于sgg的调用次数,因此图卷积学习能够从sg图中学习到的信息也较之减少。可以从图10中看出,本发明的模型与caliskan与rosenblum之间的对比,其中caliskan的效果仅次于通过双向gru以及dif‑gcn的模型效果,而rosenblum则与双向gru加单层gcn相差无几。[0131]通过图11可以看出,基于逆向实战角度出发所提出的sgs、sg、sgg特征与原来常用的特征相比在同样的模型之下效果截然不同,在当人数达到900人时差别达到了近20%,说明新特征更加能够体现出二进制代码有效的语义信息从而通过深度学习模型完成溯源任务。[0132](c)不同编译器及优化选项[0133]本实验中我们将通过更改代码转换机制如更改编译器、编译选项来针对同一批样本进行测试,不同优化选项测试结果如图12所示。[0134]通过测试模型对使用相同编译器但是经过不同编译器优化选项生成的二进制文件能否达到很好的溯源效果。我们通过在x86架构上使用gcc编译的二进制文件,并且分别优化等级为o0、o2、o3的二进制文件。因为较高优化等级的优化策略涵盖了低等级的,因此差异最大的是o3与o0之间,而相对差异最小的则是o2与o3之间。因此图12(a)中将o3作为训练集而o2作为测试集,在图12(b)中将o3作为训练集而o0作为测试集,其中对比可以发现caliskan的模型敏感性较强。我们发现在不同的优化选项中例如指令替换等问题会降低其性能,同时图结构等信息则变化不是那么大,因此本发明的特征以及模型可以很有效的捕获到不同优化选项中作者的信息。[0135]而针对不同编译器的实验如图13所示,具体来说,我们通过在x86架构上使用o2优化等级编译的二进制文件,其中不同的编译器包括gcc、llvm、clang,必须要强调的是我们对所有的编译器使用了类似的优化设置。在此基础上,通过三个不同编译器生成的三组二进制文件,我们分三次从三组中选取一组当作测试,其余两组当作训练集,得出随着人数增长下的准确率,实验结果如图所示。可以看出因为不同编译器引入的严重语法修改以及内联问题,我们提出的模型也对不同编译器所带来的二进制文件变化具有较好的抵抗力,证明了其鲁棒性。其中通过图13(b)中可以发现caliskan在针对不同编译器的时候效果变化比较明显。[0136](d)恶意代码家族分类[0137]很多情况下,我们都想知道恶意代码二进制文件背后的家族或团队,因此这部分工作尤为重要。由于编译过程中,此类程序二进制文件通常不保留过多的语义以及其他个人以及团队风格,因此该方向是具有挑战性的。本节通过上述恶意代码数据集来进行家族分类,并且针对恶意代码家族分类训练样本数量稀少问题,我们设计了一个实验来确定需要多少训练数据量才能达到稳定的分类溯源,实验结果如图14所示。[0138]通过图14(b)可以看出在恶意代码家族分类的任务上,本发明模型能够在100个恶意代码家族中溯源准确率达到92%,而针对20个家族的溯源准确率更是可以直接达到100%,充分证明了该模型针对恶意代码领域的有效性。[0139]同时我们使用的是有监督机器学习方法,而这一方法的缺点则是需要大数量的训练样本来建立模型,而针对复杂度高的模型而言,需要的训练样本则会更多。并且在恶意软件家族分类领域,针对样本收集是非常困难的,同时获得准确的标记过的家族分类样本则会更加困难,这些在本质上和现实上决定了我们的模型不能通过大量样本来进行训练,因此通过设计实验来验证多少训练样本才能达到稳定的溯源效果,效果如图14(a)中所示。我们实现从训练数量从1到10进行验证,其中当数量达到3个时,准确率大幅度提升至77%,而当数量达到4个以及往后,准确率逐渐接近稳定。因此本发明的模型针对恶意代码家族溯源仅需4个训练样本就能达到稳定的准确率,充分体现了特征的有效性及模型的鲁棒性并具有现实意义。[0140]本发明提出了从二进制文件中提取新颖的样式特征(sgs、sg、sgg)并通过新颖的深度学习模型根据二进制作者(包括恶意代码作者以及团队)进行追踪溯源技术。通过实验证明,在良性数据集中我们的工作能够从200人中准确溯源到正确作者为98%,而当人数增加到900人,我们的准确率也能保持在72%。尽管我们没有研究不同平台(例如arm,mips等)的跨架构分析,但是我们针对了三种流行的编译器以及不同的优化选项之间的有效性进行分析,实验结果体现了本发明提出的模型具有良好的鲁棒性。而针对新提出的模型以及新颖的样式特征,我们通过消融实验来证明其增加的必要性以及有效性,其大幅度增加了溯源工作的准确性。除此之外,我们还通过实验证明了我们的方法在恶意代码溯源问题上具有较高的准确率,在100个团队或组织中我们的方法能够达到92%的溯源准确率,并且使用少量的训练数据就可以实现稳定的溯源效果。[0141]以上所示仅是本发明的优选实施方式,应当指出,对于本
技术领域
:的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜