热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PE文件结构初学

PE的意思是PortableExecutable(可移植的执行体),它是Win32环境自身所带的执行文件格式。在Win32系统中,PE文件可以认为.exe、.dll、.sys、.scr类型的

PE 的意思是 Portable Executable(可移植的执行体),它是 Win32环境自身所带的执行文件格式。在Win32系统中,PE文件可以认为.exe、.dll、.sys 、.scr类型的文件,这些文件在磁盘上存贮的格式都是有一定规律的。

PE格式的文件通过16进制数对文件的数据内容进行表示。

PE结构可以理解:Windows系统对文件进行识别后,按照固定的数据组织形式进行解读,然后在该系统下进行某些操作。这种系统识别的固定数据组织形式被称为PE文件结构。故,学习PE文件就是学习Windows系统的这种固定的数据组织形式。

下面是一个用16进制工具UE打开的pe文件后,我们所看到的样子。UltraEdit工具

Sys:系统文件,如驱动文件。

一个完整的PE文件主要有上面4个部分组成

1、Dos部分主要用来对非FE格式文件的处理,DOS时代遗留的产物,是PE文件的一个遗传基因,主要用来对非FE格式文件的处理.

2、PE头部分用于宏观上记录文件的一些信息,分用于宏观上记录文件的一些信息,运行平台,大小,创建日期,属性等.

3、节表部分用于对各中类型的数据进行定义分段。用于对各中类型的数据进行定义分段.

4、节数据不言而喻就是文件的数据部分,实际上我们编写程序的过程中就是对该部分的数据进行编写。

而其他的部分则是由编译器依照我们编写的部分进行相应的填写而得到的。

 

DOS部分由如下两部分构成: Dos头和Dos块。

Dos头:长度40h,4行*16,

Dos块:长度不定DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。

Dos头对于非pe结构的文件将指引dos可执行程序部分,也就指引到dos块。而对于PE结构的文件将指引到PE结构部分。具体如何指引是通过dos头结构进行指定的。

 

•IMAGE_DOS_HEADER STRUCT

•  e_magic             WORD      ?  ;DOS可执行文件标记,固定为“MZ”

•  e_cblp              WORD      ?

•  e_cp                WORD      ?

•  e_crlc              WORD      ?

•  e_cparhdr           WORD      ?

•  e_minalloc          WORD      ?

•  e_maxalloc          WORD      ?

•  e_ss                WORD      ?  ;DOS代码的初始化堆栈段

•  e_sp                WORD      ?  ;DOS代码的初始化堆栈指针

•  e_csum              WORD      ?

•  e_ip                WORD      ?  ;DOS代码的入口IP

•  e_cs                WORD      ?  ;DOS代码的入口CS

•  e_lfarlc            WORD      ?

•  e_ovno              WORD      ?

•  e_res               WORD   4 dup(?)

•  e_oemid             WORD      ?

•  e_oeminfo           WORD      ?

•  e_res2              WORD  10 dup(?)

•  e_lfanew            DWORD      ?  ;指向PE文件的头部

•IMAGE_DOS_HEADER ENDS

这里是对dos头结构的完整定义,该字段的长度固定为40h(该40是16进制表示)。4行*16

第一项是字段的名称,第二项是字段的度量单位,第三项是字段的是数据内容,由于这里是介绍该结构用?表示,?前面的数字表示该字段的长度。有一个是4个长度的有一个是10个长度的。对于研究PE结构而言,该结构的定义中对我们有意义的字段只有最后一个(也就是红色的那一行),该字段的内容是一个长度为4个字节的地址,用于指向PE结构部分。

dosHeader->e_lfanew是DWORD类型,指出真正PE头相对于文件基地址的偏移值,即偏移多少个字节.

对于该字段在文件中如何查找,需要计算该字段E_lfanew的偏移(就是3Ch)。偏移的计算方法很简单,就是计算从结构头部到该字节的长度。下面我们来计算下这个字段的偏移。

E_lfanew字段前面共有18个字段,每个字段的单位都是word(也就是2个字节)长度有一个是4,一个是10,那么e_lfanew字段相对该结构首地址的偏移就是(可调用系统的计算器进行计算转换)(18-2+4+10)x2=60,转换成16进制就是3C,也可以利用一个更简单的方法来计算,该结构的长度为40, e_lfanew字段的长度为4,相减就得到了e_lfanew字段的偏移是3c。

由于该结构的各个字段都是固定的, e_lfanew字段的偏移在不同的PE文件中都是不变的。但不同的pe 文件该字段中的数据内容并不一定相同。 (也就是说不同文件的PE头结构的首地址不一定相同)

http://lwglucky.blog.51cto.com/1228348/283812

 待续....


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 本文详细介绍了MicroATX(也称Mini ATX)和MATX主板规格,探讨了它们的结构特点、应用场景及对电脑系统成本和性能的影响。同时,文章还涵盖了相关操作系统的实用技巧,如蓝牙设备图标删除、磁盘管理等。 ... [详细]
  • PHP数组平均值计算方法详解
    本文详细介绍了如何在PHP中计算数组的平均值,涵盖基本概念、具体实现步骤及示例代码。通过本篇文章,您将掌握使用PHP函数array_sum()和count()来求解数组元素的平均值。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
author-avatar
爷_引领霸气
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有