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

 待续....


推荐阅读
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
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社区 版权所有