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位置存放的是节数据.

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

PE知识复习之PE的两种状态的更多相关文章

  1. PE知识复习之PE的导入表

    PE知识复习之PE的导入表 一丶简介 上一讲讲解了导出表. 也就是一个PE文件给别人使用的时候.导出的函数  函数的地址 函数名称 序号 等等. 一个进程是一组PE文件构成的.  PE文件需要依赖那些 ...

  2. PE知识复习之PE的RVA与FOA的转换

    PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...

  3. PE知识复习之PE的节表

    PE知识复习之PE的节表 一丶节表信息,PE两种状态.以及重要两个成员解析. 确定节表位置: DOS + NT头下面就是节表. 确定节表数量: 节表数量在文件头中存放着.可以准确知道节表有多少个. 节 ...

  4. PE知识复习之PE的绑定导入表

    PE知识复习之PE的绑定导入表 一丶简介 根据前几讲,我们已经熟悉了导入表结构.但是如果大家尝试过打印导入表的结构. INT IAT的时候. 会出现问题. PE在加载前 INT IAT表都指向一个名称 ...

  5. PE知识复习之PE的重定位表

    PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思.  如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234.  如果Im ...

  6. PE知识复习之PE的导出表

    PE知识复习之PE的导出表 一丶简介 在说明PE导出表之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗. 答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就 ...

  7. PE知识复习之PE文件空白区添加代码

    PE知识复习之PE文件空白区添加代码 一丶简介 根据上面所讲PE知识.我们已经可以实现我们的一点手段了.比如PE的入口点位置.改为我们的入口位置.并且填写我们的代码.这个就是空白区添加代码. 我们也可 ...

  8. PE知识复习之PE的各种头属性解析

    PE知识复习之PE的各种头属性解析 一丶DOS头结构体 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // M ...

  9. PE知识复习之PE合并节

    PE知识复习之PE合并节 一丶简介 根据上一讲.我们为PE新增了一个节. 并且属性了各个成员中的相互配合. 例如文件头记录节个数.我们新增节就要修改这个个数. 那么现在我们要合并一个节.以上一讲我们例 ...

随机推荐

  1. 关于阿里ICON矢量图(SVG)上传问题.

    注意点: 1. 存储为svg格式(建议使用存储为svg,不要使用导出为svg)2. 图像位置:链接(注意哦,不要点嵌入和保留编辑功能)---确定3. AI里面选中图形,点对象-路径-轮廓化描边 软件编 ...

  2. SCOPE_IDENTITY() 和 @@identity

    @@IDENTITY 和SCOPE_IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值.但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值:@@IDENTITY 不受限于 ...

  3. 浏览器url地址殊字符转义编码

    网址URL中特殊字符转义编码字符    -    URL编码值 空格    -    %20"          -    %22#         -    %23%        -   ...

  4. 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强

    l 泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器 泛型 1 回顾泛型类 泛型类:具有一个或多个泛型变量的类被称之为泛型类. public class A<T> { ...

  5. jq 点击复制div里面的内容 如果粘贴到富文本中,会将样式,里面所有的标签,文字一并粘贴进去

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 【.NET Core微服务实战-统一身份认证】开篇及目录索引

    简介 ​ 学习.NETCORE也有1年多时间了,发现.NETCORE项目实战系列教程很少,都是介绍开源项目或基础教程,对于那些观望的朋友不能形成很好的学习思路,遇到问题怕无法得到解决而不敢再实际项目中 ...

  7. 从零开始学深度学习mxnet教程:安装以及基本操作

    一.导言 本教程适合对人工智能有一定的了解的同学,特别是对实际使⽤深度学习感兴趣的⼤学⽣.⼯程师和研究⼈员.但本教程并不要求你有任何深度学习或者机器学习的背景知识,我们将从头开始解释每⼀个概念.虽然深 ...

  8. 【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动

    第6章        示波器设计—双通道ADC驱动 本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现.关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用, ...

  9. MySQL 数据库最优化设计原则

    规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过10 ...

  10. [Swift]LeetCode576. 出界的路径数 | Out of Boundary Paths

    There is an m by n grid with a ball. Given the start coordinate (i,j) of the ball, you can move the ...