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

一种程序相似性检测方法、装置、电子设备和存储介质

文献发布时间:2023-06-19 09:40:06


一种程序相似性检测方法、装置、电子设备和存储介质

技术领域

本发明涉及程序检测技术领域,尤其涉及一种程序相似性检测方法、装置、电子设备和存储介质。

背景技术

现如今,以勒索病毒为首的各类恶意代码肆虐网络,对于如何基于已有所获取恶意代码样本,开展进一步关联性挖掘,进而为事件应急处置提供支撑,是技术难点。编写程序代码通常不会从零开始,而是在已有代码基础上或者复用已有部分功能代码来实现编码。基于此,对于分析人员来说,可以基于所获取程序代码,开展复用函数代码检测,进而为恶意攻击代码关联分析或漏洞代码检测追踪提供支持要实现上述关联或追踪分析目标,需对代码之间复用的功能块或函数进行快速有效发现,有以下两个关键问题需要解决:

(1)分析速度问题;通常,恶意样本数量非常多,如何有效对大批量样本进行处理非常关键;

(2)分析准确性问题;不同样本,相同功能代码,其具体形式会有差异,这主要是因为不同代码作者或不同编译环境与编译优化选项都会导致二进制程序发生变化,使得要想有效地找出代码之间的复用函数难度大大提高。

发明内容

本发明提供了一种程序相似性检测方法、装置、电子设备和存储介质,用于解决现有的复用函数代码检测方法分析速度慢,分析准确性不高的技术问题。

本发明提供的一种程序相似性检测方法,包括:

从预设源程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本;

基于所述函数基本信息和所述反汇编指令文本对预设目标程序进行筛选,得到潜在相似函数,并确定与所述潜在相似函数对应的目标源函数;

将所述目标源函数拆解为多个源程序片段;

将所述潜在相似函数拆解为多个目标程序片段;

分别计算任意所述源程序片段与所述目标程序片段之间的相似性,得到相似性分数;

确定所述相似性分数达到第一预设阈值的相似目标程序片段个数;

将所述相似目标程序片段个数达到第二预设阈值的潜在相似函数确定为相似函数;

根据所述相似函数的个数,判断所述源程序和所述目标程序是否存在关联关系。

可选地,所述从预设源程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本的步骤,包括:

对所述源程序执行脱壳操作,得到原始编译程序;

从所述原始编译程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本。

可选地,所述基于所述函数基本信息和所述反汇编指令文本对预设目标程序进行筛选,得到潜在相似函数,并确定与所述潜在相似函数对应的目标源函数的步骤,包括:

判断所述原始编译程序是否为预设库函数或预设编译器插入函数;

若否,采用所述函数基本信息对所述预设目标程序进行筛选,以及采用所述反汇编指令文本对所述预设目标程序进行筛选,得到潜在相似函数。

可选地,所述分别计算任意所述源程序片段与所述目标程序片段之间的相似性,得到相似性分数的步骤,包括:

对所述源程序片段与所述目标程序片段进行标准化处理,得到标准化源程序片段和标准化目标程序片段;

基于最长公共子序列算法,对所述标准化源程序片段和所述标准化目标程序片段进行相似性计算,得到相似性分数。

本发明还提供了一种程序相似性检测装置,包括:

提取模块,用于从预设源程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本;

潜在相似函数筛选模块,用于基于所述函数基本信息和所述反汇编指令文本对预设目标程序进行筛选,得到潜在相似函数,并确定与所述潜在相似函数对应的目标源函数;

源程序片段拆解模块,用于将所述目标源函数拆解为多个源程序片段;

目标程序片段拆解模块,用于将所述潜在相似函数拆解为多个目标程序片段;

相似性分数计算模块,用于分别计算任意所述源程序片段与所述目标程序片段之间的相似性,得到相似性分数;

相似目标程序片段个数确定模块,用于确定所述相似性分数达到第一预设阈值的相似目标程序片段个数;

相似函数确定模块,用于将所述相似目标程序片段个数达到第二预设阈值的潜在相似函数确定为相似函数;

关联关系判断模块,用于根据所述相似函数的个数,判断所述源程序和所述目标程序是否存在关联关系。

可选地,所述提取模块,包括:

脱壳子模块,用于对所述源程序执行脱壳操作,得到原始编译程序;

