上次我们学习了IMAGE_OPTIONAL_HEADER的前十个参数,下面我们继续学习。第十一个值SectionAlignment,表示节对齐粒度。这个值一定要大于或等于文件对齐粒度。The alignment of sections loaded in memory, in bytes. This value must be greater than or equal to the FileAlignment member.The default value is the page size for the system.

原来是4096B,也就是4kb了。

第十二个值是FileAlignment,表示文件对齐粒度。

The alignment of the raw data of sections in the image file, in bytes. The value should be a power of 2 between 512 and 64K (inclusive). The default is 512. If the SectionAlignment member is less than the system page size, this member must be the same as SectionAlignment.

这个值应该是512B的倍数。

第十三个值是MajorOperatingSystemVersion,所需操作系统的主版本号。

The major version number of the required operating system.

第十四个值是MinorOperatingSystemVersion,所需操作系统的副版本号。

The minor version number of the required operating system.

第十五个值是MajorImageVersion

The major version number of the image.

第十六个值是MinorImageVersion

The minor version number of the image.

第十七个值是MajorSubsystemVersion

The major version number of the subsystem.

第十八个值为MinorSubsystemVersion

The minor version number of the subsystem.

第十九个值为Win32VersionValue,保留值,且必须为零。

This member is reserved and must be 0.

第二十个值为SizeOfImage,4个字节,表示程序调入后占用内存大小(字节),等于所有段的长度之和。

The size of the image, in bytes, including all headers. Must be a multiple of SectionAlignment.

0x2B000=?

好吧,两三天了,终于弄明白这个值了,由于在实验过程中,为了防止意外,所以复制了一个副本在当前文件夹下,通过二进制的对比,发现这两个文件的SizeOfImage值是不一样的,所以走了弯路。

既然错了文件,那么我还是以这个文件为例吧,因为其他的部分都一样,所以就不修改其他的部分了。

0x25000+0x5188=0x2A188,再考虑内存对齐,我们试着用这个值除以对齐粒度0x1000,看是否能除尽。

结果是不能除尽,所以要求大一点,结果这个SizeOfImage就变成了0x2B000。

第二十一个值为SizeOfHeaders,占用4个字节,表示所有头加节表的大小。

The combined size of the following items, rounded to a multiple of the value specified in the FileAlignment member.

  • 4 byte signature
  • size of IMAGE_FILE_HEADER
  • size of optional header
  • size of all section headers

也就是0x1000了。

第二十二个值为CheckSum,占用四个字节。

The image file checksum. The following files are validated(验证) at load time: all drivers, any DLL loaded at boot time, and any DLL loaded into a critical (关键)system process.

第二十三个值为Subsystem,占用两个字节。表示文件运行所需的子系统。

The subsystem required to run this image. The following values are defined.

Value Meaning
IMAGE_SUBSYSTEM_UNKNOWN0

Unknown subsystem.

IMAGE_SUBSYSTEM_NATIVE1

No subsystem required (device drivers and native system processes).

IMAGE_SUBSYSTEM_WINDOWS_GUI2

Windows graphical user interface (GUI) subsystem.

IMAGE_SUBSYSTEM_WINDOWS_CUI3

Windows character-mode user interface (CUI) subsystem.

IMAGE_SUBSYSTEM_OS2_CUI5

OS/2 CUI subsystem.

IMAGE_SUBSYSTEM_POSIX_CUI7

POSIX CUI subsystem.

IMAGE_SUBSYSTEM_WINDOWS_CE_GUI9

Windows CE system.

IMAGE_SUBSYSTEM_EFI_APPLICATION10

Extensible Firmware Interface (EFI) application.

IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER11

EFI driver with boot services.

IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER12

EFI driver with run-time services.

IMAGE_SUBSYSTEM_EFI_ROM13

EFI ROM image.

IMAGE_SUBSYSTEM_XBOX14

Xbox system.

IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION16

Boot application.

第二十四个值为DllCharacteristics,占用两个字节。表示dll文件的属性值。

The DLL characteristics of the image. The following values are defined.

Value Meaning
0x0001

Reserved.(保留)

