逆向工程核心原理——PE文件格式分析

2023-10-28

什么是PE文件?

PE文件的全称是Portable Executable,意为可移植的可执行的文件

PE文件是指32位可执行文件,也称为PE32。64位的可执行文件称为PE+或PE32+,是PE(PE32)的一种扩展形式(请注意不是PE64)。

常见种类

种 类

主扩展名

种 类

主扩展名

可执行系列

EXESCR

驱动程序系列

SYSVXD

库系列

DLLOCXCPLDRV

对象文件系列

OBJ

展示使用软件

PEview.exe工具是一款可以进行PE文件解析的强大PE文件解析工具。通过PEview软件,我们一起来分析PE文件的详细格式。

通过PEview查看PE文件格式

 

1.DOS头

PE文件头部中的DOS头分为MZ文件头和DOS块

分别对应的是IMAGE_DOS_HEADER和MS-DOS Stub Program

IMAGE_DOS_HEADER头的大小是64个字节

 从4D 5A开头 一直到F0 00 00 00

前两个字节0x4D和0x5A,是字母“M”和“Z”的ASCII码,是MS-DOS设计者Mark Zbikowski的姓名缩写。

最后四个字节,表示下一个头部,即NT头的偏移地址,可以看到,该值是0x000000F0,即NT头的起始地址是0x000000F0

 DOS块

DOS块跟在IMAGE_DOS_HEADER后面,其中,“MS-DOS stub Program”即为DOS块。从字面上理解,DOS块是一个在DOS环境下可以运行的程序,在图3所示的界面中点击左侧的“MS-DOS stub Program”,则会在右侧显示该程序的数据.

This program cannot be run in DOS mode”,来提示用户PE程序必须在Windows下才能运行

IMAGE_DOS_HEADER STRUCT
{
+0h WORD e_magic    // Magic DOS signature MZ(4Dh 5Ah)     DOS可执行文件标记
+2h WORD e_cblp    // Bytes on last page of file
+4h WORD e_cp    // Pages in file
+6h WORD e_crlc    // Relocations
+8h WORD e_cparhdr   // Size of header in paragraphs
+0ah WORD e_minalloc   // Minimun extra paragraphs needs
+0ch WORD e_maxalloc  // Maximun extra paragraphs needs
+0eh WORD e_ss            // intial(relative)SS value        DOS代码的初始化堆栈SS
+10h WORD e_sp     // intial SP value                       DOS代码的初始化堆栈指针SP
+12h WORD e_csum     // Checksum
+14h WORD e_ip     // intial IP value               DOS代码的初始化指令入口[指针IP]
+16h WORD e_cs     // intial(relative)CS value         DOS代码的初始堆栈入口
+18h WORD e_lfarlc     // File Address of relocation table
+1ah WORD e_ovno         // Overlay number
+1ch WORD e_res[4]      // Reserved words
+24h WORD e_oemid      // OEM identifier(for e_oeminfo)
+26h WORD      e_oeminfo   // OEM information;e_oemid specific
+29h WORD e_res2[10]   // Reserved words
+3ch DWORD   e_lfanew     //  Offset to start of PE header      指向PE文件头
} IMAGE_DOS_HEADER ENDS
 
 
 
e_magic:一个WORD类型,值是一个常数0x4D5A,用文本编辑器查看该值位‘MZ’,可执行文件必须都是'MZ'开头。
e_lfanew:为32位可执行文件扩展的域,用来表示DOS头之后的NT头相对文件起始地址的偏移。

有用的只有两个数据,一个是 e_magic 固定为 “MZ”,另外一个是最后的 e_lfanew ,指向pe头 

2.NT头

NT头包括Signatrue、IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER三部分。 

Signatrue

  • Signatrue也叫做PE文件的文件签名,标志该文件的类型为PE。
  • Signatrue共4个字节,其值为0x00004550,即为字符串“PE”。
  • 这个值也是不会变化的。 

IMAGE_FILE_HEADER


 

IMAGE_FILE_HEADER部分共20字节。

从上往下看,

①头两个字节表示机器类型,用于标识CPU的类型,后两个字节表示CPU为Intel 386或后继处理器及其兼容处理器;

②接下来的Number of Section表示节的数目,0x0010表示本应用程序有16个节(section)
③第三个Time date stamp表示时间,这里没有值,如果有值可以换算成十进制秒然后再换算成年月日之类的

④Size of optional header这两个字节是IMAGE_OPTIONAL_HEADER,即NT头的第三部分的大小,其值为0x00E0;

