2008年01月14日 星期一 13:41

本文刊登于2007年第8期的《黑客防线》,有内容部分改动。

正文如下:

从杀毒软件的角度来讲检测文件是否为PE文件,并再进一步判断使用何种方式对文件进行操作。在病毒感染可执行文件时,也是应该有这样步骤的。那么,就来看看杀毒软件是如何检测PE文件的有效性了。

PE文件是在windows系统中任何可执行模块或者DLL的文件格式。PE的意思是Portable Executable(可移植的执行体)。它是Win32环境自身所带的执行体文件格式。PE文件格式是跨Win32平台的,就是说即使是运行在非Intel CPU上的Windows都能够被PE装载器识别和使用该文件格式。

所有常见的PE结构定义在winnt.h头文件中。我们一般关心的有:IMAGE_DOS_HEADER、IMAGE_FILE_HEADER、IMAGE_OPTIONAL_HEADER32、IMAGE_SECTION_HEADER、IMAGE_NT_HEADER……还有很多的!在这里,我们只讨论两个结构,一个是IMAGE_DOS_HEADER,另一个是IMAGE_NT_HEADERS。通过这两个结构,我们就可以完成我们检测PE有效性的功能了。好了,看看这两个结构在winnt.h中的定义吧。

typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header

WORD   e_magic;                     // Magic number

……

LONG   e_lfanew;                    // File address of new exe header

} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