0x0002

Reserved.

0x0004

Reserved.

0x0008

Reserved.

IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE0x0040

The DLL can be relocated at load time.(允许在载入的时候进行重定位)

IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY0x0080

Code integrity checks are forced. If you set this flag and a section contains only uninitialized data, set the PointerToRawData member of IMAGE_SECTION_HEADER for that section to zero; otherwise, the image will fail to load because the digital signature cannot be verified.

IMAGE_DLLCHARACTERISTICS_NX_COMPAT0x0100

The image is compatible(兼容) with data execution prevention (DEP).

IMAGE_DLLCHARACTERISTICS_NO_ISOLATION0x0200

The image is isolation(隔离) aware, but should not be isolated.

IMAGE_DLLCHARACTERISTICS_NO_SEH0x0400

The image does not use structured exception handling (SEH). No handlers can be called in this image.

IMAGE_DLLCHARACTERISTICS_NO_BIND0x0800

Do not bind the image.

0x1000

Reserved.

IMAGE_DLLCHARACTERISTICS_WDM_DRIVER0x2000

A WDM driver.

0x4000

Reserved.

IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE0x8000

The image is terminal server aware.

第二十五个值为SizeOfStackReserve,占用4个字节。表示初始化是的堆栈大小。

The number of bytes to reserve for the stack. Only the memory specified by the SizeOfStackCommit member is committed at load time; the rest is made available one page at a time until this reserve size is reached.

0x00100000=1MB

第二十六个值为SizeOfStackCommit,占用四个字节。表示初始化时实际提交的堆栈大小。

The number of bytes to commit for the stack.

0x1000字节=4kb

第二十七个值为SizeOfHeapReserve,占用四个字节。初始化时保留堆的大小。

The number of bytes to reserve for the local heap. Only the memory specified by the SizeOfHeapCommit member is committed at load time; the rest is made available one page at a time until this reserve size is reached.

第二十八个值为SizeOfHeapCommit,占用四个字节。初始化时实际提交的堆得大小。

The number of bytes to commit for the local heap.

第二十九个值为LoaderFlags,占用4个字节。未使用。

This member is obsolete.

第三十个值为NumberOfRvaAndSizes,占用四个字节。表示下面个成员数据目录结构的数量。

这个值一般就直接是16.

下面是最后一个成员DataDirectory,占用128个字节,为一个IMAGE_DATA_DIRECTORY structure结构体数组(16个)。

A pointer to the first IMAGE_DATA_DIRECTORY structure in the data directory.

