PE文件学习系列三-PE头详解
Q Q:408365330 E-Mail:egojit@qq.com
最近比较忙,只能抽节假日去学习和记录自己的学习,这一节我记录自己学习PE头的学习。在这里给大家介绍一本很好的学习PE的书:Windows PE权威指南。上一节我们一起学习DOS头。DOS头很多内容在16位DOS系统下面才会用到。在现在的Win32系统中,这些事冗余。
因此我们关注更多的是PE头而非DOS头。首先上图,对着图片看才够清晰:

以后不管我们学习PE的哪个结构,我们都对着这个图去学习,这样才会有感觉。
上PE头C结构描述,这个结构还是在WinNT.h中:
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
请查看上面的图片四字节的被称为PE标识符的Signature这四个字节就是图上面的PE00。我猜PE文件的称谓也是这个缘由吧。
。_IMAGE_NT_HEADERS 结构的另外两个成员都是结构体,
1.PE标准机构-IMAGE_FILE_HEADER
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;//运行平台
WORD NumberOfSections;//PE文件中节的数量
DWORD TimeDateStamp;//文件创建时间和日期
DWORD PointerToSymbolTable;//指向符合表(用于调试)
DWORD NumberOfSymbols;//符合表中符号数量(用于调试)
WORD SizeOfOptionalHeader;//扩展头结构的长度
WORD Characteristics;//文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
我已经给机构成员后面添加了备注,让我们理解这个结构。IMAGE_FILE_HEADER.NumberOfSections。PE节的数量,这个可以对节区信息进行遍历的循环次数。
2.PE扩展头-IMAGE_OPTIONAL_HEADER32
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;//魔术字
BYTE MajorLinkerVersion;//连接器版本号
BYTE MinorLinkerVersion;
DWORD SizeOfCode; //所有含代码节的总大小
DWORD SizeOfInitializedData;//所有含已初始化数据的节的总大小
DWORD SizeOfUninitializedData;//所有含未初始化数据的节的大小
DWORD AddressOfEntryPoint;//程序执行入口RVA
DWORD BaseOfCode;//代码节的起始RVA
DWORD BaseOfData;//数据节的起始RVA
//
// NT additional fields.
//
DWORD ImageBase; //程序的建议装载地址
DWORD SectionAlignment;//内存节的对齐粒度
DWORD FileAlignment;//文件中节的对齐粒度
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;//操作系统版本号
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;//内存中PE镜像文件尺寸
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;//DLL文件特性
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;//下面的数据目录结构的项目数量
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
以上我对一些比较关注的机构字段加上了备注。
查看以上机构我们看到这个IMAGE_OPTIONAL_HEADER32结构内容特别丰富,比PE标准结构丰富多了。
SectionAlignment这个字段是内存中节的对齐粒度,在这里我要说明下,Windows系统中(默认32位系统),操作系统能识别4G内存,对于每个进程都有一个独立的4G虚拟内存。在这种4G虚拟内存机制中起到最大的作用是内存分页机制,内存分页机制将一部分硬盘空间作为内存。而这个分页机制中的页大小为4K,也就是16进制的1000H。那么我们很容易知道默认的SectionAlignment值就是1000H,也就是4K。当然PE文件在硬盘上是不一样的,PE文件存磁盘上对齐粒度是200H。
结构最后一个字段IMAGE_DATA_DIRECTORY。该字段定义了PE文件中出现的所有不同类型的数据的目录信息,应用程序中数据被按照用途分成很多种类,如导入表,导出表,资源,重定位表等,DataDirectory数组个数为16。
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;//数据起始RVA
DWORD Size;//数据块长度
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
IMAGE_DATA_DIRECTORY.VirtualAddress虚拟地址指定的是相应节的相对虚拟地址(RVA),PE文件中有16个节,严格讲有15个,最后一个是预留的。
学到这有人会问,看了这么多结构,有什么用呢??这个真的很有用,后期可以写程序区分析这些机构。可以动态改变PE结构,可以给PE文件加密……,等等都是靠对这些机构的理解才能做到。
-----
PE文件学习系列三-PE头详解的更多相关文章
- PE文件学习系列二 DOS头分析
合肥程序员群:49313181. 合肥实名程序员群 :128131462 (不愿透露姓名和信息者勿加入)Q Q:408365330 E-Mail:egojit@qq.com PE文件结 ...
- Hexo系列(三) 常用命令详解
Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...
- PE文件学习系列一为什么是PE
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)Q Q:408365330 E-Mail:egojit@qq.com PE概述: ...
- elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))
一.分词器 1. 认识分词器 1.1 Analyzer 分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...
- PE文件学习系列笔记四-C++实现PE文件的分析
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综述: 首 ...
- SpringMVC学习总结(三)——Controller接口详解(2)
4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4.web.servle ...
- [读书笔记]C#学习笔记三: C#类型详解..
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- zepto学习(三)之详解
zepto Zepto就是jQuery的移动端版本, 可以看做是一个轻量级的jQuery github地址: https://github.com/madrobby/zepto 官方地址: http: ...
- Struts2学习第三课 Struts2详解
接着上次的课程 这次我们看struts.xml 修改如下:这里是加上命名空间,默认的是不加,我们手动加上时就要在访问时加上命名空间. <?xml version="1.0" ...
随机推荐
- 使用jquery-qrcode生成二维码
一.使用jquery-qrcode生成二维码 先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcod ...
- shell-脚本入门【转】
转自:http://blog.csdn.net/gexiaobaohelloworld/article/details/7973846 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?) ...
- DB2常用sql函数 (转载)
http://www.techonthenet.com/sql/index.php 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字 ...
- Volley全方位解析,带你从源码的角度彻底理解
Volley 是 Google 推出的轻量级 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布.其适用场景是数据量小,通信频繁的网络操作. 主要特点: ( ...
- 关于Android中ArrayMap/SparseArray比HashMap性能好的深入研究
由于网上有朋友对于这个问题已经有了很详细的研究,所以我就不班门弄斧了: 转载于:http://android-performance.com/android/2014/02/10/android-sp ...
- 关于GDB使用
编译时要加上 -g 才可以提供给gdb符号信息. 启动: $gdb (target-program) 单步执行: $n 设断点: 1.程序入口 $break (functionname()) 2.行 ...
- .net面试题集锦
1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...
- CAS单点登录和spring securtiy集成
说明:本文章主要建立在spring-security早已集成在系统中的前提下: 1.需要创建一个spring-security.xml文件并关联在applicationContext.xml文件中:& ...
- centos7 docker zookeeper
docker run --name=zookeepertmp -i -t centos7/jdk7 /bin/bash cd /home wget http://apache.fayea.com/zo ...
- LINQ之路 9:LINQ to SQL 和 Entity Framework(上)
在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的 ...