热门标签 | 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

 待续....


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
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社区 版权所有