一种基于统计方法的加壳可执行文件识别方法及系统的制作方法

文档序号:6470950阅读:146来源:国知局
专利名称:一种基于统计方法的加壳可执行文件识别方法及系统的制作方法
技术领域
本发明属于数据安全领域,具体的说属于恶意代码分析过程中,对带壳的可执行程序进行自动识别的一种方法及系统。

背景技术
加壳的全称应该是可执行程序资源压缩。是保护可执行文件的一种常用手段。加壳过的程序可以直接运行,但是不能直接使用反汇编技术查看程序的反汇编代码,要想看反汇编代码,需要经过脱壳之后才可以。
加壳其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP的效果,只是压缩之后的文件,仍然是一个可执行文件,可以直接独立运行,运行该加壳程序后,先进行解压缩,解压缩后执行真正的程序,解压缩过程完全隐蔽,都在内存中完成。
压缩原理是加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压缩自己。其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当你执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开之后的就交给真正的程序来执行。
对可执行文件加壳主要有两个目的 1、有时可执行程序过大,对其加壳可以压缩可执行程序的大小。
2、有些程序使用加壳技术为了防止程序被人跟踪调试,防止算法程序被别人静态分析。对程序加壳后可以很好的达到这个目的。
针对加壳技术的两种不同目的的应用,加壳技术也分成了两个技术方向,压缩壳和加密壳。压缩壳的特点就是减小软件体积大小,加密保护不是其重点。目前比较流行的压缩壳有UPX、ASPack、PECompact等。加密壳的重点则在于保护程序不被人逆向分析,而减小软件体积大小不是其重点,目前比较流行的加密壳有ASProtect、Armadilo。而就实际应用而言,很多壳是综合了压缩技术和加密的技术的综合壳。而这些壳的综合性能会更高。对于加壳这种技术,常规软件中有一些应用,但是应用不是很广泛;而在很多恶意代码为了躲避查毒软件的查杀,都使用了加壳的技术。所以对于恶意代码的分析者来说,如何高效率的区分出哪些可疑的恶意代码使用了加壳技术,哪些没有使用,就是一个需要解决的技术问题。因为对于加壳的可疑恶意代码的分析方法和没有加壳的可疑恶意代码分析方法是不同的。在很长的一段时间里这个区分的过程主要依赖于分析人员的经验,依靠手工来区分,之后也出现了一些基于壳的特征码的壳程序区分方法,但这种方法只能识别有限的几种已知的壳,对于大量新出现的未知壳无法有效识别。而在反恶意代码的实际工作中,分析人员遇到的大量的加壳程序的壳都是新开发出来的未知壳。


发明内容
本发明针对以上背景技术中提到的实际问题,提出了一种基于统计方法的加壳可执行文件识别方法及系统。
本发明的技术方案概括如下 一种基于统计方法的加壳可执行文件识别方法,其步骤包括 1)读入已知未加壳的可执行程序文件; 2)以单字节和双字节为统计单位统计可执行程序文件中各数字出现的次数和总字节数; 3)求出单字节和双字节在未加壳可执行程序文件中的概率,求出各相邻单字节数值的条件分布; 4)读入未知可执行程序文件,计算出该文件中单字节和双字节出现的概率,与所述步骤3)中的数据进行比较,计算出差异值; 5)单字节和双字节的差异值,分别小于指定的阀值,则确定该可执行文件加壳。
所述步骤4)单字节的差异值 双字节的差异值 其中其中Bi、CI表示已知未加壳的可执行程序文件中的单字节、双字节出现的概率,Ai、EI表示未知可执行程序文件中单字节、双字节出现的概率。
进一步,读入未知可执行程序文件后,还可以识别一段数据是否加壳,具体步骤如下 (1)将要识别的数据段以偶数字节为单位,分成小段。
(2)计算各小段在未加壳的可执行程序中的出现概率。
(3)计算各小段数据出现的平均概率。
(4)步骤(3)中得出的数值小于设定阀值,确定该段数据为可执行代码的加壳部分。
所述步骤(1)偶数字节为8字节。
一种基于统计方法的加壳可执行文件识别系统,包括可执行文件加载模块、数据统计模块、数据计算模块、写入知识库模块、知识库加载模块、加壳文件识别模块,其中所述可执行文件加载模块用于将已知可执行程序读入,并将读入的内容交给数据统计模块;所述数据统计模块统计指定字节出现的次数传递给数据计算模块;数据计算模块计算出各统计数据的概率分布后传递给写入知识库模块;所述加壳文件识别模块统计未知可执行程序中的数据,与知识库加载模块加载的数据比较,来识别一个可执行文件是否加壳。
上述系统还包括加壳数据段识别模块,用于识别一个可执行文件中的某段数据是否是加壳数据部分。
与现有技术相比,本发明的有益效果是通过本发明的技术方案可以高效准确的将加壳的可执行程序与未加壳的可执行程序区分开。与传统的手工识别和解析指令的方法相比,由于使用基于统计的方法分析效率会大幅提高;与传统的基于特定壳的特征码的识别技术相比,本发明的使用范围更广,不但可以识别出已知壳的加壳程序,而且对于未掌握特征码的大量未知壳的加壳程序,也有非常准确的识别能力。