提取子模块,用于从所述原始编译程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本。

可选地,所述潜在相似函数筛选模块,包括:

判断子模块,用于判断所述原始编译程序是否为预设库函数或预设编译器插入函数;

潜在相似函数筛选子模块,用于若否,采用所述函数基本信息对所述预设目标程序进行筛选,以及采用所述反汇编指令文本对所述预设目标程序进行筛选,得到潜在相似函数。

可选地,所述相似性分数计算模块,包括:

标准化处理子模块,用于对所述源程序片段与所述目标程序片段进行标准化处理,得到标准化源程序片段和标准化目标程序片段;

相似性分数计算子模块,用于基于最长公共子序列算法,对所述标准化源程序片段和所述标准化目标程序片段进行相似性计算,得到相似性分数。

本发明还提供了一种电子设备,所述设备包括处理器以及存储器:

所述存储器用于存储程序代码,并将所述程序代码传输给所述处理器;

所述处理器用于根据所述程序代码中的指令执行如上任一项所述的程序相似性检测方法。

本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行如上任一项所述的程序相似性检测方法。

从以上技术方案可以看出,本发明具有以下优点:本发明公开了一种程序相似性检测方法,包括:从预设源程序中提取源函数,以及源函数对应的函数基本信息,并生成反汇编指令文本;基于函数基本信息和反汇编指令文本对预设目标程序进行筛选,得到潜在相似函数,并确定与潜在相似函数对应的目标源函数;将目标源函数拆解为多个源程序片段;将潜在相似函数拆解为多个目标程序片段;分别计算任意源程序片段与目标程序片段之间的相似性,得到相似性分数;确定相似性分数达到第一预设阈值的相似目标程序片段个数;将相似目标程序片段个数达到第二预设阈值的潜在相似函数确定为相似函数;根据相似函数的个数,判断源程序和目标程序是否存在关联关系。本发明结合了函数基本信息和反汇编指令文本SimHash来对潜在相似函数进行筛选,可实现对潜在相似函数函数的快速筛选。此外,通过程序片段比对的方式进行相似函数的筛选,相比于现有技术,具有更高的准确性。从而可以快速准确地找出程序之间复用的代码段或函数,进而判断两个程序之间是否存在关联关系,以便于对恶意程序进行溯源。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。

图1为本发明实施例提供的一种程序相似性检测方法的步骤流程图;

图2为本发明另一实施例提供的一种程序相似性检测方法的步骤流程图;

图3为两个程序分别编译相同功能函数的基本块示意图;

图4为本发明实施例提供的一种程序相似性检测方法的系统架构图;

图5为本发明实施例提供的一种程序相似性检测方法的流程图;

图6为本发明实施例提供的一种程序相似性检测装置的结构框图。

具体实施方式

本发明实施例提供了一种程序相似性检测方法、装置、电子设备和存储介质,用于解决现有的复用函数代码检测方法分析速度慢,分析准确性不高的技术问题。

为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

请参阅图1,图1为本发明实施例提供的一种程序相似性检测方法的步骤流程图。

本发明提供的一种程序相似性检测方法,具体可以包括以下步骤:

步骤101,从预设源程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本;

反汇编指令文本(SimHash)是一种局部敏感hash,假定两个字符串具有一定的相似性,在hash之后,仍然能保持这种相似性,就称之为局部敏感hash,其是一种用来处理海量文本去重的算法。

在本发明实施例中,可以对程序或恶意代码库进行样本聚类和分类处理,以任意一个恶意程序样本为预设源程序,并从中提取源函数和源函数对应的函数基本信息,并生成反汇编指令文本,以基于源程序的函数基本信息和反汇编代码,对作为目标程序的恶意程序进行快速筛选。

其中,函数基本信息可以包括函数入度/出度信息、CFG基本块数、调用函数与被调用函数等。

步骤102,基于所述函数基本信息和所述反汇编指令文本对预设目标程序进行筛选,得到潜在相似函数,并确定与所述潜在相似函数对应的目标源函数;

在获取到源程序的函数基本信息和反汇编指令文本后,可以采用该函数基本信息和该反汇编指令文本,对目标程序进行筛选,得到潜在相似函数。

具体地,采用函数基本信息对目标程序进行筛选的过程,可以为通过对比函数入度/出度信息、CFG基本块数、调用函数与被调用函数,在上述比对过程满足相应的相似度判定条件时,表征所比对的目标程序的函数为源函数的潜在相似函数。

