法律状态公告日
法律状态信息
法律状态
2023-03-28
未缴年费专利权终止 IPC(主分类):G06F21/56 专利号:ZL2016102534093 申请日:20160422 授权公告日:20190301
专利权的终止
2019-03-01
授权
授权
2016-09-14
实质审查的生效 IPC(主分类):G06F21/56 申请日:20160422
实质审查的生效
2016-08-17
公开
公开
技术领域
本发明属于计算机恶意代码识别方法,特别是被感染后宿主软件中注入恶意代码的识别方法。
背景技术
Windows平台下,许多恶意软件通过感染技术将有效的代码注入到正常文件中。恶意软件会通过感染技术对一些文件进行批量注入,例如一些WIN32型计算机病毒会遍历当前目录或重于系统目录中的文件,对符合感染条件的所有PE文件进行恶意代码注入;一些恶意软件会对一些关键或常用的系统文件进行感染,如Window系统的explorer.exe,常用的.dll文件,大大增加了恶意代码被执行的机会。要将这些文件全部检测以及正确处理会花费很大代价。
就绝大多数的Windows平台下PE(Portable Executables)格式的可执行文件而言,在编译阶段和装载进入内存时,系统会对其进行一些优化和格式要求,使得代码本身具有统一性。被恶意代码注入之后,原有代码和后注入代码之间的编码风格、结构特点等就会存在许多差异。原有软件在编程为了提高开发效率,会经常使用库函数,这些库函数有标准的参数,比较容易被识别;注入代码为了减少代码数量,注重代码执行效率而非代码的重用性。在调用系统函数方面,原有代码在编译期间会直接将相应的动态链接库中的相关函数填入到导入表中,可以直接通过call指令直接调用导入表中的函数;而注入代码事先难以获知导入表中函数的逻辑地址,因此不能直接调用这些函数。本专利根据被感染软件控制流的异常表现,研究一种通用的注入恶意代码识别方法。
“良性”感染的定义:大多数恶意代码感染为了做到隐蔽执行,都不希望破坏宿主软件原有功能,本发明中称这种计算机软件感染为“良性”感染。
N-grams序列的定义:N-Grams序列是指相邻的n个元素组成序列的表达方式,本发明中元素是指合并后的代码块。
发明内容
本发明的目的是提供一种计算机软件被“良性”感染后宿主软件中被注入的恶意代码通用识别方法,为软件复原提供准确有效的依据。
本发明的目的是这样实现的:一种计算机软件感染后宿主软件中被注入的恶意代码通用识别方法,包括以下三个阶段:
1、宿主软件以中间代码形式分块;2、根据软件块之间关系对相邻软件块进行合并;3、对注入恶意代码边界进行识别;具体步骤如下:
1)宿主软件以中间代码形式分块
1.1)利用递归下降方法对PE格式的宿主软件进行反汇编,将宿主软件用反汇编代码表示;
1.2)采用断点分割的方法获得反汇编代码序列形式的代码块,用“BasicBlock”符号表示。将引起或出现控制流转移的指令或位置作为整个代码段的断点,两个断点之间的代码序列就可以作为BasicBlock的内容。断点需要满足下列条件之一即可:
(1)操作符为“jmp”、“call”和“retn”的指令,这些指令一定能引起控制流的转移。
(2)发生代码引用的位置,即“jmp”或“call”的跳转目标地址。
(3)发生数据引用的位置,即软件其他位置的代码对该地址或地址中的数据进行数据引用。
1.3)两个相邻断点之间反汇编序列就看做一个BasicBlock;
2)根据软件块之间关系对相邻软件块进行合并
2.1)位置相邻的BasicBlock,如果并非由外部引用或跳转函数外部指令引起的分割,可以将其合并。
2.2)相邻BasicBlock之间因为对外部引用造成分割时,如果低地址存在引用高地址时,两者可以合并。
2.3)相邻BasicBlock存在相互引用时可以合并。
2.4)与相同BasicBlock相互引用时可以合并。
3)对注入恶意代码边界进行识别
3.1)求取未引用导入表函数的最长BasicBlock块连续序列。这个序列同时满足两个条件(1)所有BasicBlock除了调用了GetProcAddress和LoadLibrary这两个导入表函数之外未引用其它的导入表函数;(2)是宿主软件中满足条件(1)的最长序列。恶意
3.2)确定注入恶意代码起始位置。注入代码起始位置要么是软件执行的入口位置,要么是外部引用的入口处;注入恶意代码的起始BasicBlock是原有代码能够正常引用的唯一基本块;
3.3)确定注入恶意代码结束位置。在注入代码最尾部BasicBlock之后的基本块中,可能会和宿主代码其他BasicBlock之间发生引用,但是不会和引用注入代码的BasicBlock序列。
附图说明
图1是恶意软件感染后宿主软件中恶意代码识别方法的流程图。
具体实施方式
根据图1中介绍的流程,具体实施方式5个步骤:
步骤1.递归下降反汇编方法获得宿主软件的反汇编代码。递归下降的方法是根据二进制软件中机器代码执行的控制流对软件进行反汇编,在反汇编过程中能够识别一部分结构完整的函数以及系统定义的导入表函数。
步骤2.根据引用情况确定代码序列之间的断点。根据反汇编代码中的跳转指令和调用指令,确定发生代码引用和数据引用的位置,以及被引用的位置,这些位置可以作为断点。具体而言,操作符为“jmp”、“call”和“retn”的指令,这些指令一定能引起控制流的转移,这些指令之后的一条指令作为断点;发生代码引用的位置,即“jmp”或“call”的跳转目标地址指令作为断点;发生数据引用的位置,即软件其他位置的代码对该地址或地址中的数据进行数据引用时,该地址的指令作为断点。相邻断点之间的断点之间指令序列形成一个基本块,用BasicBlock表示,断点处的指令作为BasicBlock的第一条指令,地址是BasicBlock的起始地址。
步骤3.根据相邻BasicBlock之间的关系进行合并。当两个相邻Basicblock至少满足以下四个条件之一时,可以对其合并。合并的结果就是去掉它们之间的断点,将两个反汇编代码序列按地址顺序合并成一个。
(1)位置相邻的BasicBlock,如果并非由外部引用或跳转函数外部指令引起的分割,可以将其合并。
(2)相邻BasicBlock之间因为对外部引用造成分割时,如果低地址存在引用高地址时,两者可以合并。
(3)相邻BasicBlock存在相互引用时可以合并。
(4)与相同BasicBlock相互引用时可以合并。
步骤4.确定包含注入恶意代码的BasicBlock序列。具体方法是:首先将标注使用BasicBlock中包含导入表函数(除了GetProcAddress和LoadLibrary两个函数)的情况;然后使用寻找所有包含导入表函数数量为0的连续BasicBlock(用n-gramsF_BasicBlock表示);将长度最大的n-grams F_BasicBlock作为包含注入代码的BasicBlock序列。
(5)确定恶意代码的边界。根据以下算法确定由注入恶意代码组成的BasicBlock序列,这些序列中的所有代码就是本方法所求得的结果。
名称:恶意代码n-grams识别算法
输入:候选的n-grams数组Candidate_BBlocks和剩余的Rest_BBlocks
变量设置:head=0,tail=Candidate_BBlocks.Size-1,External_xref=0;
输出:恶意代码组成的子序列数组Mal_BBlocks
实现步骤:
1.>
1.1 如果Candidate_BBlocks[head]首地址是软件执行入口地址,执行2;
1.2 如果Candidate_BBlocks[head]首地址被外部引用,执行2;
1.3 如果Candidate_BBlocks[head]引用Rest_BBlocks,则将其加入Rest_BBlocks,head=head+1,执行1;
2.>
2.1 Candidate_BBlocks[rail]与Rest_BBlocks相互引用,tail=tail-1,执行2;
2.2执行3;
3.>如果head小于tail且,则执行:
3.1 如果External_xref大于1,head=head+1,Candidate_BBlocks[head]加入Rest_BBlocks,执行1;
3.2如果Candidate_BBlocks[head]引用Rest_BBlocks,External_xref=External_xref+1,tail=tail-1;
4.>
机译: 一种防止恶意软件在网络中传播的协作系统
机译: 一种防止恶意软件在网络中传播的协作系统
机译: 恶意软件,例如计算机病毒,一种防止执行的方法,涉及对指令子集实施置换,存储置换序号以及在执行模块中实施指令