[读书][笔记]WINDOWS PE权威指南《零》PE基础

简介: [读书][笔记]WINDOWS PE权威指南《零》PE基础

参考:

https://zhuanlan.zhihu.com/p/47075612

https://docs.microsoft.com/zh-cn/windows/win32/debug/pe-format

<加密与解密 第4版>

<Windows PE 权威指南>

PE 基础

概念

PE文件是windows系统中遵循PE结构的文件,比如以.exe .dll为后缀名的文件以及系统驱动文件sys。

具体PE文件类型:

可执行系列:EXE,SCR;

驱动程序系列:SYS,VXD;

库系列:DLL,OCX,CPL,DRV;

对象文件系列:OBJ;

装载PE文件

https://blog.csdn.net/benny5609/article/details/1788067

装载一PE文件的主要步骤:

  • 当PE文件被执行,PE装载器检查 DOS MZ header 里的 PE header 偏移量。如果找到,则跳转到 PE header。
  • PE装载器检查 PE header 的有效性。如果有效,就跳转到PE header的尾部。
  • 紧跟 PE header 的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时付上节表里指定的节属性。
  • PE文件映射入内存后,PE装载器将处理PE文件中类似 import table(引入表)逻辑部分

PE组成

PE文件大体分为两部分:

头 (包括下图中的DOS头,PE文件头,块表 Section Table)

主体 ( 块Section)。

Section又被翻译为节 故有节表 节体叫法.

PE文件头结构

PE文件头结构

PE头 IMAGE_NT_HEADERS

扩展PE头/可选头(IMAGE_OPTIONAL_HEADER32)

数据目录项 (IMAGE_DATA_DIRECTORY)

组成:

  • 导出表、
  • 导入表、
  • 资源表、
  • 异常处理表、
  • 安全表、(Certificate Table)
  • 重定位表、
  • 调试表、
  • 版权、
  • 指针目录、
  • TLS、
  • 载入配置、
  • 绑定输入目录、
  • 导入地址表、
  • 延迟载入、
  • COM信息。

PE文件地址与VA(virtualAddress)之间的转换。

虚拟内存

文件偏移地址(File Offset Address) :文件相对于文件开头的偏移

装载基址(Image Base) :PE装入内存时的基地址,EXE在内存中的基地址是0x00400000,DLL的基地址是0x10000000,这些位置可以通过修改编译选项更改

虚拟内存地址 (Virtual Address, VA) :PE文件中的指令被装入内存后的地址,在Windows系统中,PE文件被系统加载器映射到内存中。每个程序都有自己的虚拟空间,这个虚拟空间的内存地址称为虚拟地址(Virtual Address,VA)。

相对虚拟地址(Relative Virtual Address,RVA) :相对虚拟地址是内存地址相对于映射基地址偏移量

虚拟内存地址、装载基址、相对虚拟地址之间的关系:

VA= Image base+ RVA

节偏移

节偏移 :PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织,当PE文件装载到内存时,将按照内存数据标准存放,以0x1000字节为基本单位,所以文件偏移地址和相对虚拟内存会有细微的差别,这种差别称为节偏移

SectionAlignment : 内存当中的块对齐数,一般为0x1000。

FileAlignment :磁盘当中块对齐数,一般为0x200。

文件偏移地址、虚拟内存地址、装载基址、相对虚拟地址和节偏移之间的关系:

文件偏移地址 = 虚拟内存地址(VA)- 装载基址(ImageBase)- 节偏移

= RVA –节偏移

入口点(OEP)

入口点(Original Entry Point) : 首先明确一个概念就是OEP是一个RVA,然后使用OEP +Imagebase ==入口点的VA,通常情况下,OEP指向的不是main函数。

PE 文件磁盘与内存映像

PE文件不是作为单一内存映射文件,被载人内存是很重要的。Windows加载器(又称PE装载器)遍历PE文件并决定文件的哪一部分被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中。磁盘文件一旦被载入内存,磁盘上的数据结构布局和内存中的数据结构布局就是一致的。

当PE文件通过Windows加载器载人内存后,PE在内存中的版本称为模块(Module)。

映射文件的起始地址称为模块句柄(hModule),可以通过模块句柄访问内存中的其他数据结构。这个初始内存地址也称为基地址(ImageBase)。

总结

相关文章
|
3月前
|
缓存 网络协议 数据安全/隐私保护
[运维笔记] - (命令).Windows server常用网络相关命令总结
[运维笔记] - (命令).Windows server常用网络相关命令总结
191 0
|
3月前
|
存储 Ubuntu 开发工具
ffmpeg笔记(二)windows下和ubuntu-16.04下ffmpeg编译
ffmpeg笔记(二)windows下和ubuntu-16.04下ffmpeg编译
|
4月前
|
Linux API C++
音视频windows安装ffmpeg6.0并使用vs调试源码笔记
音视频windows安装ffmpeg6.0并使用vs调试源码笔记
117 0
|
4月前
|
编译器 C++ Windows
9.4 Windows驱动开发:内核PE结构VA与FOA转换
本章将继续探索内核中解析PE文件的相关内容,PE文件中FOA与VA,RVA之间的转换也是很重要的,所谓的FOA是文件中的地址,VA则是内存装入后的虚拟地址,RVA是内存基址与当前地址的相对偏移,本章还是需要用到`《内核解析PE结构导出表》`中所封装的`KernelMapFile()`映射函数,在映射后对其PE格式进行相应的解析,并实现转换函数。
40 0
9.4 Windows驱动开发:内核PE结构VA与FOA转换
|
4月前
|
C语言 Windows
9.3 Windows驱动开发:内核解析PE结构节表
在笔者上一篇文章`《内核解析PE结构导出表》`介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中`LyShark`封装实现了`KernelMapFile()`内存映射函数,在之后的章节中这个函数会被多次用到,为了减少代码冗余,后期文章只列出重要部分,读者可以自行去前面的文章中寻找特定的片段。
26 0
9.3 Windows驱动开发:内核解析PE结构节表
|
4月前
|
存储 Windows
9.2 Windows驱动开发:内核解析PE结构导出表
在笔者的上一篇文章`《内核特征码扫描PE代码段》`中`LyShark`带大家通过封装好的`LySharkToolsUtilKernelBase`函数实现了动态获取内核模块基址,并通过`ntimage.h`头文件中提供的系列函数解析了指定内核模块的`PE节表`参数,本章将继续延申这个话题,实现对PE文件导出表的解析任务,导出表无法动态获取,解析导出表则必须读入内核模块到内存才可继续解析,所以我们需要分两步走,首先读入内核磁盘文件到内存,然后再通过`ntimage.h`中的系列函数解析即可。
36 0
9.2 Windows驱动开发:内核解析PE结构导出表
|
6月前
|
Windows
[笔记] Windows内核课程:保护模式《二》段寄存器介绍
[笔记] Windows内核课程:保护模式《二》段寄存器介绍
|
6月前
|
C语言 Windows
[笔记] Windows内核课程:保护模式《一》保护模式
[笔记] Windows内核课程:保护模式《一》保护模式
|
6月前
|
人工智能 网络协议 API
[笔记] Microsoft Windows网络编程《三》网际协议(三)
[笔记] Microsoft Windows网络编程《三》网际协议(三)
|
6月前
|
人工智能 网络协议 API
[笔记] Microsoft Windows网络编程《三》网际协议(二)
[笔记] Microsoft Windows网络编程《三》网际协议(二)