采用反汇编指令文本对目标函数进行潜在相似函数筛选的过程,可以为通过对源程序和目标程序汇编指令文本串的海明距离的判断得到。

步骤103,将所述目标源函数拆解为多个源程序片段;

步骤104,将所述潜在相似函数拆解为多个目标程序片段;

步骤105,分别计算任意所述源程序片段与所述目标程序片段之间的相似性,得到相似性分数;

在完成对潜在相似函数的筛选后,还需要对潜在相似函数进行进一步地比对,以确认相似函数。具体地,可以对两者间的程序片段进行比对,得到相似性分数。以根据相似性分数判断是否满足相似性判定条件。

步骤106,确定所述相似性分数达到第一预设阈值的相似目标程序片段个数;

步骤107,将所述相似目标程序片段个数达到第二预设阈值的潜在相似函数确定为相似函数;

步骤108,根据所述相似函数的个数,判断所述源程序和所述目标程序是否存在关联关系。

在本发明实施例中,将相似性分数达到第一预设阈值的潜在相似片段确定为相似目标程序片段,统计个数以确认相似目标程序片段占目标程序所有程序片段的比例,当比例达到一定阈值时,即可认为两个程序之间存在关联关系。从另一个方面来讲,在已知目标程序的程序片段的总数以及判定比例阈值的情况下,也可以直接通过统计相似目标函数片段的个数来确定两个程序之间是否存在关联关系。

在本发明实施例中,本发明结合了函数基本信息和反汇编指令文本SimHash来对潜在相似函数进行筛选,可实现对潜在相似函数函数的快速筛选。此外,通过程序片段比对的方式进行相似函数的筛选,相比于现有技术,具有更高的准确性。从而可以快速准确地找出程序之间复用的代码段或函数,进而判断两个程序之间是否存在关联关系,以便于对恶意程序进行溯源。

请参阅图2,图2为本发明另一实施例提供的一种程序相似性检测方法的步骤流程图。

步骤201,对所述源程序执行脱壳操作,得到原始编译程序;

步骤202,从所述原始编译程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本;

在本发明实施例中,可以对作为源程序的恶意程序样本进行脱壳操作,得到原始编译程序。

需要说明的是,原始编译程序为了防止查杀和破解,一般都会进行加壳,未脱壳的程序使用IDA反编译无法得到正确的函数信息。因此,在本发明实施例中,需要对加壳的原始源程序进行脱壳操作,得到原始编译程序。再使用IDA反编译可以得到函数基本信息。

步骤203,判断所述原始编译程序是否为预设库函数或预设编译器插入函数;

步骤204,若否,采用所述函数基本信息对所述预设目标程序进行筛选,以及采用所述反汇编指令文本对所述预设目标程序进行筛选,得到潜在相似函数;

在本发明实施例中,当获取到函数基本信息后,为减少库函数和编译器插入函数的影响,可以基于IDA自带库对库函数与编译器插入函数进行过滤;然后基于函数基本信息对源程序和目标程序进行潜在相似函数筛选,得到潜在相似函数。

步骤205,将所述目标源函数拆解为多个源程序片段;

步骤206,将所述潜在相似函数拆解为多个目标程序片段;

由于基于函数基本信息进行潜在相似函数筛选的局限性,为了对潜在相似函数进行进一步比对,本发明提出了基于程序片段的复用函数检测方法。

如图3所示,图3为两个程序分别编译相同功能函数的基本块示意图;在图3中,程序a(openssl-1.0.1q O2)和程序b(openssl-1.1.0 O3)分别编译相同功能函数save_index,其中,a中的3、4、5、6、9、10、12与b中的3’、4’、5’、6’、9’、10’、12’为经手工确认对应相等的基本块,而a中的1、2、7、8、11和b中的1’、7’、8’是经手工确认找不到对应相等部分的基本块。

