本文主要从杀毒软件查杀病毒的原理出发,分析PE文件格式在杀毒软件定位病毒特征码中的作用。杀毒软件通过快速准确定位病毒特征码,对伪装,隐藏,变种病毒进行查杀。

一.杀毒软件查杀病毒的原理概述

  对于操作系统来说,电脑病毒和其他应用程序没有差别的,都是一个exe程序。只是功能上有所区别,通常病毒程序都是窃取用户信息,破坏电脑中的数据等,而不一般程序不会这么做。杀毒软件是怎么判断一个exe程序是病毒程序呢?

  通常是先经过杀毒软件公司的技术人员来分析,验证程序是否具有窃取用户信息,破坏电脑数据的行为。如果有,则认为是病毒程序,在确定为病毒程序后,则需要提取该病毒程序的特征码并把特征码录入病毒库。如果杀毒软件遇上某程序文件的特征码存在于病毒库中,那么杀毒软件则判断该程序为病毒程序。由此可见,杀毒软件是根据特征码来判断一个程序是否为病毒的。为了减少“误杀”和“漏杀”,特征码可能不止一个,而是一组,一组特征码按照一定的排列组合来确定某程序是否为病毒。然而增加特征码就会增加“查杀时间” ,所以关键因素就是特征码的个数。

  杀毒软件需要做的事情就是定位出精准和稳定的特征码,这就需要最少的特征码来标识一个病毒,而且需要这些特征码在病毒的变种中也能找到。

二.PE文件格式与病毒文件特征码的联系分析

  1.Dos头(大小64字节):为了兼容Dos操作系统而保留的,最后一个字段e_lfanew(指出PE头的文件偏移位置,大小为4字节)很有效。第一个字段e_magic(一般为5A 4D 表示是可执行文件exe)大小为2字节。

  2.Image_NT_Header:其构成由4字节的Signature(机器签名,一般为0x00 00 45 50,ASCII码是“PE00”),然后紧接着是20字节的Image_File_Header(PE)和不定长的Image_OP_Header。

  2.1Image_File_Header(镜像文件夹):PE中比较重要的是NumberOfSections和Characteristics。其中大小为2字节的NumberOfSections代表着节的数量,在遍历各个节的时候需要使用,有很多病毒会添加自己的节,存储病毒需要的数据;大小为2字节的Characteristics是PE文件的一些属性信息,通常一个病毒文件和变种文件的这个属性值是相同的,当然不同的病毒文件的这个值也可能相同,但是相对来说,这个值比较固定,所以可以作为特征码一部分。

  2.2Image_OP_Header(镜像可选文件):OPE包含的内容非常多和重要,对特征码定位有比较大作用的有如下字段:

FileAlignment(4字节):数据块在文件内的对齐大小。一般为0x200或0x1000

SectionAlignment(4字节):数据块在内存中的对齐大小。一般为0x1000

SizeOfCode(4字节):代码块的大小

SizeOfInitializeData(4字节):数据块的大小

SizeOfImage(4字节):PE文件在内存中的大小

AddressOfEntryPoint(4字节):入口地址

BaseOfCode(4字节):代码段在内存中相对于镜像基址的开始地址

BaseOfData(4字节):数据段在内存中相对于镜像基址的开始地址

  镜像可选头结构中的字段对病毒特征码提取有作用的分如下几类:

A.由于功能不变性和对齐方式引起的数据块大小比较固定

  对齐方式是操作系统为了效率上的提高,对数据按照一定的大小进行分块存储而产生的数据存储方式。例如数据按200k存储,那么201k的数据,存储的时候就需要使用2块200k的空间,也就是400k的空间。PE文件中数据的存储也类似这样。按照SectionAlignment(数据块在内存中的对齐粒度)和FileAlignment(数据块在文件中的对齐粒度)对齐,这两个对齐值会让镜像可选头的某些字段比较固定。

  SizeOfCode(代码块的大小),SizeOfInitializedData(初始化数据的大小),SizeOfImage(PE文件在内存中的大小),通常一个可执行程序的代码没有很大的修改的话,这几个值比较固定,从而可以通过这几个值定位到比较稳定的特征码。