0x00E0就是十进制的224,也就是说OptionalHeader的大小是224字节。

⑤Characteristics这两个字节指定了文件特征值,其值为0x0106

IMAGE_OPTIONAL_HEADER

IMAGE_OPTIONAL_HEADER头由两部分组成:参数部分和数据目录部分;OptionalHeader,占224个字节 

3.section头

  • PE文件的NT头之后就是节(section)头,
  • 每个节头的大小是40字节。
  • PE文件包含的节,可以从图中找到这些节对应的节头

  • 后缀的意义
  • .bss 未初始化的数据

    .data 代码节

    .edata 导出表

    .idata 导入表

    .pdata 异常信息

    .rdata 只读的已初始化数据(常量)

    .reloc 重定位信息

    .rsrc 资源目录

    .sbss 与GP相关的未初始化数据

    .sdata 与GP相关的已初始化数据

    .text 默认代码节

    .idlsym 包含已注册的SEH,以支持IDL

 

  • Name表示节头的名称,其大小为8个字节;
    Virtual Size表示节头对应的节的大小,其大小为4个字节;
    RVA是Relative Virtual Address的简称,即相对虚拟地址,指定了节头对应节的RVA,其大小为4个字节;
    Size of Raw Data指的是磁盘文件中已经初始化数据的大小,其大小为4个字节;
    Pointer to Raw Data、Pointer to Relocations和Pointer to Line Numbers分别保存了节中数据起始地址、重定位项起始地址和行号信息数量的地址,大小均为4个字节;
    Number of Relocations和Number of Line Numbers分别表示节中重定位项的数量和行号信息的数量,大小均为2个字节,
    Characteristics是描述节特征的标志,大小为4个字节。
    Characteristics是描述节特征的标志,其大小为4个字节,共32位,

    Characteristics各位含义
    1-5            未使用                         6              此节包含可执行代码
    7                此节包含已初始化的数据         8            此节包含未初始化的数据
    9-15             未使用                       16             此节包含通过全局指针来引用的数据
    17-24       未使用                            25            此节包含扩展的重定位信息   
    26             此节可以在需要时被丢弃          27            此节不能被缓存
    28              此节不能被交换到页面文件中      29              此节可以在内存中共享   
    30            此节可以作为代码执行             31              此节可读
    32         此节可写

 