程序片段是指基于函数CFG图,由一个或数个连续基本块指令所组成的指令序列;通常一个基本块所包含的指令数比较少,不具有区分性,所以实际分析中以3到4个基本块为单位来提取程序片段。以图3为例,a中提取的程序片段有:(1,2,3),(1,11,12),(2,3,6),(2,4,5),(4,5,6),(4,7,8),(7,8,9),(7,8,10),(4,7,12),(8,9,12)和(8,10,12)等共11个。b中提取的程序片段有:(1’,4’,7’),(1’,4’,5’),(1’,3’,6’),(4’,5’,6’),(4’,7’,8’),(4’,7’,12’),(7’,8’,9’),(7’,8’,10’),(8’,9’,12’)和(8’,10’,12’)等共10个。

基于函数CFG图提取程序片段的算法过程如表1所示,以CFG图的每一个基本块作为顶点,采用广度优先搜索的方法提取所有基本块个数为k的程序片段,并把提取的指令序列存放在一个列表供后续使用。

表1

步骤207,对所述源程序片段与所述目标程序片段进行标准化处理,得到标准化源程序片段和标准化目标程序片段;

在本发明实施例中,程序片段标准化处理,主要对寄存器、内存地址、立即数以及函数等进行标准化处理。

步骤208,基于最长公共子序列算法,对所述标准化源程序片段和所述标准化目标程序片段进行相似性计算,得到相似性得分;

在本发明实施例中,程序片段的相似性计算,可以采用最长公共子序列算法来进行。

最长公共子序列问题(Longest Common Subsequence Problem,LCS)是指给定两个序列X=

通过上述公式可以计算得出两个序列LCS长度的算法,过程如下:算法接受两个序列X=

表2

表2计算过程说明:算法的输入为两个要进行相似性比较的程序片段指令序列列表,列表元素为经过标准化处理的反汇编指令,输出为两程序片段相似得分,最终,标准化的程序片段相似性得分计算公式如下:

其中,STrace表示源程序片段,TTrace为目标程序片段,SimScore是单条指令相似度得分,NsimScore为源程序片段与目标程序片段相似性得分。关于程序片段相似阈值的选择,这里选择80%。

步骤209,确定所述相似性分数达到第一预设阈值的相似目标程序片段个数;

步骤210,将所述相似目标程序片段个数达到第二预设阈值的潜在相似函数确定为相似函数;

步骤211,根据所述相似函数的个数,判断所述源程序和所述目标程序是否存在关联关系。

计算完函数程序片段相似性以后,根据相似程序片段数量确定被比较函数相似情况,计算公式为:

其中,simTracelet为源程序能找到相似程序片段的程序片段个数,srcTracelets表示源程序中程序片段个数;tarTracelets表示目标程序中程序片段个数;len()表示片段的长度。通过对大量程序CFG分析,确定函数相似阈值为0.3,即funcSimScore值大于0.3即认为两个函数相似。

在完成源目标程序函数相似性计算之后,根据相似函数个数确定两个程序是否存在关联性,如果源目标程序存在复用函数,则认为它们之间存在关联关系,进而可以认为背后攻击团队存在一定关联关系。

在本发明实施例中,本发明结合了函数基本信息和反汇编指令文本SimHash来对潜在相似函数进行筛选,可实现对潜在相似函数函数的快速筛选。此外,通过程序片段比对的方式进行相似函数的筛选,相比于现有技术,具有更高的准确性。从而可以快速准确地找出程序之间复用的代码段或函数,进而判断两个程序之间是否存在关联关系,以便于对恶意程序进行溯源。

为便于理解,请参阅图4,图4为本发明实施例提供的一种程序相似性检测方法的系统架构图。该架构由两个部分组成,即基于函数基本信息的潜在相似函数筛选和基于程序片段相似性比对。

基于函数信息的筛选,主要基于函数基本信息以及反汇编指令序列simhash,对目标程序潜在相似函数进行快速筛选。在此之前需要对程序或者恶意代码库进行样本聚类和分类处理。

基于程序片段的相似性比对,提取函数CFG指令序列片段,计算片段相似性;然后,通过计算相似片段比例进一步确定函数相似性。并最终根据相似性进行函数关联分析。

在一个示例中,参见图5,图5为本发明实施例提供的一种程序相似性检测方法的流程图。

在图5中,基于函数信息的快速筛选过程包括:

对待溯源恶意样本程序进行样本脱壳/函数提取/标准化/函数基本信息提取和SimHash生成操作;

库函数与编译器插入函数过滤:为减少库函数和编译器插入函数的影响,基于IDA自带库对库函数与编译器插入函数进行过滤;