typedef struct _IMAGE_NT_HEADERS {

DWORD Signature;

IMAGE_FILE_HEADER FileHeader;

IMAGE_OPTIONAL_HEADER32 OptionalHeader;

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

由于IMAGE_DOS_HEADER结构中有很多成员,因此我们只列出了我们要讨论的就可以了,其他的就用省略号代替就可以了。在_IMAGE_DOS_HEADER结构中,e_magic为DOS可执行文件标记;e_lfanew是相对实际PE头标的相对偏移量,也就是IMAGE_NT_HEADERS结构的地址。在IMAGE_NT_HEADERS中,我们只使用Signature这个成员,它是PE文件的标识(PE/0/0)。为了方便编程,在winnt.h中为DOS标识和PE标识定义了宏,分别是:

#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ

#define IMAGE_NT_SIGNATURE                  0x00004550 // PE00

好了,有了上面的PE结构的知识,我们就可以完成检测PE文件的有效性的程序了。那么来看看编写检测PE文件有效性程序的步骤好了。首先,我们需要用CreateFile打开要检测的文件,然后通过判断是否是IMAGE_DOS_SIGNATURE来检测是否是有效的DOS头,接下来用e_lfnew来定位PE头了,最后通过判断是否是IMAGE_NT_SIGNATURE来检测文件的有效性了。一共四步,不过最后记得要用CloseHandle来关闭已打开文件的句柄。好了,可以介绍的内容大概就这么多了,来看看具体的代码吧!

//这里就是我们的第一步,打开要检测的文件

hFile=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

//这里是第二步,检测DOS头部的有效性

ReadFile(hFile,&image_dos_header,sizeof(image_dos_header),&dwRead,NULL);

if(dwRead==sizeof(image_dos_header))

{

if(IMAGE_DOS_SIGNATURE==image_dos_header.e_magic)

{//这里是第三步,定位image_nt_headers的位置

if(SetFilePointer(hFile,image_dos_header.e_lfanew,NULL,FILE_BEGIN))

{

ReadFile(hFile,&image_nt_headers,sizeof(image_nt_headers),&dwRead,NULL);

if(dwRead==sizeof(image_nt_headers))

{//这里就是最后一步了,检测PE头部的有效性

if(IMAGE_NT_SIGNATURE==image_nt_headers.Signature)

b=TRUE;

}

}

}

}

if(b)

MessageBox("该程序是一个有效PE文件!");

else

MessageBox("该程序不是一个有效PE文件!");

CloseHandle(hFile);

依据我开始写的程序的逻辑,得到了这样的代码,其中还有CreateFile()、ReadFile()、SetFilePointer()这些API函数,它们都可以在MSDN中找到,大家自己找一下吧。这里就不在给出它们的定义了。

其实这种方式并不是唯一的一种检测PE文件有效性的方式,这些也只是起到抛砖引玉的目的了。在《黑防》今年第4期中的《以“熊猫烧香”的名义,再谈Delphi编写病毒程序》文章中,这位作者判断PE文件有效性的方式是顺序读取文件前0x108字节的内容,每次读取两个字节,然后判断是否为“PE”标识。当然,除了这两种方法外,还有其他的方法。在另外的其他方式中不在使用ReadFile()和SetFilePointer()这两个API函数了,而是除了使用CreateFile()函数外,还要使用一些内存映射文件方面的相关函数CreateFileMapping()和MapViewOfFile()。这里就不讨论它们了,就留给大家自己去研究一下了。

以上就是文章的正文了。

引自:   http://hi.baidu.com/jester/blog/item/3e79a3865d37413a67096eb2.html

检测PE文件的有效性相关推荐

  1. 检测PE文件加壳信息用的特征码

    //定义特征码结构体 / typedef struct _Feature { public: LPCTSTR  Pos;  //相对于入口点的偏移 LPCTSTR  Fea;  //特征码 LPCTS ...

  2. PE文件详解(教程1-7)

    PE文件详解(教程1-7) ========================================= PE教程1: PE文件格式一览 PE 的意思就是 Portable Executable ...

  3. pe文件签名信息检测技术

    [摘要] 签名信息中包含有很多有用的信息,可以辅助对二进制软件进行安全检测.读者可以从本博客中了解到pe文件中签名信息是如何组织的,如何用python代码从pe文件中获取内嵌的签名信息等知识. **什 ...

  4. PEiD检测 不是有效的PE文件

    在做逆向分析题目的时候用了好几次PEiD检测是否加壳,都显示不是有效的PE文件,在此记录一下原因 其实很简单,就是PEiD只支持检测32位的可执行文件,如果显示不是有效的PE文件,说明你的可执行文件为 ...

  5. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. 使用Python判断文件是否为PE文件

    PE的全称是Portable Executable,指可移植的可执行文件,目前的最新版本是2013年2月6日发布的8.3版.PE文件包括exe文件.com文件.dll文件.ocx文件.sys文件.sc ...

  7. 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...

    基于windows PE文件的恶意代码分析:使用SystemInternal工具与内核调试器研究windows用户空间与内核空间 ******************** 既然本篇的主角是PE文件,那 ...

  8. Sophos 和 ReversingLabs 公开含2000万个 PE 文件的数据集

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本周,Sophos 和 ReversignLabs 公司宣布公开 SoReL-20M 数据库,内含2000万个 Windows 可移植 ...

  9. Black Hat | PE Tree:BlackBerry 发布PE文件开源逆向工具

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 BlackBerry 在今年举办的美国黑帽大会上为网络安全社区发布了一款新工具:PE Tree. PE Tree 是一款适用于 Lin ...

最新文章

  1. php校友录毕业论文,基于WEB的同学校友录的设计(PHP,MySQL)(附答辩记录)
  2. UOJ#179. 线性规划(线性规划)
  3. Shell基础学习笔记
  4. Windows 10 install Pycharm 开发环境
  5. 【Android 启动过程】Activity 启动源码分析 ( Activity -> AMS、主线程阶段 )
  6. OpenGL中使用glutDisplayFunc(myDisplay),myDisplay里面的代码不显示
  7. java面向对象:关键字 —(16)
  8. ios 查看同文件名_实战恢复cisco 2950交换机的IOS
  9. ES6模块之export和import详解
  10. Convolutional Sequence to Sequence Learning笔记
  11. 秋风秋雨愁煞人:寒宵独坐心如捣
  12. linux搭建虚拟化平台报告,CentOS 7中搭建KVM虚拟化平台的方法步骤
  13. python求成绩平均值_(生活)使用Python计算学生成绩平均值
  14. python装饰器 廖雪峰_python装饰器的一个妙用
  15. 研发 | Unity资源商店里的免费资源,你一定要知道!
  16. 数采仪厂家_环保数采仪生产厂家
  17. Excel高级图表制作②——帕累托图
  18. Neuronink是医学奇迹的噩梦
  19. java中int count什么意思_int groupCount()
  20. APP内测分发平台源码|应用分发源码|开源分发平台搭建

热门文章

  1. 分布式学习(3)etcd@2@HTTP API v2
  2. 外盘国际期货是否合法吗?为啥还有人做期货主账户?
  3. Linux----putty下载安装教程
  4. 面向对象;构造函数;原型对象
  5. 计算机计算公式单组数据求乘法,(excel表格全部数据怎么乘以一个数啊)
  6. python和access哪个好过计算机二级_大一考计算机二级,那考office、C语言、VB、Java、Access还是Python好呢?...
  7. 在单机(物理机)上用虚拟机部署kubernetes集群
  8. node对文件的读取和修改
  9. BUG(10) : Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be
  10. ElementUI日期组件(DatePicker )图标定制