地址位置

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逆向工程核心原理——PE文件格式分析 的相关文章

  • 如何从 Visual Studio 中的网站项目中删除项目引用?

    那么 如果我的网站项目 Foo 引用了类库项目 Bar 我该如何删除该引用 该引用存储在 Visual Studio 解决方案文件中 在解决方案资源管理器中右键单击网站的项目项 然后选择 属性页 出现的对话框中的第一项是 参考 您可以从此处
  • Nuget,比较已安装版本与最新版本

    我可以从 Nuget 控制台获取这样的列表 Id Installed Version Latest Version NHibernate 3 3 0 4000 3 3 3 4001 更好的是 对于解决方案中的所有项目 Ideas 您可以将这
  • 我想在 64 位模式下运行我的视觉工作室

    我正在 NET 3 5 中编写 Web 服务 在此我必须访问 SharePoint 2010 数据 但 SharePoint 需要我的应用程序使用 64 位模式 Visual Studio 默认处于 32 位模式 如何以 64 位运行 Vi
  • Visual Studio 代码对 html 的包装太多

    我已将 Visual Studio 代码更新到最新版本 它只是改变了 html 文件的格式 当我再次格式化时 我的所有 html 文件都会发生变化 It wraps like we are coding in tablet mode lea
  • vs2008中的线程窗口在哪里

    我试图在 VS 2008 中找到描述的线程窗口here http www wintellect com cs blogs jrobbins archive 2007 08 01 neat new multithreaded debuggin
  • 在 Visual Studio 2017 中调试 C++ 应用程序不会进入我的代码。有办法关掉它吗?

    好吧 在调试时 例如当我在简单的字符串声明上设置断点时 string a 然后按 f11 步入 我的调试器步入xstring文件 我不想要它 我希望它只进入我的代码 这适用于 C 项目 但不适用于 C 项目 How I defined it
  • 关闭文件后未保存展开/折叠状态

    在 Visual Studio 中 您可以在不使用区域的情况下展开和折叠代码 例如在代码隐藏页面中您可以折叠方法等 而在 ASPX 页面中您可以折叠标签 标签等 当您的页面很长并且您希望将开发重点放在特定部分时 它非常有用 它的一个很酷的地
  • 为什么 Visual Studio 编辑器在空白处显示点?

    我在 Visual Studio 文本编辑器中遇到了一个奇怪的错误 我所有的空格都被替换为 public class Person int age 看起来像这样 public class Person int age 我将设置重置为默认值
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • TypeError [ERR_INVALID_ARG_TYPE]:“listener”参数必须是 Function 类型

    我这里有一个小问题 events js 200抛出新错误 ERR INVALID ARG TYPE listener Function listener 类型错误 ERR INVALID ARG TYPE 侦听器 参数必须是类型 功能 收到
  • Visual Studio IDE 中功能后的空间

    如何设置 Visual Studio 中的设计以在我的 javascript 函数后面放置一个空格 目前 当我按下返回键时 我得到了这个 var myfunc function 当我想要这个的时候 var myfunc function 知
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • VS2010中如何切换头文件和实现?

    Visual Studio 2010 中是否有允许在标头 C C h 文件 和实现 C C cpp 文件 之间切换的键盘快捷键或免费插件 MS added this feature in Visual Studio 2013 It s a
  • 在 Visual Studio 中设置 SSL 证书

    我在新计算机上全新安装了 Visual Studio Community 2019 我启动了一个网络应用程序项目 第一次运行它 然后当提示接受自签名证书时 我以某种方式设法单击 不再询问 and No 此时 运行网络应用程序时 我收到 ER
  • 在 Visual Studio 安装程序中使用 Windows 环境变量作为注册表值

    嘿 我想使用 Windows 环境变量作为注册表项的值 不幸的是我不能简单地写一些像 systemroot system32 MyScreensaver scr 正如您所猜测的 我想将一些注册表值指向我自己的应用程序 例如自动启动和屏幕保护
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • 如何忽略 Pydev Eclipse 中特定的未定义变量

    我正在使用 Eclipse 和 Pydev 插件在 Windows 上编写跨平台 python 脚本 该脚本利用os symlink and os readlink 如果当前平台不是 NT 则使用方法 自从os symlink and os
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • Visual Studio,应用程序设置...重新排列

    愚蠢的问题 纯粹是审美 鉴于上面的图片 如何上移 下移值 例如 状态 属于 高度 宽度 顶部 左侧 窗口位置 状态 分组 这不是我后来添加东西但慢慢变得混乱的唯一项目 可以删除 重新添加 但这会变得乏味且容易出错 可以保留原样 但这只是一个

