一种恶意软件感染后宿主软件中恶意代码识别方法

文档序号:10512605阅读:262来源:国知局
一种恶意软件感染后宿主软件中恶意代码识别方法【专利摘要】一种恶意软件感染后宿主软件中恶意代码识别方法。首先,使用递归下降反汇编方法获得宿主软件的反汇编代码,其中需要获得机器指令对应的反汇编代码、代码中出现的各种引用信息和导入表函数信息;然后,根据引用情况确定代码序列之间的断点,并将两个断点之间的代码序列构成一个代码块;接着根据相邻代码块之间的关系进行合并;并且,根据对导入表函数使用情况寻找最长的未使用导入表函数的代码块序列;最后根据恶意代码与宿主软件代码之间的调用关系确定恶意代码的起始软件块和结束软件块,这样就最终获得所需要的恶意代码序列。该方法可以作为宿主软件中恶意代码识别的通用方法,为进一步的软件复原提供具体的代码位置信息。【专利说明】一种恶意软件感染后宿主软件中恶意代码识别方法
技术领域
[0001]本发明属于计算机恶意代码识别方法,特别是被感染后宿主软件中注入恶意代码的识别方法。【
背景技术
】[0002]Windows平台下,许多恶意软件通过感染技术将有效的代码注入到正常文件中。恶意软件会通过感染技术对一些文件进行批量注入,例如一些WIN32型计算机病毒会遍历当前目录或重于系统目录中的文件,对符合感染条件的所有PE文件进行恶意代码注入;一些恶意软件会对一些关键或常用的系统文件进行感染,如Window系统的explorer.exe,常用的.dll文件,大大增加了恶意代码被执行的机会。要将这些文件全部检测以及正确处理会花费很大代价。[0003]就绝大多数的Windows平台下PE(PortableExecutables)格式的可执行文件而言,在编译阶段和装载进入内存时,系统会对其进行一些优化和格式要求,使得代码本身具有统一性。被恶意代码注入之后,原有代码和后注入代码之间的编码风格、结构特点等就会存在许多差异。原有软件在编程为了提高开发效率,会经常使用库函数,这些库函数有标准的参数,比较容易被识别;注入代码为了减少代码数量,注重代码执行效率而非代码的重用性。在调用系统函数方面,原有代码在编译期间会直接将相应的动态链接库中的相关函数填入到导入表中,可以直接通过call指令直接调用导入表中的函数;而注入代码事先难以获知导入表中函数的逻辑地址,因此不能直接调用这些函数。本专利根据被感染软件控制流的异常表现,研究一种通用的注入恶意代码识别方法。[0004]“良性”感染的定义:大多数恶意代码感染为了做到隐蔽执行,都不希望破坏宿主软件原有功能,本发明中称这种计算机软件感染为“良性”感染。[0005]N-grams序列的定义:N-Grams序列是指相邻的η个元素组成序列的表达方式,本发明中元素是指合并后的代码块。【
发明内容】[0006]本发明的目的是提供一种计算机软件被“良性”感染后宿主软件中被注入的恶意代码通用识别方法,为软件复原提供准确有效的依据。[0007]本发明的目的是这样实现的:一种计算机软件感染后宿主软件中被注入的恶意代码通用识别方法,包括以下三个阶段:1、宿主软件以中间代码形式分块;2、根据软件块之间关系对相邻软件块进行合并;3、对注入恶意代码边界进行识别;具体步骤如下:I)宿主软件以中间代码形式分块1.1)利用递归下降方法对PE格式的宿主软件进行反汇编,将宿主软件用反汇编代码表示;1.2)采用断点分割的方法获得反汇编代码序列形式的代码块,用“BasicBlock”符号表示。将引起或出现控制流转移的指令或位置作为整个代码段的断点,两个断点之间的代码序列就可以作为BasicBlock的内容。断点需要满足下列条件之一即可:(I)操作符为“jmp”、acair和“retn”的指令,这些指令一定能引起控制流的转移。[0008](2)发生代码引用的位置,即“jmp”或“call”的跳转目标地址。[0009](3)发生数据引用的位置,即软件其他位置的代码对该地址或地址中的数据进行数据引用。[0010]1.3)两个相邻断点之间反汇编序列就看做一个BasicBlock;2)根据软件块之间关系对相邻软件块进行合并2.1)位置相邻的BasicBlock,如果并非由外部引用或跳转函数外部指令引起的分割,可以将其合并。[0011]2.2)相邻BasicBlock之间因为对外部引用造成分割时,如果低地址存在引用高地址时,两者可以合并。[0012]2.3)相邻BasicBlock存在相互引用时可以合并。[0013]2.4)与相同BasicBlock相互引用时可以合并。[0014]3)对注入恶意代码边界进行识别3.1)求取未引用导入表函数的最长BasicBlock块连续序列。这个序列同时满足两个条件(I)所有BasicBlock除了调用了GetProcAddress和LoadLibrary这两个导入表函数之外未引用其它的导入表函数;(2)是宿主软件中满足条件(I)的最长序列。恶意3.2)确定注入恶意代码起始位置。注入代码起始位置要么是软件执行的入口位置,要么是外部引用的入口处;注入恶意代码的起始BasicBlock是原有代码能够正常引用的唯一基本块;3.3)确定注入恶意代码结束位置。在注入代码最尾部BasicBlock之后的基本块中,可能会和宿主代码其他BasicBlock之间发生引用,但是不会和引用注入代码的BasicBlock序列。【附图说明】[0015]图1是恶意软件感染后宿主软件中恶意代码识别方法的流程图。[0016]【具体实施方式】[0017]根据图1中介绍的流程,【具体实施方式】5个步骤:步骤1.递归下降反汇编方法获得宿主软件的反汇编代码。递归下降的方法是根据二进制软件中机器代码执行的控制流对软件进行反汇编,在反汇编过程中能够识别一部分结构完整的函数以及系统定义的导入表函数。[0018]步骤2.根据引用情况确定代码序列之间的断点。根据反汇编代码中的跳转指令和调用指令,确定发生代码引用和数据引用的位置,以及被引用的位置,这些位置可以作为断点。具体而言,操作符为“jmp”、“call”和“retn”的指令,这些指令一定能引起控制流的转移,这些指令之后的一条指令作为断点;发生代码引用的位置,即“jmp”或“call”的跳转目标地址指令作为断点;发生数据引用的位置,即软件其他位置的代码对该地址或地址中的数据进行数据引用时,该地址的指令作为断点。相邻断点之间的断点之间指令序列形成一个基本块,用BasicBIοck表示,断点处的指令作为BasicBIock的第一条指令,地址是BasicBlock的起始地址。[0019]步骤3.根据相邻BasicBlock之间的关系进行合并。当两个相邻Basicblock至少满足以下四个条件之一时,可以对其合并。合并的结果就是去掉它们之间的断点,将两个反汇编代码序列按地址顺序合并成一个。[0020](I)位置相邻的BasicBlock,如果并非由外部引用或跳转函数外部指令引起的分害J,可以将其合并。[0021](2)相邻BasicBlock之间因为对外部引用造成分割时,如果低地址存在引用高地址时,两者可以合并。[0022](3)相邻BasicBlock存在相互引用时可以合并。[0023](4)与相同BasicBlock相互引用时可以合并。[0024]步骤4.确定包含注入恶意代码的BasicBlock序列。具体方法是:首先将标注使用BasicBlock中包含导入表函数(除了GetProcAddress和LoadLibrary两个函数)的情况;然后使用寻找所有包含导入表函数数量为O的连续BasicBlock(用n-gramsF_BasicBlock表示);将长度最大的n-gramsF_BasicBlock作为包含注入代码的BasicBlock序列。[0025](5)确定恶意代码的边界。根据以下算法确定由注入恶意代码组成的BasicBlock序列,这些序列中的所有代码就是本方法所求得的结果。[0026]名称:恶意代码n-grams识别算法输入:候选的n-grams数组Candidate_BBlocks和剩余的Rest_BBlocks变量设置:head=0,tail=Candidate_BBlocks.Size-1,External_xref=0;输出:恶意代码组成的子序列数组Mal_BBlocks实现步骤:1.如果head小于tail,则执行:1.1如果Candidate_BBlocks[head]首地址是软件执行入口地址,执行2;1.2如果Candidate_BBlocks[head]首地址被外部引用,执行2;1.3如果Candidate_BBlocks[head]引用Rest_BBlocks,则将其加入Rest_BBlocks,head=head+l,执行I;2.如果rail大于head,则执行:2.1Candidate_BBlocks[rail]与Rest_BBlocks相互引用,tail=tail_l,执行2;2.2执行3;3.如果head小于tail且,则执行:3.1如果External_xref大于I,head=head+l,Candidate_BBlocks[head]加入Rest_BBlocks,执行I;3.2如果Candidate_BBlocks[head]引用Rest_BBlocks,External_xref=External_xref+1,tail=tail_l;4.如果head小于tail,返回0&11(11(1&七6_13131001<:8[]16已(1,...,tail]作为Mal_BBlocks。【主权项】1.一种恶意软件感染后宿主软件中恶意代码识别方法,其特征是:包括以下步骤:.1.1)递归下降反汇编方法获得宿主软件的反汇编代码:递归下降的方法是根据二进制软件中机器代码执行的控制流对软件进行反汇编,在反汇编过程中能够识别一部分结构完整的函数以及系统定义的导入表函数,.1.2)根据引用情况确定代码序列之间的断点:根据反汇编代码中的跳转指令和调用指令,确定发生代码引用和数据引用的位置,以及被引用的位置,这些位置可以作为断点;.1.3)根据相邻BasicBlock之间的关系进行合并:当两个相邻Basicblock满足一定关系时,可以对其合并,合并的结果就是去掉它们之间的断点,将两个反汇编代码序列按地址顺序合并成一个;.1.4)确定包含注入恶意代码的BasicBlock序列;.1.5)确定恶意代码的边界:通过寻找由注入恶意代码组成的BasicBlock序列的头部和尾部确定恶意代码构成BasicBlock的序列,这些序列中的所有代码就是本方法所求得的结果。2.根据权利要求1所述的一种恶意软件感染后宿主软件中恶意代码识别方法,其特征是:所述步骤I.2)中对软件反汇编代码分块的步骤如下:.2.1)具体而言,操作符为“jmp”、“call”和“retn”的指令,这些指令一定能引起控制流的转移,这些指令之后的一条指令作为断点;发生代码引用的位置,即“jmp”或“call”的跳转目标地址指令作为断点;发生数据引用的位置,即软件其他位置的代码对该地址或地址中的数据进行数据引用时,该地址的指令作为断点,相邻断点之间的断点之间指令序列形成一个基本块,用BasicBlock表示,断点处的指令作为BasicBlock的第一条指令,地址是BasicBlock的起始地址。3.根据权利要求1所述的一种恶意软件感染后宿主软件中恶意代码识别方法,其特征是:所述步骤1.3)根据相邻BasicBlock之间的关系进行合并的步骤如下:.3.1)当两个相邻Basicblock至少满足以下四个条件之一时,可以对其合并,合并的结果就是去掉它们之间的断点,将两个反汇编代码序列按地址顺序合并成一个:(1)位置相邻的BasicBlock,如果并非由外部引用或跳转函数外部指令引起的分割,可以将其合并,(2)相邻BasicBlock之间因为对外部引用造成分割时,如果低地址存在引用高地址时,两者可以合并,(3)相邻BasicBlock存在相互引用时可以合并,(4)与相同BasicBlock相互引用时可以合并。4.根据权利要求1所述的一种恶意软件感染后宿主软件中恶意代码识别方法,其特征是:所述步骤1.4)确定包含注入恶意代码的BasicBlock序列的步骤如下:.4.1)首先将标注使用BasicBlock中包含导入表函数(除了GetProcAddress和LoadLibrary两个函数)的情况;然后使用寻找所有包含导入表函数数量为O的连续BasicBlockC用n-gramsF_BasicBlock表不);将长度最大的n-gramsF_BasicBlock作为包含注入代码的BasicBlock序列。5.根据权利要求1所述的一种恶意软件感染后宿主软件中恶意代码识别方法,其特征是:所述步骤1.5)确定恶意代码的边界的算法如下:.5.1)恶意代码识别算法输入:候选的n-grams数组Candidate—BBlocks和剩余的Rest—BBlocks变量设置:head=0,tail=Candidate_BBlocks.Size-1,External_xref=0;输出:恶意代码组成的子序列数组Mai—BBlocks实现步骤:如果head小于taiI,则执行:.1.1如果Candidate—BBlocks[head]首地址是软件执行入口地址,执行2;.1.2如果Candidate—BBlocks[head]首地址被外部引用,执行2;.1.3如果Candidate—BBlocks[head]引用Rest—BBlocks,则将其加入Rest—BBlocks,head=head+l,执行I;如果rail大于head,则执行:.2.1Candidate—BBlocks[rail]与Rest—BBlocks相互引用,tail=tail_l,执行2;.2.2执行3;如果head小于taiI且,则执行:.3.1如果External—xref大于I,head=head+l,Candidate—BBlocks[head]加入Rest_BBlocks,执行I;.3.2如果Candidate—BBlocks[head]引用Rest—BBlocks,External—xref=External—xref+1,tail=tail_l;如果head小于taiI,返回Candidate—BBlocks[head,…,tail]作为Mai—BBlocks。【文档编号】G06F21/56GK105868633SQ201610253409【公开日】2016年8月17日【申请日】2016年4月22日【发明人】王岩,赵宗渠,智慧来,刘本仓【申请人】河南理工大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1