1. 前述

在 NT 头结束后,紧接着就是区块表,区块表包含每个块在映象中的信息,分别指向不同的区块实体。

2. 区块表

区块表是一个 IMAGE_SECTION_HEADER 结构数组,这个结构包含区块的信息,比如位置、长度、属性等,区块的数目是由 NT 头中的文件头里的 NumberOfSections 给出。以下为 `IMAGE_SECTION_HEADER` 结构:

在上述图中,有两个字段比较重要,分别为 `VirtualAddress`、`PointerToRawData`,这两个字段用于将相对虚拟地址或虚拟地址转换为文件偏移地址,以下为 RVA 转 FOA 函数:

DWORD RVAtoFOA(DWORD dwRva)
{
// 获取区段表的数量
DWORD dwCounts = g_NtHeader->FileHeader.NumberOfSections; // 获取区段表数组的首元素
auto Sections = IMAGE_FIRST_SECTION(g_NtHeader); // 遍历所有的区段表找到符合要求的区段
for (DWORD i = 0; i < dwCounts; ++i)
{
// 要求:RVA >= 区段的首地址 并且 RVA < 区段的结尾的地址
if (dwRva >= Sections[i].VirtualAddress &&
(Sections[i].VirtualAddress + Sections[i].SizeOfRawData))
{
// FOA = VA - ImageBase - (所在区段的 RVA - 所在区段的 FOA)
// FOA = RVA - 所在区段的 RVA + 所在区段的 FOA
return dwRva - Sections[i].VirtualAddress + Sections[i].PointerToRawData;
}
} // 如果找不到就返回 -1
return -1;
}

计算公式为:`FOA = VA - ImageBase - (所在区段的 RVA - 所在区段的 FOA)` 或 `FOA = RVA - 所在区段的 RVA + 所在区段的 FOA`。在上述代码中,有一个为 `IMAGE_FIRST_SECTION`,我们来看下它的定义,如下:

其实 `IMAGE_FIRST_SECTION` 为一个宏,它主要由三部分相加组成,作用是获取到第一个区段的首地址,参数为 NT 头。你可以把这个首地址理解成数组名,数组的首地址。在获取到了地址后,下面的 for 循环遍历所有的区段表找到符合要求的区段。这三部分内容具体如下:

  • IMAGE_NT_HEADERS 的起始地址
  • IMAGE_OPTIONAL_HEADER32 (PE 扩展头)在 IMAGE_NT_HEADERS 中的偏移
  • IMAGE_OPTIONAL_HEADER32 的大小

其中后两个加起来的大小恰好就是 IMAGE_NT_HEADERS 的大小,再跟第一个相加就得到区段表的地址了。看到这你可以会问,为什么不直接加上 `IMAGE_NT_HEADERS` 的大小呢?因为 `IMAGE_OPTIONAL_HEADER32` 大小不固定,32 位下该值为 0x00E0H,64 位下该值为 0x00F0H,并且用户还可以自定义其大小。

3. 额外说明

扩展头大小是由文件头中 `SizeOfOptionalHeader` 字段给出,`FIELD_OFFSET` 这个是给出 `OptionalHeader` 在 `IMAGE_NT_HEADERS` 结构中的偏移,如下:

(本小节完)

PE 学习之路 —— 区块表的更多相关文章

  1. 小甲鱼PE详解之区块表(节表)和区块(节)(PE详解04)

    到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到SectionTable (区块表,也成节表).(视频教程:http://fishc.com ...

  2. PE 学习之路 —— DOS 头、NT 头

    1. 前述 可执行文件的格式是操作系统本身执行机制的反映,理解它有助于对操作系统的深刻理解,掌握可执行文件的数据结构及其一些机理,是研究软件安全的必修课.`PE(Portable Executable ...

  3. 小甲鱼PE详解之区块表(节表)和区块(节)续(PE详解05)

    这一讲我们结合实例来谈谈区块表的定义以及各个属性的含义. 首先,我们先用之前学过的一点知识在二进制文件中手动翻找区块表,这样做的好处是可以使你很快的对PE结构牢记于心.学来的东西就是能用的东西,不能用 ...

  4. Python学习之路day4-列表生成式、生成器、Iterable和Iterator

    一.列表生成式 顾名思义,列表生成式就是用于生成列表的特殊语法形式的表达式. 1.1 语法格式 [exp for iter_var in iterable] 工作过程: 1.通过iter_var迭代i ...

  5. 小甲鱼PE详解之区块描述、对齐值以及RVA详解(PE详解06)

    各种区块的描述: 很多朋友喜欢听小甲鱼的PE详解,因为他们觉得课堂上老师讲解的都是略略带过,绕得大家云里雾里~刚好小甲鱼文采也没课堂上的教授讲的那么好,只能以比较通俗的话语来给大家描述~ 通常,区块中 ...

  6. PE解析器的编写(三)——区块表的解析

    PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的. 具有相同属 ...

  7. FastAPI 学习之路(十六)Form表单

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  8. FastAPI 学习之路(十八)表单与文件

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  9. 小甲鱼PE详解之输入表(导入表)详解(PE详解07)

    捷径并不是把弯路改直了,而是帮你把岔道堵上! 走得弯路跟成长的速度是成正比的!不要害怕走上弯路,弯路会让你懂得更多,最终还是会在终点交汇! 岔路会将你引入万劫不复的深渊,并越走越深…… 在开始讲解输入 ...

随机推荐

  1. Python学习---django知识补充之CBV

    Django知识补充之CBV Django: url    -->  def函数      FBV[function based view]  用函数和URL进行匹配 url    --> ...

  2. 延期年金(deferred annuity)

    含义:推迟m个时期后才开始付款的年金. 延期年金现值为 二.永续年金(Perpetuity) 永续年金:无限期支付下去的年金. 为期末付永续年金(perpetuity-immediate)的现值 表示 ...

  3. Linq使用技巧及查询示例(一)

    Linq的使用大体分为两种:语句表达式   和  方法 首先,我们要在控制器中定义好context private ApplicationDbContext db = new ApplicationD ...

  4. [EffectiveC++]item23:Prefer non-member non-friend functions to member functions

    99页 导致较大封装性的是non-member non-friend函数,因为它并不增加“能否访问class内之private成分”的函数数量.

  5. iOS--性能优化--保持界面流畅

    卡顿产生的原因和解决方案 在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建.布局计算.图片解 ...

  6. TCP (传输控制协议)

    http://baike.baidu.com/item/TCP/33012?fr=aladdin TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可 ...

  7. [转]CentOS 7忘记root密码解决办法

    转自:http://www.linuxidc.com/Linux/2016-08/134034.htm  亲测可用! CentOS 7 root密码的重置方式和CentOS 6完全不一样,CentOS ...

  8. 马克飞象markdown用法

    目录 markdown用法 ### 根据标题生成目录 `` 快捷键 ctrl+k 代码区域 ctrl+2 二级标题 ctrl+b/i 粗体/斜体 ctrl+l 插入链接 ctrl+g 插入图片 ctr ...

  9. ctf经典好题复习

    WEB200-2 这是swpu-ctf的一道题. <?php if(isset($_GET['user'])){ $login = @unserialize(base64_decode($_GE ...

  10. wireMock快速伪造restful服务

    官网地址:http://wiremock.org/ Jar下载:http://repo1.maven.org/maven2/com/github/tomakehurst/wiremock/1.57/w ...