合肥程序员群:49313181。    合肥实名程序员群 :128131462 (不愿透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

PE文件结构综览:

首先上图片:

看到上面的图片可以清晰的看到PE结构复杂结构式什么样子的。有DOS首部,PE头部,PE节表,很多的表块,最后就是一些调试信息。

DOS头由DOS 'MZ' HEADER 和DOS stub组成,DOS "MZ"头中的MZ是PE文件的一个标志之一。后期我们在写PE小工具的时候这个会被我们用于去识别PE文件。

首先我们来理解DOS头。我们知道Windows系统主体是由C去完成的。所有我们可以在windows中去找到用C描述的DOS头结构。

DOS头分析:

第一个就是WinNT.h在我计算机中位置。打开后我们就能看到我们想要的DOS头数据结构了。

 typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
+ WORD e_magic; // Magic number
+ WORD e_cblp; // Bytes on last page of file
+ WORD e_cp; // Pages in file
+ WORD e_crlc; // Relocations
+ WORD e_cparhdr; // Size of header in paragraphs
+A WORD e_minalloc; // Minimum extra paragraphs needed
+C WORD e_maxalloc; // Maximum extra paragraphs needed
+E WORD e_ss; // Initial (relative) SS value
+ WORD e_sp; // Initial SP value
+ WORD e_csum; // Checksum
+ WORD e_ip; // Initial IP value
+ WORD e_cs; // Initial (relative) CS value
+ WORD e_lfarlc; // File address of relocation table
+1A WORD e_ovno; // Overlay number
+1C WORD e_res[]; // Reserved words
+24 WORD e_oemid; // OEM identifier (for e_oeminfo)
+ WORD e_oeminfo; // OEM information; e_oemid specific
+ WORD e_res2[]; // Reserved words
+3C LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

我们可以看到这样一个结构体这个结构体就是DOS 头结构体,Windows很多数据都是通过这样的结构体去组织的。前面的"+数字"是我添加上去的,WinNT.H头文件中没有的,这个表示偏移地址。在这里我默认情况是你知道什么是偏移地址,Windows的内存基址。否则一些东西你是无法理解的。当然这个数字是16进制表示的。

我们用一个UE打开一个PE文件,也就是exe程序。(当然DLL也是PE文件,遵循PE结构。但是我们这里默认就是EXE程序),我打开我收集的一个内存查看工具:

入下图:

可以看+0H这个位置开始的2个字节(我在这里假设了解windows下的WORD类型是两个字节)。这两个字节也就是e_magic中的内容是MZ。DOS头中我们关注的另一个内容就是最后一个成员也就是+3Ch这个位置,也就是占四个字节的e_lfanew。(大家要知道32位机器中long型和DWORD型是一样的4个字节),DOS头中我们关注这两个内容。e_lfanew这个是为了存储PE头的偏移地址。那为什么要这个呢??DOS头后面不就是PE头了么?也就是+3Ch位置后面不就是PE头了么?其实不是我么这里的DOS头不是广义上的。广义上的DOS头还有一个。DOS stub 这个DOS stub的大小是不固定的,既然这个不固定那么广义上的DOS头的大小也就是不固定。广义DOS头不固定,那我们怎么定位PE头,那就离不开这个四字节的e_lfanew了。e_lfanew中存储了PE头的偏移地址。e_lfanew的位置在+3Ch位置。因为小端存储方式。所以就是上面图中画红线框中的倒过来,那么PE头的开始位置是 "0x00 00 0100",也就是16进制的100处。这样我们很容易的就定位到了PE头。

这里就提前让大家看一下PE头结构吧:

 typedef struct _IMAGE_NT_HEADERS {
+00h DWORD Signature;
+04h IMAGE_FILE_HEADER FileHeader;
??? IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

这个是广义上的PE头结构。这个结构的+00h处其实就是e_lfanew中偏移指向的位置总PE文件开始处的+3Ch处就是这个Signature相对文件开始的偏移(我们称FOA,也就是文件相对偏移地址,这个要和虚拟地址相对偏移RVA区分开,后续我会介绍FOA和RVA的装换方式,这样我们就可以在内存中定位数据了)。Signature中的四个字节内容其实就是"PE00",也就是+3Ch中的内容"0x00 00 0100"所指向的位置中的内容,100h位置中的四个字节中ASIIC就是“PE00”,这个是PE文件的标志符,e_magic,+0地址开始的2个字节中的“MZ”,和Signature 的+3C开始位置的四个字节内容“PE00”共同标志这就是PE文件。我们后期写的PE工具,判断PE就是有这两个位置的数据去区分是不是Windows PE文件。

这一节到此位置。后面将和大家探讨PE head结构。

版权:归博客园和Egojit所有,转载请标明出处。

PE文件学习系列二 DOS头分析的更多相关文章

  1. PE文件学习系列笔记四-C++实现PE文件的分析

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 综述: 首 ...

  2. PE文件学习系列三-PE头详解

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 最近比较忙 ...

  3. PE文件学习系列一为什么是PE

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)Q  Q:408365330     E-Mail:egojit@qq.com PE概述: ...

  4. 【学习】Windows PE文件学习(一:导出表)

    今天做了一个读取PE文件导出表的小程序,用来学习. 参考了<Windows PE权威指南>一书. 首先, PE文件的全称是Portable Executable,可移植的可执行的文件,常见 ...

  5. DOS头分析

    DOS头分析 PE文件结构综览: 首先上图片: 看到上面的图片可以清晰的看到PE结构复杂结构式什么样子的.有DOS首部,PE头部,PE节表,很多的表块,最后就是一些调试信息. DOS头由DOS 'MZ ...

  6. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  7. 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)

    项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...

  8. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  9. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

随机推荐

  1. Python基础操作-函数

    本节内容 1. 函数基本语法及特性2. 参数与局部变量3. 返回值4.递归5.高阶函数 1.函数基本语法及特性函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具 ...

  2. js,jquery获取浏览器信息

    1.js获取: 查看:window.navigator 2.jQuery获取: chrome firefox 推荐使用navigator获取userAgent然后去正则匹配 参考匹配规则:http:/ ...

  3. Curling 2.0

    Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But th ...

  4. python字符串方法的简单使用

    学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >& ...

  5. IIS报错:Exception from HRESULT: 0x8007000B解决方法

    报错如下: System.Web.Services.dll 中发生,但未在用户代码中进行处理 其他信息: 服务器无法处理请求. ---> 尝试加载 Oracle 客户端库时引发 BadImage ...

  6. rethinkdb的dataexplorer查询使用

    首先安装rethinkdb(只有linux和mac能够安装) $ sudo apt-get install rethinkdb 然后启动: $ rethinkdb 此时8080端口就可以访问本机的数据 ...

  7. 连接MySQL错误:Can't connect to MySQL server (10060)

    问题原因: 导致些问题可能有以下几个原因: 1.网络不通: 2.服务未启动: 3.防火墙端口未开放: ----防火墙端口未开放的可能性比较大

  8. Android 开机自启服务

    package com.example.lenovo.guangbo; import android.app.Service; import android.content.Intent; impor ...

  9. tomcat部署web项目的3中方法

    1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法. 2.在tomcat安装目录中有一个conf文件夹,打开此文件夹,其 ...

  10. fineUI ueditor(可能别的editor也有)配置注意事项

    1.把ueditor配置在弹窗里的一些小问题 这种弹窗的原理 如果把ueditor放进这个小窗口里 放进items里(以下截图还没有放) 那么配置的ueditor是不可用的 就好像enable=fal ...