B.由于功能不变性和数据块大小稳定性引起地址值的比较固定

  对于任何一个程序,在第一次生成后,并通过功能测试发布后,主体功能都是已经确定的,就算修改也只是一些节支上的小改。病毒程序也不例外。

  加上对其粒度的影响,PE文件中的数据块大小也比较稳定,所以引起的许多地址值也是比较固定的。AddressOfEntryPoint(入口地址),BaseOfData(数据段在内存中相对于镜像基址的开始位置)。由于数据是按块存储的,各个数据块只要可执行程序的代码没有很大的修改的话,数据块的大小就基本上不会改变,所以引起这些存储的地址值也比较稳定。

  3.节表头(40字节):也是由于对其粒度引起节表头的SizeOfRawData(节在文件中对齐后的大小),PointOfRawData(节在文件中开始地址),VirtualAddress(节在内存中开始地址)这三个字段比较稳定。

  4.各个节:节表头后,就是各个节的数据了。节中存储各种数据,主要有代码数据,常量数据,资源数据,导出函数数据,导入函数数据。这些数据在病毒程序功能固定的情况下,都是比较固定的,从而定位出特征码也比较容易。

  但是常量数据,资源数据,导出函数数据通常是比较容易被修改的,因为这3个数据是在代码级别的数据,通过简单地修改病毒程序的代码,这3个数据的大小可能不变,但数据的内容可能发生很大的变化。

  而对于代码数据和导入函数数据,这两个数据是编译器和链接器根据代码生成的,只要是代码不是很大的修改,这两个数据的内容是比较稳定的。

  4.1代码数据:代码数据是可以定位到特征码的地方比较多的。有函数调用的入栈指令,例如调用某个函数,它有几个参数,必然会在调用该函数附近,有一些入栈动作和参数初始化的动作,这些都可以定位成特征码,而这些特征比较稳定。还有,调用其他dll的函数的固定相对地址。例如某病毒程序调用网络动态库的InternetopenUrl函数,那么在代码数据调用指令(call 指令)的参数,就是InternetOpenUrl函数在Wininet.dll中的相对地址,除非病毒使用动态加载Wininet.dll,则没有InternetOpenUrl函数的相对地址数据,但是动态加载dll的话,就会有有Wininet.dll常量,就变成了定位动态加载dll这段代码的特征码,这还是通过代码数据来定位。

  4.2导入函数数据:导入函数数据就是程序中调用了那些dll的函数数据,这些函数数据包含dll的名字,被调用的函数名字或者序号等,这些都可以作为用来定位特征码。还有就是一些地址数据,这些话素具是编译器和链接器生成的,很难通过代码级别来修改的,在汇编级别修改也蛮大,涉及到代码数据的修改和各种数据的相对地址的修改,所以通过导入函数数据定位的特征码很稳定。

三.总结

  上面说明那些数据可以通过PE文件可以快速的找到,而且正对exe程序进行小范围的修改,那些数据基本上不会改变(某些注销掉的dll函数除外)。

  杀毒软件通过PE文件格式对这些数据进行分析,可以找到一些比较稳定的不常变得数据,把这些数据组成多组特征,从而可以快速稳定的定位PE文件的特征码和判断PE文件是否为病毒文件。

  

    

PE文件格式对定位病毒特征码的作用的更多相关文章

  1. 深入理解 Win32 PE 文件格式

    深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什 ...

  2. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  3. PE文件格式分析

    PE文件格式分析 PE 的意思是 Portable Executable(可移植的执行体).它是 Win32环境自身所带的执行文件格式.它的一些特性继承自Unix的Coff(common object ...

  4. 深入理解 Win32 PE 文件格式 Matt Pietrek(慢慢体会)

    这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什么东西,那么你就是一个知识渊博的程序员.这一系列文章的第一部分, ...

  5. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  6. PE文件格式详解(下)

    作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...

  7. PE文件格式详解(上)

    作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...

  8. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  9. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

随机推荐

  1. linux的tomcat服务器上部署项目的方法

    在tomcat服务器上部署项目的前提,是我们已经准备好了tomcat服务器.在CentOs环境下部署JavaWeb环境,部署tomcat服务器在前面的文章中已经总结过了,可以参考以前文章. 一  to ...

  2. 【Spark篇】---Spark初始

    一.前述 Spark是基于内存的计算框架,性能要优于Mapreduce,可以实现hadoop生态圈中的多个组件,是一个非常优秀的大数据框架,是Apache的顶级项目.One stack  rule  ...

  3. 概率分布之间的距离度量以及python实现(三)

    概率分布之间的距离,顾名思义,度量两组样本分布之间的距离 . 1.卡方检验 统计学上的χ2统计量,由于它最初是由英国统计学家Karl Pearson在1900年首次提出的,因此也称之为Pearson ...

  4. visual studio git for coding

    直接放图吧 双击存储库项目进入Git操作页面 点击之后输入你要发布的git地址 选择你的操作 如果你登录的密码错了 就需要去修改 否则永远都pull失败 打开控制面板 在这里修改

  5. Mac版AppStore无法下载、升级错误处理

    在mac版本AppStore下载软件的时候,有时会出现"This item is temporarily unavailable, Try again later"错误提示,当然等 ...

  6. Spring 中 SQL 的存储过程

    SimpleJdbcCall 类可以被用于调用一个包含 IN 和 OUT 参数的存储过程.你可以在处理任何一个 RDBMS 时使用这个方法,就像 Apache Derby, DB2, MySQL, M ...

  7. Python的魔法函数

    概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python # -*- codi ...

  8. npm用法

    查看包信息npm info mongodb 查看包的最新版本npm view mongodb version 安装npm install mongodb@2.2.33 已安装的包修改版本npm ins ...

  9. [十]基础数据类型之Unicode编码简介

    编码含义 关于编码的含义,之前也说过,计算机只能存储二进制序列 所以对于字符,保存的时候,需要进行编码为二进制,进行存储 呈现的时候,需要将二进制进行解码,转换成字符的形式   有很多种编码方式,比如 ...

  10. 【CSS】按钮的禁用与可用 CSS Cursor 属性

    禁用时的样式 可用时的样式 样式很简单,禁用就设置为灰色,可用就设置为红色,今天这个不是重点,重点的是,光标的样子 一般,禁用时候,光标移动到按钮的上方,光标如下 而在启用按钮的时候,光标移动到按钮上 ...