专栏首页逆向技术PE知识复习之PE的两种状态

PE知识复习之PE的两种状态

          PE知识复习之PE的两种状态

一丶熟悉PE的整体结构

从下面依次网上看.可以得出PE结构

其中DOS头有DOS头结构 也就是 IMAGE_DOS_HEADER

关于结构体的各项属性.前边已经写过了.本系列博客就是加深PE印象.理解复杂的原理.

IMAGE_DOS_HEADER 大小 64个字节 十六进制 0x40字节

IMAGE_FILE_HEADER 大小 20个字节 十六进制 0x14字节

IAMGE_OPTIONAL_HEADER 224个字节 十六进制 0xE0

IMAGE_SECTION_HEADER 40个字节 十六进制 0x28

二丶学习DOS头

根据上面得到DOS头所占用大小是0x40. 也就是说一个按照16进制为一行的PE文件.4行正好就是一个DOS头大小.

例如: 使用Winhex查看.

DOS结构体重要的成员就两个.

1.MZ头

2.指向PE偏移.

MZ头就是标出来的 4D 5A 大小是两个字节. 操作系统会以检查这个标识.判断是否是PE文件.

PE偏移 0x00000138 大小是4个字节.指向PE头. NT头中的PE标识.操作系统不光检查MZ 也检查PE.

三丶DOS stub

Dos stub 大小是不确定的,他的大小是 PE头减掉 DOS头大小.其中成员都是Dos stub.

四丶确定文件头

根据我们文件头大小. 0x14 大小.那么PE后面就是文件头

五丶确定扩展头

我们的扩展头很大.32位64不一样.我们文件头下面就是这个扩展头.

注意,我们这个头的大小也在文件头中存储着. 我们可以更改的.如果更改.那么我们的扩展头就要更改.

例如文件头中存储着扩展头大小

而文件头下面的这些成员都是扩展头

六丶节表

节表是很重要的.我们真正的数据就是存在节表里面.

节表大小 十进制 40个字节,十六进制 0x28

可以看出节表大小. 里面第一个是text节.第二个是rdata节...

在我们的扩展头中.有一个成员是记录着 DOS头 + NT头(文件+扩展 在一起称为NT) + 节表的大小. 按照文件对齐存放着.

sizeofHeaders 按照文件对齐.存储着 头+ 节表的大小.

fileAlignment 是扩展头中的文件对齐值.

具体属性后面会详解.

七丶节数据

我们的节表存放着节数据的信息.比如节在哪里开始.数据在哪里存放. 而我们的 头+ 节表 按照文件对齐过后.下面就是节数据了.

例如:

填写AAAA的地方是对其后没有使用的.所以我们如果熟悉PE可以添加任何成员进去.

八丶PE中的两种状态

根据上面简单了介绍了一下PE的存储结构.也知道了节数据跟节数据之间.都是根据文件对齐存放的.

但是我们的PE是可以运行的.(exe. dll也是.sys也是...这里指EXE) 所以在内存中状态也会改变.也就是偏移会改变.

例如下图:

在文件中我们的对齐是按照 0x200存放的. 而在内存中就是按照0x1000.假设是1000. 多余的地方补0

我们 的DOS头 + NT头 + 节表.按照文件对齐之后存放着. 节的数据是从400开始.也就是上图.

但是在内存中就不一样了. 如果按照0x1000对齐.那么在内存中就是1000位置开始是节数据了.

首先内存中的位置不一样

PE中 DOS头 + NT头 + 节表. 不管内存中还是文件中成员都是一样的.而因为对齐值不同.节数据开始位置也不同.

因为一个在文件中存放.一个在内存中展开.

比如我们在文件中 偏移 0x400位置.是节数据.在内存中就不会有了.

如下图所示:

因为内存是按照0x1000进行对齐的 对齐方式0x1000也会有成员存储着.下面几讲复习的时候会讲到.

所以在内存中1000偏移位置才是节数据.如下图

九丶总结PE中的两种状态.

PE分为文件状态.跟内存状态.

文件状态下. 根据扩展头下面的文件对齐值. 以及记录对其头的大小进行存放的.

内存状态下.根据扩展头中内存对齐值.以及对其头大小进行存放的.

比如:

  文件对齐值为0x200 DOS头 + NT头 + 节表 = 0x301大小. 但是文件对齐值是200.比如要整除200. 所以 对齐头打下不是0x301. 而是 0x400. 也就是0x400位置存放的是节数据.

内存同上.只不过对齐值不同.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PE知识复习之PE扩大节

      上面我们讲了,空白区添加我们的代码.但是有的时候.我们的空白区不够了怎么办.所以需要进行扩大节.

    IBinary
  • PE知识复习之PE的节表

    节表重要成员都标红了.我们知道.PE文件有两种状态.一种是内存状态.一种则是文件状态.

    IBinary
  • C语言_第二讲_规范以及常用数据类型

    一丶编码规范基本数据类型 编码规范 任何程序员,都应该有良好的的编码习惯,便于以后的代码可读性和维护 常见了编码规范有 匈牙利命名法 驼峰式大小写 匈牙利命名法...

    IBinary
  • 虚拟存储管理

    程序局部性原理:基于大量的程序运行特征的观察发现在一段时间内,一个程序的执行往往是呈现高度的局部性。 表现在以下两个方面: 时间局部性:若一条指令被执行,那么不...

    用户1215536
  • NIO DirectByteBuffer 内存泄露的测试

          写NIO程序经常使用ByteBuffer来读取或者写入数据,那么使用ByteBuffer.allocate(capability)还是使用ByteB...

    小程故事多
  • 疑案追踪:Spring Boot内存泄露排查记

    在项目迁移到Spring Boot之后,发生内存使用量过高的问题。本文介绍了整个排查过程以及使用到的工具,也非常适用于其他堆外内存排查。

    美团技术团队
  • MMU那些事儿

    [导读] 本文从内存管理的发展历程角度层层递进,介绍MMU的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将MMU的工作原理从概念上比较清晰的梳理了一遍...

    逸珺
  • 聊聊 Linux 的内存统计

    本文主要分析 Linux 系统内存统计的一些指标以及进程角度内存使用监控的一些方法。

    程序员小强
  • centos释放无用内存

    centos中发现自己的进程消耗内存极少,但是系统的空闲内存确实没了,其实是CentOS为了提高效率,把部分使用过的文件缓存到了内存里。这样的话如果不需要这样的...

    似水的流年
  • win32应用程序性能测试-内存篇

    本文主要讲述windows平台下应用程序性能测试的内存相关的知识,通过本文了解内存基本原理和分析内存占用问题。 一、内存是什么? 1内存分为物理内存和虚拟内存 ...

    腾讯移动品质中心TMQ

扫码关注云+社区

领取腾讯云代金券