王静+++梁大钊+++吴永顺+++饶丽萍+++黄晓生
【摘要】目前,计算机病毒的存在成为了信息安全的一大威胁,其中以Windows32 PE文件为感染目标的PE病毒最为盛行,功能最强,分析难度也最大。对此,本文研究了一种面向PE病毒检测的行为特征分析方法,详细分析PE病毒执行过程中的关键行为特征、一般行为特征等,并以其十六进制行为字符串特征码作为PE病毒的检测依据,通过对可疑PE文件中字符串的匹配实现PE病毒的启发式检测。
【关键词】PE病毒;行为分析;病毒检测;可执行文件
1引言
随着计算机技术的飞速发展,计算机病毒也层出不穷、日益猖獗,病毒技术日新月异、纷繁复杂,成为了信息安全的一大威胁。其中Windows32位的PE(Portable Executable,可移植的执行体)病毒最为盛行,破坏力极大,分析难度也最大。它是以Windows系统(Windows 9X、NT、2000)下的具有PE文件结构的可执行文件为感染目标,具有极强的技巧性,也使得绝大多数的病毒高手钟爱编写PE病毒,以更好的展现其病毒技术,这也就为广大反病毒工作人员提出了更多的挑战。因此,深入分析PE文件结构,掌握PE病毒的一般行为特征是有效对抗PE病毒的关键。王成等人提出了基于可疑行为识别的PE病毒检测方法,研究了Windows 平台下PE病毒的静态检测;刘帅也提出了一种基于Win32API相关行为静态检测PE病毒的方法等,这些方法都是通过分析病毒的可能行为实现对未知病毒的启发式检测,只是行为确定和行为识别的方法不同而已。
本文首先详细分析了PE病毒实现中具有的主要行为特征,并将其作为判断PE文件是否可疑的依据,构建PE病毒行为字符串特征值,通过获取目标文件各个节的十六进制字符串,并与行为特征字符串匹配的方法实现对PE病毒的启发式检测。
2PE病毒行为特征分析
不同的PE病毒虽然都会具有不同的传播和破坏行为,但是为了确保病毒能更容易的获得运行权,更好地保护自己长久的生存,更准确地执行其既定的功能,PE病毒就必定会执行一些固有的操作,表现出共性的行为,因此,分析病毒的一般行为特征,可以为更准确地启发式病毒查杀提供合理的依据。
2.1PE病毒关键行为特征
2.1.1 病毒中变量的重定位
PE病毒为了完成特定程序性功能会使用到若干变量,而这些变量在数据写入目标文件之前已经经过编译,被分配了一个确定的内存地址,当将数据写入目标PE文件之后,变量并没有重新编译,仍然使用原有地址,此时会导致该地址与同样已经编译好的目标PE文件中的地址发生冲突,导致该变量无法使用,而目标PE文件也将无法执行,因此必须对PE病毒写入的变量进行重定位。
2.1.2 寻找系统内存中Kernel32的基地址
PE病毒在传播与感染过程中使用到文件搜索、文件读写等一系列的API函数,这些API函数的地址已经动态的映射在目标PE文件的内存空间中,要使用这些必须的API函数就要在目标PE文件中寻找相关API函数的地址。由于Kernel32.dll中包含两个重要的API函数LoadLIbrary和GetProcAddress,可以通过其实现对系统中任意dll格式文件中导出的任意函数在进程空间的地址的获取,因此,对于PE病毒来说,动态获取API函数的首要操作就是找到Kernel32.dll的基地址。
2.2PE病毒的基本行为特征
PE病毒的基本行为是在不破坏感染目标PE文件的基础上,向目标PE文件写入具有特定破坏和传播功能的数据,既可以确保原PE文件的正常执行而不被用户发现,又可以寄生于该宿主文件,随文件的运行而执行其特定的功能。
为了实现该目的,PE病毒一般会完成几个操作。
(1)搜索磁盘中的目标PE文件
常见的PE病毒都会搜索并判断系统中的PE格式文件,将搜索到的未被其感染过的PE格式文件作为其感染目标。常用的函数包括FindFile、FindNextFile、IsDirectory、GetFilePath、Find(“.exe”)等。
(2)将目标PE文件映射进内存
PE病毒为了向目标PE格式文件写入设定好已经具有特定功能的数据,需要把目标文件整体内容映射到内存中,并且使用映射的文件句柄对目标进行文件读写操作。常用的函数包括CreateFile、MapViewOfFile、CreateFileMapping等。
(3)向目标PE文件写入病毒功能代码
向目标PE文件写入内容,PE病毒的目的是通过向PE格式文件写入特定功能的数据,达到操作系统执行PE病毒制造者想要的行为。常用的函数包括fopen、fread、fputc、fseek。
(4)修改目标PE文件入口点
为了确保病毒先于PE文件的运行而执行,向目标PE格式文件写入特定数据后,PE病毒需要修改目标PE文件的入口点,如图1所示,使该入口点指向病毒的功能代码,确保程序被加载进内存后首先执行病毒程序。
(5)返回目标PE文件原始入口
为了使PE病毒能够长久的生存,PE病毒必须要最大程度的实现在用户毫不知情的情况下完成其传播与感染操作,因此,一般的病毒代码都会在先于宿主PE文件执行完毕后,通过跳转指令返回HOST程序原入口点执行,如图1所示,以完成宿主PE文件原有的功能,使用户察觉不到病毒的运行。
2.3PE病毒其他行为特征
PE病毒为了能更容易的获得运行权,更好地保护自己,一般还会具有修改注册表、修改自启动文件等行为,以实现开机自启动、禁用注册表、禁用杀毒软件等功能。
例如,通过在注册表中的以下位置添加新项来实现一些功能:
"Software\\Microsoft\\Windows\\CurrentVersion\endprint
Run"
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
同时,病毒会修改系统的开机配置文件来实现开机自启动,而这些行为会存在差异,可通过辅助使用注册表监控与文件监控等行为监控工具进行检测。
3基于行为特征的PE病毒检测
PE病毒行为检测方法主要是以病毒行为特征作为判定基础,对目标文件使用字符串匹配的方法来确定是否具有可疑行为,其检测流程如图2所示。
3.1确定PE病毒行为字符串特征库
为了准确判断目标PE文件是否存在可疑行为,在详细分析PE病毒行为特征的基础上,获取其行为特征对应的十六进制字符串构造字符串特征库,作为检测PE病毒的依据。
(1)病毒中变量的重定位
在PE病毒中最常用的是调用call指令来得到一个参考变量在内存中的真实地址,然后,将该地址与参考变量和重定位变量的偏移地址做运算来得到重定位变量的内存地址。其主要的汇编指令与对应的十六进制码如表1所示。
(2) 获取系统内存中Kernel32.dll基地址
病毒在使用CreateProcess函数完成装载应用程序后,系统会先将一个返回地址压入到堆栈顶端,而这个返回地址恰好在Kernel32.dll中,利用这个原理病毒顺着这个返回地址按64KB大小向低地址搜索,直到找到Kernel32模块的基地址为止。
(3)搜索磁盘中的目标PE文件
常见的PE病毒会遍历磁盘中的全部分区进行目标PE文件的搜索,同时,对分区中的每一个目录进行递归查找PE格式的文件。使用FindFile函数查找指定路径,对当前路径使用FindNextFile函数获得下一个文件句柄后,IsDirectory函数判断文件是否为目录,是目录则用GetFilePath得到文件路径再递归调用查找函数,否则,Find(".exe")判断文件的后缀名是否为.exe,而这些基本行为对应的十六进制字符串如表3所示。
(4)将目标PE文件映射进内存
为了获取文件映射句柄对目标文件进行读写操作,需首先将目标PE文件映射到系统内存空间,其基本行为对应的十六进制字符串如表4所示。
(5)向目标PE文件写入病毒功能代码
首先采用fopen函数以读写或是只读的方式打开目标文件,用fseek函数定位打开文件的指针,fread函数和fputc函数对文件进行读写操作。
(6)修改PE文件入口点并返回HOST程序原入口点。
病毒将目标文件映射到内存或直接以读写方式打开后,获取目标文件的程序入口点,保存原入口点并写入新入口点,使得病毒代码执行完成后可以返回原入口点。
3.2获取可疑文件各个节十六进制串
通过以下几个步骤实现对可疑PE文件中基本信息和节信息的读取。
(1) 获取可疑文件句柄
通过API函数CreateFile 创建打开可疑文件对象,并返回一个用来访问该对象的句柄。
(2) 将可疑PE文件映射到内存
通过CreateFileMapping函数将可疑文件映射到内存,并且返回一个内存映射文件句柄,通过MapViewOfFile函数把内存映射文件句柄指向的可疑文件映射到当前应用程序的地址空间,并返回映射视图文件的开始地址值,准备读取可疑文件文件头与文件的节的信息。为了准确的读出PE文件的内容信息,还需要对PE文件结构以及PE文件的内存映射做出分析。
(3)读取PE文件头的IMAGE_FILE_HEADER 结构,如图3所示。
(4)读取PE文件头的IMAGE_ OPTIONAL _HEADER 结构,如图4所示。
(5)获取节表中代码节的特征值、起始位置、长度等信息,如图5所示。
(6)读取PE文件节的信息
定义一个PIMAGE_SECTION_HEADER结构实例,将其指向可疑PE文件的节表中每一个节表项;判断当前节表的Characteristics特征是否可读且包含代码(代码节),若不是则继续读下一个节表项,若是则把当前文件操作指针通过SetFilePointer设置到代码节的开始位置,再通过ReadFile 函数把代码节信息保存到已经申明好的BYTE* buffer=new BYTE[filesize+1] 动态字节数组中。
3.3PE病毒行为字符串匹配
获取代码节数据后,根据上文中的PE病毒行为特征采用字符串匹配的方法查找PE病毒行为特征并报告该文件的危险等级。
在字符串匹配方面,若直接进行匹配将会降低匹配效率、浪费计算资源,因此将匹配操作按照E8和FF开始字节进行分类划分,由起始字节开始匹配,如图6所示。
4结束语
文中首先分析了PE病毒具有的关键行为特征、基本行为特征以及为了保护病毒自身而具有的其他一些行为特征,并在此基础上给出了这些行为特征的实现函数及其对应的汇编代码、十六进制字符串,并以此为启发式检测未知病毒的依据,设计并详细说明了其实现过程。
下一步将更深入研究PE病毒的行为特征,并对不同的行为特征进行权重设计,实现对不同行为组合的PE病毒可疑程度的准确判断。
参考文献
[1] 傅建明,彭国军,张焕国.计算机病毒分析与对抗(第二版).武汉大学出版社,2009.
[2] 王成,庞建民,赵荣彩,王强. 基于可疑行为识别的PE病毒检测方法[J]. 计算机工程,2009,15(5):132-134.
[3] 刘帅. Win32PE广义病毒检测的设计与实现. 哈尔滨工程大学硕士学位论文, 2011.
[4] 何志永. 一种对Windows中PE文件进行启发式病毒扫描的算法.科技通报,2013,147-150.
[5] 李晓黎. Windows系统编程. 人民邮电出版社, 2012 .
[6] 范吴平. Win32 PE文件病毒的检测方法研究. 电子科技大学硕士论文, 2012.
基金项目:
2013年中国民航大学教育教学改革研究课题(项目编号CAUC-ETRN-2013-24)。
2013年大学生创新创业训练项目(项目编号IECAUC13028)。
作者简介:
王静(1980-),女, 博士,中国民航大学计算机科学与技术学院,讲师;主要研究方向和关注领域:信息安全。
梁大钊,中国民航大学计算机科学与技术学院,本科生。
吴永顺,中国民航大学计算机科学与技术学院,本科生。
饶丽萍,中国民航大学计算机科学与技术学院,本科生。
黄晓生,中国民航大学计算机科学与技术学院,本科生。endprint
Run"
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
同时,病毒会修改系统的开机配置文件来实现开机自启动,而这些行为会存在差异,可通过辅助使用注册表监控与文件监控等行为监控工具进行检测。
3基于行为特征的PE病毒检测
PE病毒行为检测方法主要是以病毒行为特征作为判定基础,对目标文件使用字符串匹配的方法来确定是否具有可疑行为,其检测流程如图2所示。
3.1确定PE病毒行为字符串特征库
为了准确判断目标PE文件是否存在可疑行为,在详细分析PE病毒行为特征的基础上,获取其行为特征对应的十六进制字符串构造字符串特征库,作为检测PE病毒的依据。
(1)病毒中变量的重定位
在PE病毒中最常用的是调用call指令来得到一个参考变量在内存中的真实地址,然后,将该地址与参考变量和重定位变量的偏移地址做运算来得到重定位变量的内存地址。其主要的汇编指令与对应的十六进制码如表1所示。
(2) 获取系统内存中Kernel32.dll基地址
病毒在使用CreateProcess函数完成装载应用程序后,系统会先将一个返回地址压入到堆栈顶端,而这个返回地址恰好在Kernel32.dll中,利用这个原理病毒顺着这个返回地址按64KB大小向低地址搜索,直到找到Kernel32模块的基地址为止。
(3)搜索磁盘中的目标PE文件
常见的PE病毒会遍历磁盘中的全部分区进行目标PE文件的搜索,同时,对分区中的每一个目录进行递归查找PE格式的文件。使用FindFile函数查找指定路径,对当前路径使用FindNextFile函数获得下一个文件句柄后,IsDirectory函数判断文件是否为目录,是目录则用GetFilePath得到文件路径再递归调用查找函数,否则,Find(".exe")判断文件的后缀名是否为.exe,而这些基本行为对应的十六进制字符串如表3所示。
(4)将目标PE文件映射进内存
为了获取文件映射句柄对目标文件进行读写操作,需首先将目标PE文件映射到系统内存空间,其基本行为对应的十六进制字符串如表4所示。
(5)向目标PE文件写入病毒功能代码
首先采用fopen函数以读写或是只读的方式打开目标文件,用fseek函数定位打开文件的指针,fread函数和fputc函数对文件进行读写操作。
(6)修改PE文件入口点并返回HOST程序原入口点。
病毒将目标文件映射到内存或直接以读写方式打开后,获取目标文件的程序入口点,保存原入口点并写入新入口点,使得病毒代码执行完成后可以返回原入口点。
3.2获取可疑文件各个节十六进制串
通过以下几个步骤实现对可疑PE文件中基本信息和节信息的读取。
(1) 获取可疑文件句柄
通过API函数CreateFile 创建打开可疑文件对象,并返回一个用来访问该对象的句柄。
(2) 将可疑PE文件映射到内存
通过CreateFileMapping函数将可疑文件映射到内存,并且返回一个内存映射文件句柄,通过MapViewOfFile函数把内存映射文件句柄指向的可疑文件映射到当前应用程序的地址空间,并返回映射视图文件的开始地址值,准备读取可疑文件文件头与文件的节的信息。为了准确的读出PE文件的内容信息,还需要对PE文件结构以及PE文件的内存映射做出分析。
(3)读取PE文件头的IMAGE_FILE_HEADER 结构,如图3所示。
(4)读取PE文件头的IMAGE_ OPTIONAL _HEADER 结构,如图4所示。
(5)获取节表中代码节的特征值、起始位置、长度等信息,如图5所示。
(6)读取PE文件节的信息
定义一个PIMAGE_SECTION_HEADER结构实例,将其指向可疑PE文件的节表中每一个节表项;判断当前节表的Characteristics特征是否可读且包含代码(代码节),若不是则继续读下一个节表项,若是则把当前文件操作指针通过SetFilePointer设置到代码节的开始位置,再通过ReadFile 函数把代码节信息保存到已经申明好的BYTE* buffer=new BYTE[filesize+1] 动态字节数组中。
3.3PE病毒行为字符串匹配
获取代码节数据后,根据上文中的PE病毒行为特征采用字符串匹配的方法查找PE病毒行为特征并报告该文件的危险等级。
在字符串匹配方面,若直接进行匹配将会降低匹配效率、浪费计算资源,因此将匹配操作按照E8和FF开始字节进行分类划分,由起始字节开始匹配,如图6所示。
4结束语
文中首先分析了PE病毒具有的关键行为特征、基本行为特征以及为了保护病毒自身而具有的其他一些行为特征,并在此基础上给出了这些行为特征的实现函数及其对应的汇编代码、十六进制字符串,并以此为启发式检测未知病毒的依据,设计并详细说明了其实现过程。
下一步将更深入研究PE病毒的行为特征,并对不同的行为特征进行权重设计,实现对不同行为组合的PE病毒可疑程度的准确判断。
参考文献
[1] 傅建明,彭国军,张焕国.计算机病毒分析与对抗(第二版).武汉大学出版社,2009.
[2] 王成,庞建民,赵荣彩,王强. 基于可疑行为识别的PE病毒检测方法[J]. 计算机工程,2009,15(5):132-134.
[3] 刘帅. Win32PE广义病毒检测的设计与实现. 哈尔滨工程大学硕士学位论文, 2011.
[4] 何志永. 一种对Windows中PE文件进行启发式病毒扫描的算法.科技通报,2013,147-150.
[5] 李晓黎. Windows系统编程. 人民邮电出版社, 2012 .
[6] 范吴平. Win32 PE文件病毒的检测方法研究. 电子科技大学硕士论文, 2012.
基金项目:
2013年中国民航大学教育教学改革研究课题(项目编号CAUC-ETRN-2013-24)。
2013年大学生创新创业训练项目(项目编号IECAUC13028)。
作者简介:
王静(1980-),女, 博士,中国民航大学计算机科学与技术学院,讲师;主要研究方向和关注领域:信息安全。
梁大钊,中国民航大学计算机科学与技术学院,本科生。
吴永顺,中国民航大学计算机科学与技术学院,本科生。
饶丽萍,中国民航大学计算机科学与技术学院,本科生。
黄晓生,中国民航大学计算机科学与技术学院,本科生。endprint
Run"
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
同时,病毒会修改系统的开机配置文件来实现开机自启动,而这些行为会存在差异,可通过辅助使用注册表监控与文件监控等行为监控工具进行检测。
3基于行为特征的PE病毒检测
PE病毒行为检测方法主要是以病毒行为特征作为判定基础,对目标文件使用字符串匹配的方法来确定是否具有可疑行为,其检测流程如图2所示。
3.1确定PE病毒行为字符串特征库
为了准确判断目标PE文件是否存在可疑行为,在详细分析PE病毒行为特征的基础上,获取其行为特征对应的十六进制字符串构造字符串特征库,作为检测PE病毒的依据。
(1)病毒中变量的重定位
在PE病毒中最常用的是调用call指令来得到一个参考变量在内存中的真实地址,然后,将该地址与参考变量和重定位变量的偏移地址做运算来得到重定位变量的内存地址。其主要的汇编指令与对应的十六进制码如表1所示。
(2) 获取系统内存中Kernel32.dll基地址
病毒在使用CreateProcess函数完成装载应用程序后,系统会先将一个返回地址压入到堆栈顶端,而这个返回地址恰好在Kernel32.dll中,利用这个原理病毒顺着这个返回地址按64KB大小向低地址搜索,直到找到Kernel32模块的基地址为止。
(3)搜索磁盘中的目标PE文件
常见的PE病毒会遍历磁盘中的全部分区进行目标PE文件的搜索,同时,对分区中的每一个目录进行递归查找PE格式的文件。使用FindFile函数查找指定路径,对当前路径使用FindNextFile函数获得下一个文件句柄后,IsDirectory函数判断文件是否为目录,是目录则用GetFilePath得到文件路径再递归调用查找函数,否则,Find(".exe")判断文件的后缀名是否为.exe,而这些基本行为对应的十六进制字符串如表3所示。
(4)将目标PE文件映射进内存
为了获取文件映射句柄对目标文件进行读写操作,需首先将目标PE文件映射到系统内存空间,其基本行为对应的十六进制字符串如表4所示。
(5)向目标PE文件写入病毒功能代码
首先采用fopen函数以读写或是只读的方式打开目标文件,用fseek函数定位打开文件的指针,fread函数和fputc函数对文件进行读写操作。
(6)修改PE文件入口点并返回HOST程序原入口点。
病毒将目标文件映射到内存或直接以读写方式打开后,获取目标文件的程序入口点,保存原入口点并写入新入口点,使得病毒代码执行完成后可以返回原入口点。
3.2获取可疑文件各个节十六进制串
通过以下几个步骤实现对可疑PE文件中基本信息和节信息的读取。
(1) 获取可疑文件句柄
通过API函数CreateFile 创建打开可疑文件对象,并返回一个用来访问该对象的句柄。
(2) 将可疑PE文件映射到内存
通过CreateFileMapping函数将可疑文件映射到内存,并且返回一个内存映射文件句柄,通过MapViewOfFile函数把内存映射文件句柄指向的可疑文件映射到当前应用程序的地址空间,并返回映射视图文件的开始地址值,准备读取可疑文件文件头与文件的节的信息。为了准确的读出PE文件的内容信息,还需要对PE文件结构以及PE文件的内存映射做出分析。
(3)读取PE文件头的IMAGE_FILE_HEADER 结构,如图3所示。
(4)读取PE文件头的IMAGE_ OPTIONAL _HEADER 结构,如图4所示。
(5)获取节表中代码节的特征值、起始位置、长度等信息,如图5所示。
(6)读取PE文件节的信息
定义一个PIMAGE_SECTION_HEADER结构实例,将其指向可疑PE文件的节表中每一个节表项;判断当前节表的Characteristics特征是否可读且包含代码(代码节),若不是则继续读下一个节表项,若是则把当前文件操作指针通过SetFilePointer设置到代码节的开始位置,再通过ReadFile 函数把代码节信息保存到已经申明好的BYTE* buffer=new BYTE[filesize+1] 动态字节数组中。
3.3PE病毒行为字符串匹配
获取代码节数据后,根据上文中的PE病毒行为特征采用字符串匹配的方法查找PE病毒行为特征并报告该文件的危险等级。
在字符串匹配方面,若直接进行匹配将会降低匹配效率、浪费计算资源,因此将匹配操作按照E8和FF开始字节进行分类划分,由起始字节开始匹配,如图6所示。
4结束语
文中首先分析了PE病毒具有的关键行为特征、基本行为特征以及为了保护病毒自身而具有的其他一些行为特征,并在此基础上给出了这些行为特征的实现函数及其对应的汇编代码、十六进制字符串,并以此为启发式检测未知病毒的依据,设计并详细说明了其实现过程。
下一步将更深入研究PE病毒的行为特征,并对不同的行为特征进行权重设计,实现对不同行为组合的PE病毒可疑程度的准确判断。
参考文献
[1] 傅建明,彭国军,张焕国.计算机病毒分析与对抗(第二版).武汉大学出版社,2009.
[2] 王成,庞建民,赵荣彩,王强. 基于可疑行为识别的PE病毒检测方法[J]. 计算机工程,2009,15(5):132-134.
[3] 刘帅. Win32PE广义病毒检测的设计与实现. 哈尔滨工程大学硕士学位论文, 2011.
[4] 何志永. 一种对Windows中PE文件进行启发式病毒扫描的算法.科技通报,2013,147-150.
[5] 李晓黎. Windows系统编程. 人民邮电出版社, 2012 .
[6] 范吴平. Win32 PE文件病毒的检测方法研究. 电子科技大学硕士论文, 2012.
基金项目:
2013年中国民航大学教育教学改革研究课题(项目编号CAUC-ETRN-2013-24)。
2013年大学生创新创业训练项目(项目编号IECAUC13028)。
作者简介:
王静(1980-),女, 博士,中国民航大学计算机科学与技术学院,讲师;主要研究方向和关注领域:信息安全。
梁大钊,中国民航大学计算机科学与技术学院,本科生。
吴永顺,中国民航大学计算机科学与技术学院,本科生。
饶丽萍,中国民航大学计算机科学与技术学院,本科生。
黄晓生,中国民航大学计算机科学与技术学院,本科生。endprint