基于函数信息对源程序和目标程序潜在相似函数进行筛选;函数基本信息包括函数入度/出度信息、CFG基本块数、调用函数与被调用函数等;

基于函数反汇编指令文本simhash对潜在相似函数进行筛选。

需要说明的是,当没有在目标程序中找到潜在相似函数时,可以把所有目标程序函数作为潜在相似函数。

基于程序片段的相似性比对可以包括:

1、程序片段提取;具体过程不再赘述;

2、程序片段相似性计算;包括:1)、程序片段标准化处理;主要对寄存器、内存地址、立即数以及函数调用等进行标准化处理;2)、对源函数片段和目标函数程序片段,基于LCS方法进行两两相似性计算,得到标准化后的相似性得分,并把超过设定阈值的程序片段认为是能找到相似片段的程序片段;3)、基于函数所有程序片段相似性比较结果对函数进行相似计算,输出两函数相似结果;

3函数相似性计算。

代码关联:

在完成源程序函数和目标程序函数相似性计算之后,根据相似函数个数确定两个程序是否存在关联性,如果源程序和目标程序存在复用函数,则认为它们之间存在关联关系,进而可以认为背后攻击团队存在一定关联关系。

在本发明实施例中,本发明结合了函数基本信息和反汇编指令文本SimHash来对潜在相似函数进行筛选,可实现对潜在相似函数函数的快速筛选。此外,通过程序片段比对的方式进行相似函数的筛选,相比于现有技术,具有更高的准确性。从而可以快速准确地找出程序之间复用的代码段或函数,进而判断两个程序之间是否存在关联关系,以便于对恶意程序进行溯源。

请参阅图6,图6为本发明实施例提供的一种程序相似性检测装置的结构框图。

本发明实施例提供了一种程序相似性检测装置,包括:

提取模块601,用于从预设源程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本;

潜在相似函数筛选模块602,用于基于所述函数基本信息和所述反汇编指令文本对预设目标程序进行筛选,得到潜在相似函数,并确定与所述潜在相似函数对应的目标源函数;

源程序片段拆解模块603,用于将所述目标源函数拆解为多个源程序片段;

目标程序片段拆解模块604,用于将所述潜在相似函数拆解为多个目标程序片段;

相似性分数计算模块605,用于分别计算任意所述源程序片段与所述目标程序片段之间的相似性,得到相似性分数;

相似目标程序片段个数确定模块606,用于确定所述相似性分数达到第一预设阈值的相似目标程序片段个数;

相似函数确定模块607,用于将所述相似目标程序片段个数达到第二预设阈值的潜在相似函数确定为相似函数;

关联关系判断模块608,用于根据所述相似函数的个数,判断所述源程序和所述目标程序是否存在关联关系。

在本发明实施例中,所述提取模块601,包括:

脱壳子模块,用于对所述源程序执行脱壳操作,得到原始编译程序;

提取子模块,用于从所述原始编译程序中提取源函数,以及所述源函数对应的函数基本信息,并生成反汇编指令文本。

在本发明实施例中,所述潜在相似函数筛选模块602,包括:

判断子模块,用于判断所述原始编译程序是否为预设库函数或预设编译器插入函数;

潜在相似函数筛选子模块,用于若否,采用所述函数基本信息对所述预设目标程序进行筛选,以及采用所述反汇编指令文本对所述预设目标程序进行筛选,得到潜在相似函数。

在本发明实施例中,所述相似性分数计算模块605,包括:

标准化处理子模块,用于对所述源程序片段与所述目标程序片段进行标准化处理,得到标准化源程序片段和标准化目标程序片段;

相似性分数计算子模块,用于基于最长公共子序列算法,对所述标准化源程序片段和所述标准化目标程序片段进行相似性计算,得到相似性分数。

本发明还提供了一种电子设备,所述设备包括处理器以及存储器:

所述存储器用于存储程序代码,并将所述程序代码传输给所述处理器;

所述处理器用于根据所述程序代码中的指令执行本发明实施例所述的程序相似性检测方法。

本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行本发明实施例所述的程序相似性检测方法。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,可以是电性、机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来达到实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

相关技术
  • 一种程序相似性检测方法、装置、电子设备和存储介质
  • 一种数据相似性检测方法、装置、电子设备和存储介质
技术分类

06120112252173