图1学习子系统构造图 图2识别子系统构造图 图3学习子系统处理流程图 图4加壳文件识别模块处理流程图 图5加壳数据段模块处理流程图
具体实施例方式 下面结合附图和具体实施方式
对本发明作进一步详细描述 基于统计方法的加壳可执行文件识别系统,分两个子系统学习子系统,识别子系统。
一、学习子系统 学习子系统主要的功能是对大量的未加壳的可执行程序进行统计上的分析,从中抽取出未加壳的可执行程序的在统计上的特征。为识别子系统提供一个知识库。
如图1所示,学习子系统主要分以下几个模块 1、可执行文件加载模块。主要完成的功能是将作为样本的可执行程序逐个读入到系统中。并将读入的内容交给“数据统计模块”来处理。
2、数据统计模块,主要完成的功能是逐字节的扫描由“可执行文件加载模块”提供的数据,以单字节和双字节为单位(这是选取的统计单位,单字节和双字节比较合适,也有利于之后计算条件分布,如果选用四字节则可能的情况会很多,复杂度会很高),统计这些数据中出现各单字节和双字节的次数,以及扫描的总的字节数。一个单字节在计算机中是用一个8bit是2进制数表示的,转换成16进制后,这个数的取值范围是0x00到0xff, 如假设A B D D C A D是我们要统计的一段数据,每个字符代表一个字节,用16进制表示分别为0x22 0x23 0x34 0x34 0x2c 0x22 0x34。当然真实的数据是一系列可执行文件的内容,数据量会大的多,这里只是举个例子。
先以单字节为单位统计 A出现的次数2 B出现的次数1 C出现的次数1 D出现的次数3 以双字节为单位统计 AB出现的次数1 BD出现的次数1 DD出现的次数1 DC出现的次数1 CA出现的次数1 AD出现的次数1 总共扫描过的总的字节数是7 将统计出来的这些数据传递给“数据计算模块”,来进一步对数据进行计算。
3、数据计算模块,主要完成的功能是对统计好的数据进行进一步的处理。主要处理方式有 (1)、计算各单字节出现的概率用Bi表示,其中i的取值范围是0x00~0xff还以上文中数据为例, 字节A即0x22出现的概率B0x22即P(A)=2/7=0.28571428571428571428571428571429 字节C即0x2c出现的概率B0x2c即P(C)=1/7=0.14285714285714285714285714285714 (2)、计算各双字节出现的概率 用CI表示,其中I的取值范围是0x0000~0xFFFF 还以上文中的数据为例 双字节AB即0x2223出现的概率C0x2223即 P(AB)=1/6=0.16666666666666666666666666666667 (3)、根据贝叶斯公式计算条件分布 用Di表示,其中i的取值范围是0x0000~0xffff 还以上文中的数据为例 P(B/A)=P(A B)/P(A)=0.58333333333333333333333333333333 即D0x2322=P(0x23/0x22)=0.58333333333333333333333333333333 (4)最终可以得到以下数据 从0x00~0xFF的所有单字节的出现概率Bi 从0x0000~0xFFFF的所有双字节的出现概率CI 还可以得P(a/b)的条件分布概率Di,即第一个单字符是a的条件下后面的字符是b出现的概率,a、b表示变量,其中a的取值范围是0x00~0xFF,b的取值范围是0x00~0xFF。
最后将获得的这些数据传递给写入知识库模块。
4、写入知识库模块,负责将计算出来的数据写入到知识库中。
二、识别子系统 识别子系统的作用是利用学习子系统的提供的知识库,对未知的可执行程序进行识别,其中包括两种方式的识别,第一种是,对一个完整的可执行文件进行识别,来判断其是加了壳的可执行程序,还是未加壳的可执行程序;第二种是对可执行程序中的某一段数据进行识别,来判断该段数据是可执行文件的代码段部分,还是其他数据段或是加壳可执行文件的加壳数据部分,如图2所示,识别子系统包括以下模块 1、知识库加载模块,将“学习子系统”计算得到的数据,从知识库中读入。其中Bi表示读出的单字节出现概率,CI表示读出的双字节出现的概率。Di表示相邻单字节的条件分布。
2、加壳文件识别模块。主要的功能是识别指定的可执行文件是否加壳。主要的方法是 (1)、计算该文件中单个字节和双字节数据出现的概率,其中Ai表示单字节出现的概率;EI表示双字节出现的概率。
(2)、与知识库中的数据进行比较,差异值S的计算公式为 其中单字节的差异值 (公式一) 其中双字节的差异值 (公式二) S1和S2的值分别有一个阀值K1和K2,阀值是按照以上公式,对大量的可执行文件(包括加壳的和没有加壳的)进行计算,根据加壳可执行文件和没有加壳的可执行文件计算出来的S1值的差异性,来确定一个阀值K1,使得用所有加壳的可执行文件计算出来的S1都大于这个阀值K1,所有用未加壳的可执行文件计算出来的S1都小于这个阀值K1,阀值K2同理。
因此在这里,当S1<K1且S2<K2时,则可以确定该可执行文件加壳。
3、加壳数据段识别模块,主要功能是识别一个可执行文件中的某段数据是否是加壳数据部分。
主要步骤如下 假设被识别的数据段为S。
(1)、将数据S,以每段8字节分成小段,分别为Gi(总共分为n段,其中i表示段的序号),尾部不足八字节的数据丢掉不计。(这里选用8个字节,是考虑到求联合分布的复杂程序,当然选4个字节或16个字节为单位,也可以,但效果没有8个字节的好,16个字节就太复杂了,计算量太大;而4个字节,计算的简单,但区分是否是加壳数据段的效果不好;而之所以不选7字节或9字节,主要是考虑到计算机是按照2、4、8、16来对齐的,用单字节和双字节不行。) (2)计算每小段8字节数据出现的概率, 设第i小段8字节的数据为w1、w2、w3、w4、w5、w6、w7、w8、 则该小段出现的概率为 P(Gi)=P(w1)P(w2|w1)P(w3|w1w2)……P(w8|w1w2…w7) 利用马尔卡夫假设可以把该公式简化为 P(Gi)=P(w1)P(w2|w1)P(w3|w2)……P(w8|w7);(公式三) 其中P(w2|w1)、P(w3|w2)等值可以从Di中获得。
因为如上面举例 D0x2322=P(0x23/0x22)=0.58333333333333333333333333333333 及P(0x23/0x22)=D0x23*0x100+0x22 所以有P(w2|W1)=Dw2*0x100+w1 P(w3|w2)=Dw3*0x100+w2 因此上面的P(Gi)可得 P(Gi)=Bw1Dw2*0x100+w1Dw3*0x100+w2……Dw8+0x100+w7 (3)、对各小段求出的出现概率求平均值 假设总共分了n小段 (公式四) 如果这一值P(G)小于某一阀值K3,则该段数据为加壳数据。如图3所示,学习子系统处理流程如下 (1)、由“可执行文件加载模块”从指定文件夹中加载一个准备用来学习的未加壳的可执行程序。并将文件内容交给“数据统计模块”处理。加载的文件数量越多,最后识别的准确性会越高,在实验阶段目前的数量是2000个。
(2)、“数据统计模块”分别以单字节和双字节的形式统计0x00~0xff和0x0000~0xffff各数字出现的次数,和总字节数。
(3)、判断指定文件夹中的用来学习的未加壳程序是否全部学习完成,如果未完成回到步骤1),继续加载其他为学习的可执行程序,并在步骤2)中对各统计数据进行累加。如果全部学习完成,继续步骤4)。
(4)、由“数据计算模块”根据各统计数据求出0x00~0xff,256个单字节数值在未加壳可执行程序中的概率分布;求出0x0000~0xffff,65535个双字节数值在未加壳可执行程序中的概率分布。并在此基础上求出各相邻单字节数值的条件分布。
(5)、由“写入知识库模块”将“数据计算模块”计算出的数据写入知识库中,以供识别子系统在识别壳时使用。
如图4所示,识别子系统处理流程 (1)、调用“知识库加载模块”将由“学习子系统”获得的数据加载到识别子系统中。
(2)、根据要识别的具体数据,调用不同的识别模块,如果是要识别一个可执行文件是否加壳,则调用“加壳文件识别模块”;如果要识别“一段数据是否加壳”,则调用“加壳数据段识别模块”。
(3)、识别一个可执行文件是否加壳的流程,在“加壳文件识别模块”中完成,如图4所示。
A、将被识别文件读入内存。
B、分别统计单字节和双字节出现的概率分布。
C、分别使用“公式一”和“公式二”计算出S1和S2的值。
D、通过将S1、S2分别与阀值K1、K2比较,综合考虑两个比较结果,最后做出是否是加壳程序的结论。
(4)、识别一段数据是否加壳的流程。在“加壳数据段识别模块”中完成,如图5所示。
A、将要识别的数据段传入识别模块。
B、将要识别的数据段以8字节为单位,分成小段。
C、分别利用(公式三)计算各小段在未加壳的可执行程序中的出现概率P(Gi)。
D、利用(公式四)计算各小段数据出现的平均概率P(D)。
E、将P(D)与一固定的阀值K3,比较如果小于K3,则可以确定该段数据为可执行代码的加壳部分。
权利要求
1、一种基于统计方法的加壳可执行文件识别方法,其步骤包括
1)读入已知未加壳的可执行程序文件;
2)以单字节和双字节为统计单位统计可执行程序文件中各数字出现的次数和总字节数;
3)求出单字节和双字节在未加壳可执行程序文件中的概率,求出各相邻单字节数值的条件分布;
4)读入未知可执行程序文件,计算出该文件中单字节和双字节出现的概率,与所述步骤3)中的数据进行比较,计算出差异值;
5)单字节和双字节的差异值,分别小于指定的阀值,则确定该可执行文件加壳。
2、如权利要求1所述的方法,其特征在于,读入未知可执行程序文件后,还可以识别一段数据是否加壳,具体步骤如下
(1)将要识别的数据段以偶数字节为单位,分成小段;
(2)计算各小段在未加壳的可执行程序中的出现概率;
(3)计算各小段数据出现的平均概率;
(4)步骤(3)中得出的数值小于设定阀值,确定该段数据为可执行代码的加壳部分。
3、如权利要求1所述的方法,其特征在于,所述步骤4)单字节的差异值
双字节的差异值其中Bi、CI表示已知未加壳的可执行程序文件中的单字节、双字节出现的概率,Ai、EI表示未知可执行程序文件中单字节、双字节出现的概率。
4、如权利要求2所述的方法,其特征在于,所述步骤(1)偶数字节为8字节。
5、一种基于统计方法的加壳可执行文件识别系统,其特征在于,包括可执行文件加载模块、数据统计模块、数据计算模块、写入知识库模块、知识库加载模块、加壳文件识别模块,其中所述可执行文件加载模块用于将已知可执行程序读入,并将读入的内容交给数据统计模块;所述数据统计模块统计指定字节出现的次数传递给数据计算模块;数据计算模块计算出各统计数据的概率分布后传递给写入知识库模块;所述加壳文件识别模块统计未知可执行程序中的数据,与知识库加载模块加载的数据比较,来识别一个可执行文件是否加壳。
6、如权利要求5所述的系统,其特征在于,还包括加壳数据段识别模块,用于识别一个可执行文件中的某段数据是否是加壳数据部分。
全文摘要
本发明公开了一种基于统计方法的加壳可执行文件识别方法及系统,方法步骤包括1)读入已知未加壳的可执行程序文件;2)以单字节和双字节的形式统计可执行程序文件中各数字出现的次数和总字节数;3)求出单字节数值和双字节数值在未加壳可执行程序文件中的概率,求出各相邻单字节数值的条件分布;4)读入未知可执行程序文件,计算出该文件中单个字节和双字节数据出现的概率,与步骤3)中的数据进行比较,计算出差异值;5)单字节和双字节的差异值,分别小于指定的阀值,则确定该可执行文件加壳。本发明的方法不但可以识别出已知壳的加壳程序,而且对于未掌握特征码的大量未知壳的加壳程序,也有非常准确的识别能力,且分析效率大幅提高。
文档编号G06F21/00GK101388062SQ200810224318
公开日2009年3月18日 申请日期2008年10月17日 优先权日2008年10月17日
发明者安丙春 申请人:北京锐安科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1