论文部分内容阅读
摘 要:随着日益增加的系统安全脆弱性以及广泛使用的因特网技术,病毒等破坏性代码也日益猖獗,严重威胁着网络安全。本文介绍一种静态分析可执行程序代码的新方法,针对程序中使用的API函数及库函数序列静态地分析程序的行为,实现在不运行程序的前提下预警防范一些不安全行为,并基于此提出了一种基于函数识别的主动防御技术。
关键词:函数识别;静态分析;主动防御
中图分类号:TP393.08
计算机技术的不断发展使得信息系统的安全性变得更加脆弱,正是这些安全脆弱性导致病毒等不安全代码的产生与泛滥。不安全代码不仅给企业及用户带来巨大经济损失,而且使国家的安全面临着严重威胁。
随着Internet的开放性以及信息共享的进一步增强,恶意代码编写者的水平越来越高,他们利用各种隐藏加密技术、模糊变换技术等提高代码的生存能力。目前大多数商用反病毒软件使用基于“特征匹配”方法的检测系统,这种技术依赖于对已知病毒的专属信息特征的分析和提取,因而对未知或变形的恶意代码无法适用。基于语义的静态分析技术通常可以满足分析代码的任何要求,但由于分析过程相当复杂耗时,通常较难实现。本文描述的基于可识别函数序列的代码静态分析方法则是一种粗粒度的基于函数语义的恶意代码主动防御技术,能比较高效准确地识别程序行为,从而检测出未知恶意代码及一些变形代码。
1 代码分析方法
代码的分析方法主要有两种:静态分析和动态分析。静态分析是在不执行代码的前提下检查代码以确定动态执行时的属性,通常分为源代码分析、反汇编分析、二进制统计分析三种情况。动态分析则通过检测代码运行情况以检测程序行为,因此它依赖于代码的运行环境和不同的监测目标,也导致动态分析的不完全。
静态分析相比于动态分析具有自身优势,首先它并不受限于代码的一次执行过程因此能由代码推导出所有执行的特性。而动态分析技术得到的特征是由代码一次执行或多次执行的特性。此外,静态分析能在代码中恶意行为被激活之前检测出以防止进一步破坏系统,起到提前预警防护的作用。但是静态分析可能会得到大量冗余信息,分析结果也容易被代码分析得到的冗余信息迷惑,动态分析则可以确切地,有针对性地得到分析所需要的具体数据。
虽然两种分析技术有很大差别,但并不是相互对立的,代码的程序和行为之间有着强烈的依赖关系,决定了动态和静态分析相结合能达到更好的分析效果。可以先利用静态分析技术获得基本属性,对于无法静态检测出的属性则采用动态监控。本文描述的技术是采用静态分析方法,在反汇编的基础上识别函数序列,并以图形结构形式显示,通过分析调用结构图来分析代码的功能。
2 基本原理
2.1 理论依据
Windows是一个分层的操作系统,总体架构分为应用层和核心层。为了保持系统的稳定性,防止一些恶意行为破坏操作系统核心,应用层无法直接访问操作系统资源,而必须通过核心层提供的接口调用操作系统提供的功能函数。Windows核心层是以函数的方式提供服务的,这些服务函数统称为Application Programming Interface,简称API函数。
恶意代码与一般程序的区别在于执行一些特殊的动作来破坏系统,这就必然要通过调用API函数达到隐藏、复制等目的。因此通过分析恶意代码调用的API函数序列就可以基本判定程序执行的功能和动机,比如要读写文件就必然调用CreateFile(),OpenFile(),NtOpenFile(),ZwOpenFile()等函数,要访问网络就必然要使用Socket函数。用户在实际编写应用程序时通常不直接调用API函数而是通过编程环境自带的库函数实现各项功能,在静态编译的情况下,库函数直接存在于执行体的反汇编代码中,因此我们可以通过库函数来识别可执行程序的部分功能。
2.2 API函数调用方式
API函数调用分为静态调用和动态调用两种,前者是在启动程序的时候装入动态链接库和API函数,在使用函数的时候直接使用CALL指令调用函数。动态调用则是在程序运行的过程中再装入动态链接库文件和执行函数,然后调用该API函数的方法。
2.2.1 静态调用
高级语言编写的代码通常采用静态调用API函数的方式,即使用call指令调用相应的API函数。调用过程又分为直接调用和间接调用两种情况,直接使用call指令调用引入表中相应的地址或先将引入表中的地址转存到一个寄存器中然后通过寄存器调用API函数。
2.2.2 动态调用
动态链接机制使得程序可以在运行时链接函数库,函数库存在于自身的可执行文件里而不是像静态链接那样被拷贝到程序可执行文件里。这些动态函数库(DLL)只在被加载和执行阶段才链接到程序里而不是在链接阶段。动态调用实现模式如下:
3 方法描述
3.1 结构框架
系统主体由反汇编工具、规则库、函数识别、匹配判定器四部分构成,规则库和待测程序是系统的输入部分。规则库是整个分析过程的基础,是描述代码功能的特征库,其中的每一个特征项都是可识别函数的函数序列。规则库规定了代码分析系统的分析范围和功能模型,为了提高分析的准确性及扩展分析系统的功能,用户可以自定义规则库中的特定函数序列。
待测程序即为分析对象,它具有多种表现形态,而本文介绍的只是一种方法,可以适用于所有的代码分析。具体实现时可以根据实际情况选择合适的辅助工具,例如若选择dcc工具则可以分析Dos下的EXE文件和COM文件。当选择IDA Pro工具可以分析Windows的PE文件,包括DLL文件和EXE文件。由于IDA Pro的跨平台性,我们只需对系统稍作调整便可以分析Linux系统的可执行程序。目标程序经过反汇编工具解析成汇编代码并提取出可识别函数之后,构造相应的函数调用图,最后根据规则库中的函数序列与目标程序的函数序列进行匹配验证以得出分析报告进行响应。 3.2 函数识别
本文论述的方法是基于目标程序的可识别函数序列基础之上的静态验证,将代码的执行体看作是一个程序流程图,可识别函数是图的节点,通过分析判定函数调用过程获得程序的功能、意图等信息从而达到检测防护目的。
分析系统中库函数的识别流程如图3所示,编译器的确定是整个识别过程的前提,动态库和静态库分别采用不同的技术进行分析匹配。伪函数结构就是把汇编代码中出现的函数模块识别出来,根据汇编代码的特征函数模块最终都是以“CALL 地址 A”的形式出现在地址A开始地址处,所以识别函数模块即把“CALL 地址 A”中地址A开始的模块识别出来。又由于汇编代码形式的函数最后都是以“ret n ”的形式返回的,所以可以构造算法将汇编代码中的所有CALL指令中出现的函数模块识别出来。
3.3 函数调用图
函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系,它是有向图,而且通常属于无环图(当代码中没有直接或间接的递归)。正规定义如下:
P={p1,p2,…..}是一个程序的有穷子程序集,定义函数调用图C是一个三元组(N,E,h),N表示子程序集合,N中的每个ni代表程序中的一个子程序,E是边的集合,(ni,nj)∈E表示子程序pi与pj之间的调用与被调用关系,其中每条边都是有向边,h表示主程序。
4 结束语
基于可识别函数序列的代码分析方法是一种非常有应用前景的网络安全技术,它根据程序利用的一系列函数从语义上分析目标程序的意图和功能。由于这种方法检测的是一般的可疑逻辑而不是特定的程序特征,因此从理论上说是可以非常可靠地预防恶意行为尤其是未知恶意行为的攻击。本文在研究和应用开发实践的基础上提出了一种可行的主动防御系统实现方案,给出整体结构框架,并详细了描述各功能模块的工作原理。
参考文献:
[1]虞震.免疫联想记忆及其在计算机病毒检测中的应用研究[D].中国科学技术大学,2004.
[2]文伟平.恶意代码机理与防范技术研究[D].中国科学院研究生院,2004.
[3]陈月玲,贾小珠.基于程序行为的计算机病毒检测方法[J].青岛大学学报,2006.
[4]赖英旭,李征.未知病毒检测技术的研究[J].计算机科学,2006.
作者简介:马文岩(1979.07-),男,河北涿州人,工程师,学士学位,研究方向:网络安全。
作者单位:电子工程学院,北京 102488
关键词:函数识别;静态分析;主动防御
中图分类号:TP393.08
计算机技术的不断发展使得信息系统的安全性变得更加脆弱,正是这些安全脆弱性导致病毒等不安全代码的产生与泛滥。不安全代码不仅给企业及用户带来巨大经济损失,而且使国家的安全面临着严重威胁。
随着Internet的开放性以及信息共享的进一步增强,恶意代码编写者的水平越来越高,他们利用各种隐藏加密技术、模糊变换技术等提高代码的生存能力。目前大多数商用反病毒软件使用基于“特征匹配”方法的检测系统,这种技术依赖于对已知病毒的专属信息特征的分析和提取,因而对未知或变形的恶意代码无法适用。基于语义的静态分析技术通常可以满足分析代码的任何要求,但由于分析过程相当复杂耗时,通常较难实现。本文描述的基于可识别函数序列的代码静态分析方法则是一种粗粒度的基于函数语义的恶意代码主动防御技术,能比较高效准确地识别程序行为,从而检测出未知恶意代码及一些变形代码。
1 代码分析方法
代码的分析方法主要有两种:静态分析和动态分析。静态分析是在不执行代码的前提下检查代码以确定动态执行时的属性,通常分为源代码分析、反汇编分析、二进制统计分析三种情况。动态分析则通过检测代码运行情况以检测程序行为,因此它依赖于代码的运行环境和不同的监测目标,也导致动态分析的不完全。
静态分析相比于动态分析具有自身优势,首先它并不受限于代码的一次执行过程因此能由代码推导出所有执行的特性。而动态分析技术得到的特征是由代码一次执行或多次执行的特性。此外,静态分析能在代码中恶意行为被激活之前检测出以防止进一步破坏系统,起到提前预警防护的作用。但是静态分析可能会得到大量冗余信息,分析结果也容易被代码分析得到的冗余信息迷惑,动态分析则可以确切地,有针对性地得到分析所需要的具体数据。
虽然两种分析技术有很大差别,但并不是相互对立的,代码的程序和行为之间有着强烈的依赖关系,决定了动态和静态分析相结合能达到更好的分析效果。可以先利用静态分析技术获得基本属性,对于无法静态检测出的属性则采用动态监控。本文描述的技术是采用静态分析方法,在反汇编的基础上识别函数序列,并以图形结构形式显示,通过分析调用结构图来分析代码的功能。
2 基本原理
2.1 理论依据
Windows是一个分层的操作系统,总体架构分为应用层和核心层。为了保持系统的稳定性,防止一些恶意行为破坏操作系统核心,应用层无法直接访问操作系统资源,而必须通过核心层提供的接口调用操作系统提供的功能函数。Windows核心层是以函数的方式提供服务的,这些服务函数统称为Application Programming Interface,简称API函数。
恶意代码与一般程序的区别在于执行一些特殊的动作来破坏系统,这就必然要通过调用API函数达到隐藏、复制等目的。因此通过分析恶意代码调用的API函数序列就可以基本判定程序执行的功能和动机,比如要读写文件就必然调用CreateFile(),OpenFile(),NtOpenFile(),ZwOpenFile()等函数,要访问网络就必然要使用Socket函数。用户在实际编写应用程序时通常不直接调用API函数而是通过编程环境自带的库函数实现各项功能,在静态编译的情况下,库函数直接存在于执行体的反汇编代码中,因此我们可以通过库函数来识别可执行程序的部分功能。
2.2 API函数调用方式
API函数调用分为静态调用和动态调用两种,前者是在启动程序的时候装入动态链接库和API函数,在使用函数的时候直接使用CALL指令调用函数。动态调用则是在程序运行的过程中再装入动态链接库文件和执行函数,然后调用该API函数的方法。
2.2.1 静态调用
高级语言编写的代码通常采用静态调用API函数的方式,即使用call指令调用相应的API函数。调用过程又分为直接调用和间接调用两种情况,直接使用call指令调用引入表中相应的地址或先将引入表中的地址转存到一个寄存器中然后通过寄存器调用API函数。
2.2.2 动态调用
动态链接机制使得程序可以在运行时链接函数库,函数库存在于自身的可执行文件里而不是像静态链接那样被拷贝到程序可执行文件里。这些动态函数库(DLL)只在被加载和执行阶段才链接到程序里而不是在链接阶段。动态调用实现模式如下:
3 方法描述
3.1 结构框架
系统主体由反汇编工具、规则库、函数识别、匹配判定器四部分构成,规则库和待测程序是系统的输入部分。规则库是整个分析过程的基础,是描述代码功能的特征库,其中的每一个特征项都是可识别函数的函数序列。规则库规定了代码分析系统的分析范围和功能模型,为了提高分析的准确性及扩展分析系统的功能,用户可以自定义规则库中的特定函数序列。
待测程序即为分析对象,它具有多种表现形态,而本文介绍的只是一种方法,可以适用于所有的代码分析。具体实现时可以根据实际情况选择合适的辅助工具,例如若选择dcc工具则可以分析Dos下的EXE文件和COM文件。当选择IDA Pro工具可以分析Windows的PE文件,包括DLL文件和EXE文件。由于IDA Pro的跨平台性,我们只需对系统稍作调整便可以分析Linux系统的可执行程序。目标程序经过反汇编工具解析成汇编代码并提取出可识别函数之后,构造相应的函数调用图,最后根据规则库中的函数序列与目标程序的函数序列进行匹配验证以得出分析报告进行响应。 3.2 函数识别
本文论述的方法是基于目标程序的可识别函数序列基础之上的静态验证,将代码的执行体看作是一个程序流程图,可识别函数是图的节点,通过分析判定函数调用过程获得程序的功能、意图等信息从而达到检测防护目的。
分析系统中库函数的识别流程如图3所示,编译器的确定是整个识别过程的前提,动态库和静态库分别采用不同的技术进行分析匹配。伪函数结构就是把汇编代码中出现的函数模块识别出来,根据汇编代码的特征函数模块最终都是以“CALL 地址 A”的形式出现在地址A开始地址处,所以识别函数模块即把“CALL 地址 A”中地址A开始的模块识别出来。又由于汇编代码形式的函数最后都是以“ret n ”的形式返回的,所以可以构造算法将汇编代码中的所有CALL指令中出现的函数模块识别出来。
3.3 函数调用图
函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系,它是有向图,而且通常属于无环图(当代码中没有直接或间接的递归)。正规定义如下:
P={p1,p2,…..}是一个程序的有穷子程序集,定义函数调用图C是一个三元组(N,E,h),N表示子程序集合,N中的每个ni代表程序中的一个子程序,E是边的集合,(ni,nj)∈E表示子程序pi与pj之间的调用与被调用关系,其中每条边都是有向边,h表示主程序。
4 结束语
基于可识别函数序列的代码分析方法是一种非常有应用前景的网络安全技术,它根据程序利用的一系列函数从语义上分析目标程序的意图和功能。由于这种方法检测的是一般的可疑逻辑而不是特定的程序特征,因此从理论上说是可以非常可靠地预防恶意行为尤其是未知恶意行为的攻击。本文在研究和应用开发实践的基础上提出了一种可行的主动防御系统实现方案,给出整体结构框架,并详细了描述各功能模块的工作原理。
参考文献:
[1]虞震.免疫联想记忆及其在计算机病毒检测中的应用研究[D].中国科学技术大学,2004.
[2]文伟平.恶意代码机理与防范技术研究[D].中国科学院研究生院,2004.
[3]陈月玲,贾小珠.基于程序行为的计算机病毒检测方法[J].青岛大学学报,2006.
[4]赖英旭,李征.未知病毒检测技术的研究[J].计算机科学,2006.
作者简介:马文岩(1979.07-),男,河北涿州人,工程师,学士学位,研究方向:网络安全。
作者单位:电子工程学院,北京 102488