typedef struct _IMAGE_DATA_DIRECTORY {DWORD VirtualAddress;DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

这个结构体有两个成员,一个成员占用4个字节,也就是8个字节。这个数组有16个数据,也就是16*8=128字节。

我们来看第一个。

IMAGE_DIRECTORY_ENTRY_EXPORT    导出表

这个程序没有导出函数,所以没有导出表。

第二个IMAGE_DIRECTORY_ENTRY_IMPORT  导入表

这个程序需要用到dll中的函数

我们用PEiD来查看下

结果是一样的。这个是RVA,表示偏移地址哦。

第三个IMAGE_DIRECTORY_ENTRY_RESOURCE   资源目录

从上面这张图也可以看出。RVA为00025000,大小为5188byte

第四个IMAGE_DIRECTORY_ENTRY_EXCEPTION  异常目录

未使用。

第五个 IMAGE_DIRECTORY_ENTRY_SECURITY  安全目录

第六个 IMAGE_DIRECTORY_ENTRY_BASERELOC   重定位表

第七个 IMAGE_DIRECTORY_ENTRY_DEBUG  调试信息

第八个 IMAGE_DIRECTORY_ENTRY_COPYRIGHT 版权信息

第九个  IMAGE_DIRECTORY_ENTRY_GLOBALPTR

 

第十个 IMAGE_DIRECTORY_ENTRY_TLS  线程的本地存储器

第十一个 IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 载入配置目录

Load configuration table address and size

第十二个 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT  绑定导入表地址和大小

Bound import table address and size

第十三个 IMAGE_DIRECTORY_ENTRY_IAT  导入函数地址表Import Address Table

Import address table address and size

用Exeinfo PE 查看

第十四个 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT

Delay import descriptor address and size

第十五个 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR

The CLR header address and size

第十六个 IMAGE_NUMBEROF_DIRECTORY_ENTRIES   保留值

到此,整个PE文件头结束了。

PE文件结构及其加载机制(三)相关推荐

  1. JVM-01:类的加载机制

    本文从 纯洁的微笑的博客 转载 原地址:http://www.ityouknow.com/jvm.html 类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...

  2. 如何利用微信小游戏的分包加载机制突破4M代码包体积限制

    相信大家度过了一个不错的端午假期,在端午前夕,即6月15日晚上,微信小游戏宣布支持分包加载功能,白鹭引擎在端午节后第一天正式支持分包加载机制.在正式向开发者介绍如何使用前,我先为各位解读一下我对微信提 ...

  3. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...

  4. 【Linux 内核】宏内核与微内核架构 ( 操作系统需要满足的要素 | 宏内核 | 微内核 | Linux 内核动态加载机制 )

    文章目录 一.操作系统需要满足的要素 二.宏内核 三.微内核 四.Linux 内核动态加载机制 一.操作系统需要满足的要素 电脑上运行的 操作系统 , 是一个 软件 ; 设备管理 : 操作系统需要 为 ...

  5. 【Android 应用开发】UI绘制流程 ( 生命周期机制 | 布局加载机制 | UI 绘制流程 | 布局测量 | 布局摆放 | 组件绘制 | 瀑布流布局案例 )

    文章目录 一. 博客相关资料 及 下载地址 1. 代码查看方法 ( ① 直接获取代码 | ② JAR 包替换 ) 2. 本博客涉及到的源码查看说明 二. Activity 生命周期回调机制 1. An ...

  6. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  7. 【干货】APP产品处理加载机制和刷新机制的交互方法解析

    外行人对交互设计的第一印象是什么?画线框图的?做草稿的? 的确,大家所看到交互设计师的日常工作成果都是一些线框图,从表面上理解的确是这样. 其实,交互设计师做的远远不止这些.往深一步想,信息架构.界面 ...

  8. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  9. Spring中ApplicationContext加载机制和配置初始化

    转自:http://liuwei1578.blog.163.com/blog/static/495803642007116111923195/ Spring中ApplicationContext加载机 ...

最新文章

  1. hsf 架构_HSF 服务
  2. linux下访问windows的共享
  3. centos下部署tomcat详解
  4. python调用hive与java调用区别_Python操作Hive的两种方法总结
  5. Qt Designer中部件的tabletTracking和mouseTracking属性
  6. 线程池的各种使用场景
  7. Android动画效果
  8. 三维重建:三维重建技术概述
  9. Android Studio 修改项目包名(任意级)
  10. java day18【线程池、Lambda表达式】
  11. Android studio如何导入已有的eclipse工程
  12. java 相等测试与继承
  13. python爬取12306_爬虫12306返回数据怎么解析
  14. Matlab里面如何实现多行注释
  15. 计算机如何取消自动关机,电脑怎么设置自动关机及取消自动关机
  16. Silverlight 中文教程第五部分:用 ListBox 和 DataBinding 显示列表数据 (木野狐译)
  17. java实现麦克风自动录音
  18. window统计文本字节_在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数-使用帮助-字的区别...
  19. C语言for循环详解
  20. Flash Builder 经典使用技巧

热门文章

  1. (转)maven打包时跳过测试
  2. 使用 Laradock 10 分钟部署 Laravel 或 Notadd 环境
  3. HDU2544 最短路(模版题dijkstra/floyd/spfa)
  4. asp.net mvc @RenderBody()的问题
  5. 分析文件上传过程中的HTTP头部
  6. WIN7、XP局域网共享问题和重置IP协议
  7. 《花田半亩》有感——午夜静静地震撼着我的生命(不是技术,发在首页,只是因为感动)...
  8. 容器中的JVM资源该如何被安全的限制?
  9. spark-机器学习实践-K近邻应用实践一
  10. Java API —— BigInteger类