一种恶意代码检测方法

文档序号:7690754阅读:275来源:国知局
专利名称:一种恶意代码检测方法
技术领域
本发明涉及一种基于语义的恶意代码检测方法,可以完整地刻画基于函数调用的攻击 行为,并有效地识别二进制可疑程序中的恶意行为。属于互联网安全技术领域。
背景技术
随着网络和计算机技术的快速发展,恶意代码的种类、传播速度、感染数量和影响范 围都在逐渐增强。恶意代码已经成为威胁互联网安全和计算机系统安全的重要因素,对恶 意代码的分析和检测是所有安全策略中的重要环节。传统的最为广泛使用的恶意代码检测技术是基于特征码的检测技术。它提取恶意代码 中某个二进制片断作为该恶意代码的"指纹",当反病毒软件扫描文件时,将当前的文件 与病毒特征码库进行对比,通过字串匹配方式判断是否有文件片段与已知样本吻合,从而 完成对目标系统进行检测和防护的目的。但是这种方法不能识别特征未知的恶意代码,而且新病毒的特征码或"指纹"的发布 永远落后于病毒的传播。而且由于不同的语法表达可能有相同的语义,因而传统的指纹匹 配检测方式很容易被绕过,传统的检测方法也不能识别同一个恶意代码的多态或变形。为了解决基于特征码检测的方法所存在的这些问题,本发明采用基于语义的恶意代码 分析方法。所谓语义,是指高于语法层次的对语言的理解,它抽象的反映了语言的含义。 与之不同的是,语法更注重于语言的组织与实现。因此,同一个语义可能有不同的语法表 达方式来表达。基于语义的方法使用抽象语义来分析并刻画程序的行为。这样,只需要记录恶意行为 的语义层次的特征,那么通过语法层次上修改代码但是保持语义的新的恶意代码仍然能够 被检测出来。而且未知的软件如果有代码片段具有恶意行为的语义特征,那么可以认为它 是恶意软件。从而,基于语义的检测方法,可以对抗对语法层次上代码的修改和检测未知 的恶意软件。本发明采用有穷状态自动机来刻画恶意代码的抽象语义。有穷状态自动机(Finite States Automata, FSA)是一个五元组(Q, A, S , ql, F),其中 Q表示状态集,并且是非空有限集合;A表示输入字母表,是所有可能的输入字母的集合; S表示一个状态转移函数,定义域是QXA,值域是Q,也就是说,任意的当前状态,接 受任意一个输入字母,根据状态转移函数可以到达另外一个状态或者停机(当当前没有输 入字母了或者状态转移函数对当前状态以及输入字母无定义时停机);ql表示状态集Q 中一个特定的元素,称为初始状态;F表示Q的一个子集,称为接受状态集。准确的描述 可以参考《可计算性与计算复杂性导引》(第二版),张立昂著,北京大学出版社,2004 年7月,93页。对于一组给定的输入字母,从初始状态ql开始,根据状态转移函数,最后停机在某 一状态。那么根据这个自动机,可以判断一个输入字符串(输入字母序列)最终能否到达 接收状态。所有能到达接收状态的输入字符串称为该有穷状态自动机接受的语言。非形式 化的说,自动机的作用就是描述了不同状态之间转换的过程,能够判断一个给定的输入串 能否从一个初始状态到达一些特定的状态。任何一个有穷状态自动机都可以用一个有向图来表示,其中只需要把状态当作节点, 把输入字母当作边, 一个状态转移就得到从一个节点到另一个节点的边。本发明另外使用下推自动机来刻画待检测程序的抽象语义。下推自动机(PDA)是一个7元组(Q, A, Q, S, ql, X0, F)。其中,Q表示非 空有穷的状态集;A表示输入字母表;Q表示栈字母表;S表示函数(或状态转移函数), 定义域是QX (AU e ) XQ,值域是QXQf (Q*代表栈字母表Q所组成的字符串), 也就是说,从任意的当前状态,接受一个输入字母或O个输入字母(e代表空的),以及 当前栈顶字母,该动作函数就可以更改当前状态,同时把栈顶的字母更改为一个字符串; ql表示初始状态;XO表示初始的栈顶字母;F表示状态集Q的一个子集,称为接受状态 集。准确的描述可以参考《可计算性与计算复杂性导引》(第二版),张立昂著,北京大 学出版社,2004年7月,121页。对于一组给定的输入字母,从初始状态ql开始,根据状态转移函数,最后停机在某 一状态。那么,根据这个下推自动机,可以判断一个输入字符串最终能否到达接收状态。 所有能到达接收状态的输入字符串称为该下推自动机接受的语言。非形式化的说,下推自 动机是在有穷状态机上加一个"先进后出"的栈。与有穷状态自动机不同的是,下推自动机有一个栈,这个栈可以很好的模拟真实程序执行时的栈空间,从而实现真实程序中函数调用、嵌套等复杂的控制结构。因而,把程序 的可能状态作为状态集Q,把所有动作作为输入字母集A,把相应的函数调用、嵌套等用 栈实现,就能用一个下推自动机描述程序的全局状态空间。发明内容本发明的目的在于提供一种基于语义的恶意代码检测方法。为了实现上述技术目标,本发明方法提出了一种描述规则,能够有效的描述基于函数 调用的恶意行为,并且记录下常见的恶意行为的描述;然后利用现有工具反汇编待检测的 可疑程序,生成程序的下推自动机;再结合现有的模型检验方法,通过已有的恶意行为描 述的记录和待检测程序的下推自动机有效的检测可疑程序中是否包含恶意行为。下面对本发明方法的技术方案作进一步描述。本发明包含以下几个重点1. 获得已知恶意行为的有穷状态自动机本发明方法通过分析已知恶意行为,把恶意行为按照其功能划分为文件访问、网络传 输等不同的功能构件,然后在各个构件中仔细分析恶意行为的关键步骤(比如某些API调 用),并且通过这种特定的关键步骤以及它们之间的时序关系和状态关系来标识这种恶意行为。本发明使用有穷状态自动机(Finite States Automata, FSA)来描述恶意行为的关键步骤 以及它们之间的时序关系,简言之,本发明采用有穷状态自动机来描述恶意行为。每一种恶意行为都可以建立相应的有穷状态自动机描述,可以搜集各种已知的恶意行 为的有穷状态自动机描述,然后建立一个类似于病毒库的恶意行为描述库,以供后续的可 疑程序检测中使用。2. 获得待检测的二进制可疑程序的下推自动机上述已知恶意行为的自动机只能描述一个特定的恶意行为需要的步骤和相应的状态 转移情况。而在一个真实的程序中, 一个恶意行为的步骤可能分布在程序中的不同位置, 并且一个程序还包括其它许多的状态和动作。因此,需要描述程序整体的状态变化情况, 也就是需要描述程序的全局状态空间。如上所述,真实程序可能包含复杂的函数调用、嵌套等复杂的控制结构,因此在真实 程序实现时采用的是一个栈结构来处理。本发明使用一个带有栈结构的自动机来描述程序 的全局状态空间,也就是说可以用一个下推自动机来描述程序的全局状态空间。对于可疑的程序(二进制可执行文件),本发明首先对其反汇编(从机器语言转化为 汇编语言),然后反编译,将其转换为中间语言,接着根据中间语言生成程序的下推自动 机。从而,每一个程序都可以用一个下推自动机描述其全局状态空间,而且这一步可以通 过现有的一些工具和方法实现。3.恶意行为检测有了已知恶意行为的自动机,以及可疑程序的下推自动机之后,接着就可以检测它们 分别接受的语言有没有交集。如果有一个输入字符串能够同时被有穷状态自动机和下推自 动机接受,那么,也就是说,待检测的可疑程序包含有已知的恶意行为,则判定该可疑程 序为恶意程序(关于自动机接受的语言以及字符串的概念,在具体实施方式
中有详细的说 明)。现有技术中已经存在通过已知的算法判断一个自动机FSA以及一个下推自动机PDA 的接受语言的交集是否为空的技术。因此,这一步可以使用已有的模型检验方法,把待检 测的可疑程序的下推自动机,以及已经建立的恶意行为自动机描述库当作输入,利用已有 的工具进行判断。并且如果程序中存在恶意行为,则输出包含恶意行为的程序执行路径。 所谓的程序执行路径,反映的是程序所执行的语句序列,可以用程序的控制流图中的路径 来描述,也可以直接用程序中的语句序列来描述。本发明利用有穷状态自动机来描述恶意行为,结合现有的工具和方法把可疑程序转换 为下推自动机,然后利用已有的模型检验方法来检测可疑程序中是否包含恶意代码。与现 有技术相比,本发明具有以下优点-1. 能够描述恶意行为的复杂上下文关系和控制流信息;2. 支持对恶意代码的流敏感、上下文敏感且路径敏感的函数间分析;3. 能够扩展较少的恶意行为,从而检测许多未知的恶意代码。


