一种基于程序切片技术的C语言死代码检测方法与流程

文档序号:11729274阅读:438来源:国知局

本发明涉及恶意代码分析领域,主要涉及一种基于程序切片技术的c语言死代码检测方法。



背景技术:

随着互联网的广泛普及,现今的计算机网络也面临着越来越多的攻击威胁。在众多网络安全问题中,恶意代码所造成的安全危害愈发严重。恶意代码分析成了安全人士关注的重点,各种恶意代码分析方法被不断提出。然而,为了增加安全人员对恶意代码进行分析的难度,恶意代码编写者往往采用各种技术手段对代码进行保护,代码混淆就是其中之一。经过混淆的恶意代码,既能躲避查杀工具的检测,又能阻碍逆向工程师进行安全分析。

在众多代码混淆方法中,控制流代码混淆方法的使用最为广泛。控制流混淆技术通过各种方法和手段对程序真正的控制流程进行隐藏,从而阻碍反混淆人员的分析。常用的控制混淆方法包括插入死代码或不相关代码、插入不透明谓词、扩展循环条件、并行化程序等。其中,插入死代码是指在原始代码中插入完全不会被执行到的代码,以阻碍安全人员对代码进行分析。

国内外学者采用各种反混淆方法,对经过混淆的恶意代码进行分析。2013年,郭军提出了一种基于语义的反混淆方法,通过语义相关指令的识别,对混淆代码指令序列进行优化,实现二进制代码自动反混淆。2015年,宣以广提出一种基于字符熵的javascript混淆代码检测方法,依据代码n-gram熵值大小判定代码是否经过混淆,有利于分析javascript恶意代码。2016年,朱泽策提出了面向android安全性的smali混淆代码分析方法,基于抽象语法树相似度,对原生代码和混淆代码进行比较,计算其相似性,为混淆代码的理解提供帮助。

这些代码反混淆方法,或是只能对混淆代码的分析提供帮助,而不能具体检测出被混淆代码中死代码的位置,恢复控制流结构,或是需要进行语义与指令识别等复杂的处理,并不适合在分析恶意代码时实际应用。因此,有效、方便的死代码检测方法是需要进一步研究。



技术实现要素:

本发明提出一种基于程序切片技术的c语言死代码检测方法,从可能插入了死代码的c语言源代码出发,目的是给出一个更为有效的c语言死代码检测方法。

程序切片是一种分析和理解程序的技术。经过不断发展,在程序理解、分析以及软件的测试、度量等方面都有着广泛的应用。其中,静态切片静态分析代码,通过对源码的代替表达形式进行检查而不必实际执行程序,对于所有的程序输入,产生的静态切片都是正确的;动态切片根据程序的输入值,对程序中计算到与输入相关的语句进行抽取,动态切片的结果可能因为输入值的不同而不同,但是动态切片比传统的静态切片在切片的准确度上有明显的优势。

本发明从可能插入了死代码的c语言源代码出发,利用程序切片技术对包含死代码的源代码进行分析,检测出死代码的位置,还原源代码控制流结构。具体技术方案是:

步骤1、获取可能包含死代码的c语言源代码;

步骤2、将所述源代码中的输出语句与所述输出语句中的变量集合组成切片准则<n,v>,其中n是源代码中的输出语句,v是n中的变量集合,<n,v>表示当前关心的是语句n上、集合v中变量对应的计算;

步骤3、根据步骤2中的切片准则对所述源代码进行静态后向程序切片分析,获得程序切片准则与语句n处、集合v中的变量存在直接或间接的控制依赖或数据依赖的语句集a1;

步骤4、对源代码进行符号执行,获得程序切片所有可能的执行路径,通过约束求解器计算得到每条路径下满足谓词条件的输入值;

步骤5、以所述输入值作为程序切片的输入,根据所述切片准则对所述源代码进行动态后向程序切片分析,获得程序切片在执行时与切片准则有关的语句集a2,也即与语句n处、集合v中的变量存在直接或间接的控制依赖或数据依赖的语句集;

步骤6、比较a1和a2,如果a1和a2中包含的语句相同,则源代码中不存在死代码;如果a1和a2中包含的语句不同,则a1中存在但a2中不存在的语句即为死代码。

根据检测范围的要求,步骤2中所述变量集合v可以是输出语句n的所有变量或部分变量。

所述静态后向程序切片分析指静态切片在不执行程序时对源代码进行语义分析。

所述动态后向程序切片分析指在输入给定、程序执行的情况下经过的路径上的语句,所述语句随输入的不同而变化。

步骤3还可位于步骤5之后或步骤3与步骤4~步骤5同时执行。

本发明与已有技术相比:

(1)利用程序切片技术,结合静态切片分析与动态切片分析方法,对c语言中插入的死代码进行检测,具有较高的准确率;

(2)本发明能够针对c语言源代码中某一变量进行相关死代码检测,而不必对所有变量进行分析,具有较强的针对性,提高了检测效率。

附图说明

图1为基于程序切片的c语言死代码检测方法实施例的整体流程框图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

基于程序切片的c语言死代码检测方法,从插入了死代码的c语言源代码开始,利用静态切片和动态切片技术,并结合符号执行,对c语言死代码进行检测。图1给出了本实施例的整体流程,具体实现步骤如下:

1):获取可能插入了死代码的c语言源代码。死代码是指插入在原始程序中,不会被执行到,也不会对原始程序运行结果产生任何影响的代码。可能插入了死代码的c语言源代码可以从恶意代码网站上下载得到。

2):将源代码中的输出语句与输出语句中的变量组成切片准则<n,v>,其中n是源代码中的输出语句,v是源代码中变量的一个子集。切片准则<n,v>表示当前关心的是语句n上,集合v中变量对应的计算。在切片准则c=<n,v>下,程序p的切片s是一个可执行的程序,它通过从p中删除零个或多个语句获得,并且和程序p关于切片准则c具有一样的行为。

3):根据步骤2中的切片准则进行静态后向程序切片分析,静态切片考虑程序所有可能的执行情况,与输入无关。静态切片在不执行程序的前提下对源代码进行语义分析,得到与切片准则有关的所有语句,记为语句集s。语句集s可能包含死代码。

4):对源代码进行符号执行,用符号值代替源程序中变量的值,然后用基于中间语言的模拟程序执行来进行相关语义分析。得到程序所有可能的执行路径,再通过约束求解器计算每条执行路径可行的输入值。

5):以步骤4中计算得到的可行输入值作为程序的输入,根据步骤2中的切片准则进行动态后向程序切片分析。动态切片只分析给定输入、程序动态执行时经过的路径上的语句,它们随输入的不同而变化。在程序不同的执行路径下,得到程序实际执行时,与切片准则有关的所有语句,记为语句集d。语句集d不包含死代码。

6):比较步骤3中静态分析获得的语句集s和步骤5中动态分析得到的语句集d。如果s和d中包含的语句相同,那么源代码中不存在死代码;如果s和d中包含的语句不同,那么s中存在但d中不存在的语句即为检测出的死代码。

如图1所示,步骤3为静态程序切片分析过程,步骤4~步骤5是动态程序切片分析过程。步骤3和步骤4~步骤5可以同时执行,以缩短程序运行时间,提高效率。

本发明方案所公开的技术手段不仅限于上述实施方式所公开的技术手段,还包括由以上技术特征任意组合所组成的技术方案。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1