本文主要从杀毒软件查杀病毒的原理出发,分析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. scala时间和时间戳互转

    时间转换为时间戳: import java.text.SimpleDateFormat object test { def main(args: Array[String]): Unit = { va ...

  2. Python内置函数(23)——format

    英文文档: format(value[, format_spec]) Convert a value to a “formatted” representation, as controlled by ...

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

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

  4. RestTemplate的逆袭之路,从发送请求到负载均衡

    上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求的工具吗?它什么时候具有了实现客户端负载 ...

  5. Java基础15:深入剖析Java枚举类

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  6. java 文件过滤器

    创建文件过滤器 MyFilter ,实现 FileFilter 接口,实现 accept() 方法: package com.test.IODemo1; import java.io.File; im ...

  7. github访问很慢解决方案

    首先要解决的就是这个访问速度的问题: 获取Github相关网站的ip 访问https://www.ipaddress.com,拉下来,找到页面中下方的“IP Address Tools – Quick ...

  8. 探索Windows命令行系列(1):导航目录

    探索Windows命令行系列(1):导航目录 探索Windows命令行系列(2):命令行工具入门 探索Windows命令行系列(3):命令行脚本基础 探索Windows命令行系列(4):通过命令操作文 ...

  9. 补习系列(10)-springboot 之配置读取

    目录 简介 一.配置样例 二.如何注入配置 1. 缺省配置文件 2. 使用注解 3. 启动参数 还有.. 三.如何读取配置 @Value 注解 Environment 接口 @Configuratio ...

  10. SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......

    SmartSql Why 拥抱 跨平台 DotNet Core,是时候了. 高性能.高生产力,超轻量级的ORM.156kb (Dapper:168kb) So SmartSql TargetFrame ...