图1是本发明方法的流程2是描述杀死反病毒软件进程的恶意行为的有穷状态机模型 图3是描述修改注册表的恶意行为的有穷状态机模型图4是描述击键记录的恶意行为的有穷状态机模型图5是描述记录当前窗口的恶意行为的有穷状态机模型图6是描述DDOS攻击的恶意行为的有穷状态机模型具体实施方式
下面结合附图和具体实施方式
对本发明作进一步详细描述。 一.获得已知恶意行为的有穷状态自动机本实施例通过分析己知的恶意行为的关键步骤(比如一些API调用)以及它们之间的 时序关系,判断程序状态间的变化情况,并采用有穷状态自动机描述这些恶意行为。有穷状态自动机的构建过程如下把已知的恶意行为在各个关键步骤之前或者之后的 状态作为状态集Q,把关键步骤的动作如API调用作为输入字母表A,根据已知恶意行为 的恶意代码的具体执行情况建立状态转移函数S ,而把恶意行为触发之后的状态作为接收 状态集F,初始状态为ql,就可以建立一个有穷状态自动机。根据上面描述,给定一个输 入字符串(程序的动作序列),能够判定最终能否到达接收状态(恶意行为被触发)。也 就是说,这个自动机能够很好的描述恶意行为。下面给出一些具体的实例,包括两种系统行为——杀死反病毒软件进程行为和自启动 行为,以及两种网络行为——击键记录行为和分布式拒绝服务(DDoS)攻击行为 (1).杀死反病毒软件进程行为一些恶意软件为了提高自身存活率,通过实时监视系统进程,及时杀死某些著名反病 毒软件或者监控软件的进程,从而达到保护自己的目的。图2表示使用ToolHdp API系列函数实现杀死反病毒软件进程的目的的有限状态机。 程序初始状态为a0,调用x-CreateToolhelp32Snapshot()取得快照句柄,程序状态从a0到 达al,然后使用Process32First()和Process32Next()枚举当前的进程,程序状态分别从al 到达a2和从a2到达a3。恶意软件通常维护一个反病毒软件进程名称的列表,枚举过程中 逐一判断进程名是否存在该列表中,若存在则调用y-OpenProcess()函数取得目标进程的句 柄,程序状态从a3到达a4。然后调用函数TerminateProcess(y,O)终止该进程,程序状态从 a4到达a5。最后CloseHandle(x)关闭快照句柄,程序状态从a5到达终止状态a6。若程序 使得该状态机到达结束状态a6,则程序中存在杀死反病毒软件进程行为。(其中x,y为自 由变量,每个自由变量在程序中的每次出现有一致的取值)。具体来说,针对这个恶意行为,设定CreateToolhelp32Snapshot(), Process32First(), Process32Next(), OpenProcess(), TerminateProcess(), CloseHandle()这几个函数调用是关键行 为,然后分析其时序关系和状态转移关系,得到具体的有限状态自动机。这里的有限状态 自动机的状态集Q={a0, al, a2, a3, a4, a5, a6},输入字母表A={CreateToolhelp32Snapshot(), Process32First(), Process32Next(), OpenProcess(), TerminateProcess(), CloseHandle(》,接受状 态集F^a6),初始状态q^a0,状态转移函数S定义方式就是上面所描述的接受输入字母 时状态转移的情况。具体来说就是,程序初始状态为a0,调用x-CreateToolhelp32Snapshot() 取得快照句柄,程序状态从a0到达al,那么S (aO, CfeateToolhelp32Snapshot())=al , S函 数对其他几个的定义与之类似。(2) .自启动行为恶意软件除了要进行传播外,还要将自身加载到目标系统当中,以实现对被植入木马 的计算机进行远程控制的目的,因此通常要能够实现自启动。图3表示通过修改注册表实现自启动的有限状态机。程序的初始状态为b0;调用 RegOpenKeyEx(x,"或RegCreateKeyEx(x,)函数打开或创建一个键,程序状态从b0到达bl; 调用RegSetValueEx(x,)或RegDeleteKey(x,)设置键值或删除一个键,程序状态从bl到达 b2;调用RegCloseKey(x)关闭键,程序状态从b2到达终止状态b3。若程序使得状态机到 达终止状态b3,则程序中存在自启动行为。(其中x为自由变量,在程序中的每次出现有 一致的取值;*表示任意多个参数)。(3) .击键记录行为恶意软件通过击键监控对被控计算机交互过程中的用户键盘输入和计算机的反应数 据进行检査或记录,识别软件系统的登录操作从而获取帐号信息等。图4表示击键记录的有限状态机。程序初始状态为c0,调用GetAsyncKeyState()函数 根据虚拟键表判断按键类型,程序状态从cO到达cl;调用send()或者fsend()等将按键信息 发送给控制端,程序状态从cl到达终止状态c2。若程序使得该状态机到达状态c2,则程 序存在记录击键信息的行为。图5表示窗口记录行为的有限状态机。程序初始状态为d0,调用 x-GetForegroundWindow()函数得到程序当前窗口的句柄,程序状态从d0到达dl;调用 GetWindowText(x,"函数得到该窗口的标题,程序状态从dl到达d2;调用send()或者fsend() 等将按键信息发送给控制端,程序状态从d2到达终止状态d3。(其中x为自由变量,在 程序中的每次出现有一致的取值;*表示任意多个参数)。这两种行为可以结合起来,比如记录在某个窗口 (例如网上银行等)中所有的击键记 录,包括密码及帐号等信息。(4).分布式拒绝服务攻击行为攻击者可以使用被恶意代码入侵的机器进行协同攻击,例如分布式拒绝服务攻击 (DDos),将大量数据发送到特定的宿主或网站,使其停止对合法通信的响应(或者无法响 应)。如图6表示DDoS攻击的有限状态机。程序初始状态为e0,进入循环体(loop—entry, 通常是无条件循环)使得程序状态由eO到达el;若在状态el时循环结束(loop—exit), 则程序回到初始状态eO;在el状态调用函数send()、 sendto()等函数向目标机器发送数据, 程序状态从el到达e2;在e2状态,若调用了 recv等函数接收数据,则为正常的网络通信, 程序回到状态el;若循环结束(loop—exit)使得e2到达结束状态e3。若程序使得状态机 到达结束状态e3,则程序中存在拒绝服务攻击。二、获得待检测的二进制可疑程序的下推自动机对于待检测的可疑程序(二进制可执行文件),首先对其反汇编以及反编译,从机器 语言转化为汇编语言,提取汇编语言中的控制流和数据流,将标准化的程序生成面向安全 分析的中间语言,接着根据中间语言生成程序的下推自动机。下推自动机的建立过程大概如下在有限状态机的基础上,添加了一个栈以及一些栈 符号。这个栈记录了还未结束的函数调用的返回地址,栈顶记录了下一条指令的位置;栈 符号就是一些地址等信息;根据程序的具体执行情况,可以建立状态转移函数。这个下推 自动机接受的一个字符串就是实际程序的一个执行路径所包含的动作序列。具体的实现方 法可以参考 H. Chen and D. Wagner. MOPS: an infrastructure for examining security properties of software. Technical Report UCB〃CSD-02-l 197, UC Berkeley, 2002。本发明使用标准的反汇编方法完成程序的反汇编工作,得到其中的汇编指令、数据说 明、函数引入说明等信息。然后分析和识别控制流以及数据流,完成对动态API调用的识 别。在控制流分析和数据流分析的基础上,将汇编程序转换为自定义的面向安全分析的中 间语言程序。将每个中间转换为抽象语法树和抽象语法树的流图,使用现有的算法建立可 执行程序的PDA,以表示程序的全局状态空间。三、恶意行为的检测步骤假设已经有了一个有穷状态自动机f,其所接受的语言L(f),和一个下推自动机p,其 所接受的语言为L(p)。在自动机理论中,有经典算法能够根据有穷状态自动机f和下推自 动机p构造出一个新的下推自动机q,使得q所接受的语言L(q)恰好等于L(f)nL(p)。这一 个算法的具体实现可以参考自动机理论的文献和书籍,例如参考《自动机理论、语言和计 算导论》(美)Jhon E. Hopcroft、 Rajeev Motwani、 Jeffrey D. UUman著,刘田、姜晖、 王捍贫译{Introduction to Automata Theory, Languages, and Computation Second Edition》, 机械工业出版社,中信出版社,2007年6月第1版第3次印刷,第199页。上述过程求出了有穷状态自动机和下推自动机各自接受的语言的交集,且得出结论这 个交集语言恰好被一个新的有穷状态自动机接受。同样使用自动机理论中的经典算法可以 判定一个下推自动机接受的语言是否为空,从而就可以判断原始的有穷状态自动机和下推 自动机各自接受的语言的交集是否为空。本实施例使用现有的工具例如MOPS的model checker来做恶意行为的检测。这个模 型检测工具的实现原理与上述的求交和判断非空的算法基本相似,因而它可以把待检测程 序的下推自动机以及恶意行为的有穷状态自动机作为输入,能够有效的检测一个有限状态 自动机与一个下推自动机的接受的语言的交集是否为空。如果为空,那么说明待检测的程 序所有执行路径上,都不包含该恶意行为的动作序列;反之则说明,待检测的程序可能包 含恶意行为的动作序列,这个模型检测工具就会输出包含该恶意行为的程序执行路径。相 关实现过程可以参考H. Chen and D. Wagner. MOPS: an infrastructure for examining security properties of software. CCS,02, November 18—22, 2002, Washington, DC, USA.
权利要求
1. 一种恶意代码检测方法,其特征在于,包含如下步骤a)获得已知恶意行为的有穷状态自动机;b)建立待检测的二进制可疑程序的下推自动机;c)使用模型检验方法检测步骤b)所述的下推自动机接受的语言和步骤a)所述的有穷状态自动机接受的语言之间是否有交集,若是,则判定上述待检测的可疑程序为恶意程序。
2. 如权利要求1所述的恶意代码检测方法,其特征在于,步骤a)所述的有穷状态自动机通过下述方法获得由已知恶意代码得到一个或多个恶意代码功能组件,提取每个功能组件中的关键行为 及其行为时序序列,进而对其作自动机描述从而得到已知恶意行为的有穷状态自动机。
3. 如权利要求2所述的恶意代码检测方法,其特征在于,将获得的已知恶意行为的有穷状态自动机合并成已知恶意行为描述库,并不断更新其中的已知恶意代码的有穷状态自动 机。
4. 如权利要求3所述的恶意代码检测方法,其特征在于,所述恶意行为描述库包含杀死 反病毒软件进程的恶意代码的有穷状态自动机,自启动操作系统的恶意代码的有穷状态自 动机,击键记录的恶意代码的有穷状态自动机,和分布式拒绝服务攻击的恶意代码的有穷 状态自动机。
5. 如权利要求1所述的恶意代码检测方法,其特征在于,步骤b)所述的下推自动机通过下述方法获得i. 对待检测的二进制可疑程序执行反汇编得到汇编语言;ii. 对上述汇编语言执行反编译得到中间语言;Hi.由上述中间语言生成该二进制可疑程序的一个或多个下推自动机;
6. 如权利要求1所述的恶意代码检测方法,其特征在于,步骤C)所述的模型检验方法为使用MOPS的model checker进行检测。
7.如权利要求1所述的恶意代码检测方法,其特征在于,步骤c)之后还输出程序中的包 含恶意行为的执行路径。
全文摘要
本发明公开了一种基于语义的恶意代码检测方法,可以完整地刻画基于函数调用的攻击行为,并有效地识别二进制可疑程序中的恶意行为,属于互联网安全技术领域。本发明方法包含a)获得已知恶意代码的有穷状态自动机;b)获得待检测的二进制可疑程序的下推自动机;c)使用模型检验方法检测所述的下推自动机和所述有穷状态自动机之间是否存在可以同时被两者接收的输入字符串,若是,则判定上述待检测的可疑程序为恶意程序。本发明利用有穷状态自动机来描述恶意行为,结合现有的工具和方法把可疑程序转换为下推自动机,然后利用已有的模型检验方法来检测可疑程序中是否包含恶意代码。可有效地用于互联网安全技术领域的恶意代码检测。
文档编号H04L29/06GK101266550SQ20081008957
公开日2008年9月17日 申请日期2008年4月8日 优先权日2007年12月21日
发明者超 张, 戴帅夫, 李佳静, 剑 毛, 王铁磊, 赵新建, 维 邹, 韬 韦 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1