随机推荐

  • 如何辨别ChatGPT是不是真的

    随着ChatGPT爆红 国内陆续出现了几个所谓的 ChatGPT 反向代理站点 乍一试回答似乎还挺靠谱 但它们真的是ChatGPT吗 本文以其中一个站点为例 对其真伪进行辨别 其实最多只需要问两个问题 基本上就可以做出判断了 1 你是谁 2
  • 为什么说区块链共享的不仅仅是数据?

    数据共享是人与生俱来的需求 比如 在咖啡馆谈人生理想 执笔书写文字等等 这些都是普通人用来和他人交流信息的重要方式 互联网的出现 打破了数据共享在地域和时间方面的限制 它可以让不同人在地球的不同位置进行即时交流 电子邮件 网上即时通讯等技术
  • 单片机及C语言入门

    一 什么是单片机 将CPU芯片 存储器芯片 I O接口芯片和简单的I O设备 小键盘 LED显示器 等装配在一块印刷电路板上 再配上监控程序 固化在ROM中 就构成了一台单片微型计算机 简称单片机 由于单片机在使用时 通常处于测控系统的核心
  • go+gSoap+onvif学习总结:7、进行镜头调焦、聚焦和预置点的增删改查

    cgo gSoap onvif学习总结 7 进行镜头调焦 聚焦和预置点的增删改查 文章目录 cgo gSoap onvif学习总结 7 进行镜头调焦 聚焦和预置点的增删改查 1 前言 2 gSoap生成c代码框架 3 完成c代码实例并测试
  • 接口测试小知识

    1 什么是接口 电脑 USB 投影仪等 数据传输 软件 统称为API application program interface 支付宝支付 微信提现和充值 银联支付接口 鉴权码 token key appkey 接口包括 内部接口和外部接
  • deblurGAN-v2 去模糊深度学习算法。

    https blog csdn net weixin 42784951 article details 100168882 论文 https arxiv org pdf 1908 03826 pdf 代码 https github com
  • 算法基础课:第二讲——数据结构

    文章目录 单链表 算法思想 注意点 模板 例题 AC代码 双链表 算法思想 注意点 模板 例题 AC代码 栈 算法思想 模板 例题 AC代码 队列 算法思想 模板 例题 AC代码 单调栈 作用 算法思想 模板 例题 AC代码 单调队列 作用
  • Java中灵活获取excel中的数据

    在java当中获取excel数据 获取每一列数据 每一行数据 在这里例子是将每一行数据获取出来 并带着表头数据返回 代码 具体实现逻辑在代码注释当中可以参见 public static List
  • 杨桃的Python进阶讲座16——数组array(六)一维数组和二维数组的索引和取值(配详细图解)

    本人CSDN博客专栏 https blog csdn net yty 7 Github地址 https github com yot777 在进阶讲座8中讲过数组 矩阵 的维度 我们再看看多维矩阵的索引和取值方法 一维数组的索引和取值 和列
  • C语言计算两个整数之和

    要求输入2个整数A和B 然后输出它们的和 输入格式 输入在一行中给出整数A和B 输出格式 输出A B的值 输入样例 在这里给出一组输入 例如 3 5 结尾无空行 输出样例 在这里给出相应的输出 例如 8 结尾无空行 include
  • 简析 JavaScript报错 Uncaught TypeError Cannot read properties of null (reading ‘...‘) at new

    JS报错 如下图 报错原因 引入JS的位置错误 为什么位置错误 JS 在页面渲染 生成 之前就执行了代码 发现获取不到页面元素 解决方法 放到页面代码下面 body内部或者下部 随意吧
  • Python爬虫从0到1(完结篇)——增量式爬虫

    本篇是基础爬虫专栏的最后一篇文章 有关进阶爬虫技术的内容现已开始更新 但不会每一篇都会在此处发布 有需要的可直接加群了解 废话不多说 直接进入今天的文章内容 增量式爬虫 基本定义 增量式爬虫就是一个能够在网站原有数据的基础上采集最新公开的一
  • 玩转Java IO流:轻松读写文件、网络

    申明 本人于公众号Java筑基期 CSDN先后发当前文章 标明原创 转载二次发文请注明转载公众号 另外请不要再标原创 注意违规 字符流和字节流 在Java中 IO 输入输出 操作涉及字符流和字节流 它们是两种不同的抽象类 用于处理不同类型的
  • Head Pose系列

    BIWI数据集 下载kinect head pose db tgz 解压如下 hpdb 01 depth cal rgb cal frame 00003 depth bin frame 00003 pose txt frame 00003
  • windows环境下启动和配置nacos最全流程

    一直在用nacos 作为配置中心和服务管理中心 但是nacos服务自己没有部署过 在看了nacos的架构以后 自己决定动手部署下 官网上提供了linux window docker环境部署文档 感觉很简单 按照文档操作一遍发现 启动不了 后
  • R语言中插补缺失值的R包simputation

    R语言中有很多插补缺失值的R包 但是这些R包的使用语法都不一样 不利于学习和记忆 simputation包旨在简化缺失值插补的流程 提供了统一的使用语法 提供多种常见的插补缺失值的方法 可以和管道符 gt 连用 非常值得学习 这个包和之前介
  • flex弹性布局教程-05项目属性flex-shrink

    本节目标 掌握flex shrink的使用 同flex grow类似 掌握flex shrink缩小的计算公式 难点 内容摘要 本篇介绍了 flex shrink 属性 flow grow 用于放大 那么 flex shrink 就是缩小了
  • 匿名内部类

    匿名内部类一般格式为如下 Base base new Base 这种语法是用在实例化本身并不可以实例化的对象 接口 抽象类时使用 因为只有类是可以实例化的 因此这也可以称得上是一种类 因其明显的没有使用class关键字 没有名字 使用在已有
  • mysql高级查询按当天、昨天、每年、每月、每日、每周、近七天、近三十天、当前这周、上周、本季度、上季度统计用户数量

    目录 1 年统计sql 2 月统计sql 3 日统计sql 4 周期统计sql 5 当天sql 6 昨日sql 7 近期7天sql 8 近30天sql 9 本季度sql 10 上季度sql 11 查询当前这周的数据 12 查询上周 13 统
  • 逆向工程核心原理——PE文件格式分析

    什么是PE文件 PE文件的全称是Portable Executable 意为可移植的可执行的文件 PE文件是指32位可执行文件 也称为PE32 64位的可执行文件称为PE 或PE32 是PE PE32 的一种扩展形式 请注意不是PE64 常