PE知识复习之PE的节表

一丶节表信息,PE两种状态.以及重要两个成员解析.

  确定节表位置: DOS + NT头下面就是节表.

  确定节表数量: 节表数量在文件头中存放着.可以准确知道节表有多少个.

  节表是一个结构体数组.没一个节表表示了数据在哪,怎么存储.

下方是节的结构体

  1. typedef struct _IMAGE_SECTION_HEADER {
  2. BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //8个字节名字.自己可以起.编译器也可以给定.不重要.
  3. union {
  4. DWORD PhysicalAddress;
  5. DWORD VirtualSize; //节数据没有对齐后的大小.也就是没有对齐.节数据有多大.
  6. } Misc;
  7. DWORD VirtualAddress;          //加载到内存中的第一个字节的地址.也就是虚拟地址.节在内存中哪里开始.内存中的VA + ImageBase 才是真正的节开始位置
  8. DWORD SizeOfRawData;           //节在文件中对齐后的属性.跟是可选头中文件对齐的整数倍. sizeofRawData /文件对齐==0
  9. DWORD PointerToRawData;         //在文件中的偏移.是文件对齐成员倍数.
  10. DWORD PointerToRelocations; //一下都是调试相关.
  11. DWORD PointerToLinenumbers; //
  12. WORD NumberOfRelocations;
  13. WORD NumberOfLinenumbers;
  14. DWORD Characteristics;          //节的属性
  15. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

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

而节就是分别保存了内存中节展开的位置偏移. 以及文件展开后.节数据在文件中的那个偏移位置.

1.内存中节开始的位置

我们分别以PE两种状态.来加深一下.在内存中跟文件中节数据起始位置.

VirtualAddress 是内存中节展开的起始地址.我们可以随便打开一个文件.查看内存中起始位置值是多少.

随便打开一个文件看一下节表.可以得出.内存中偏移位置是0x1000位置.文件中节数据的位置是0x400. 偏移+ImageBase就是内存中开始的位置.我们看一下.

可以看到机器码为: 40 30 40 00 90 ..... 那么我们去文件中看一下,看一下节数据是否相同.

2.文件中节开始的位置

根据上方我们观看节表.得出在文件中的偏移是0x400位置.所以跳转到文件偏移处.发现节数据跟内存的数据是一样的.

这也解释了PE在内存中展开跟在文件中是不一样的.

也加深了节表中 VirtualAddress成员 以及 PointerToRawData成员了.

值得一说节表的大小是 0x28个字节.也就是两行半

观看一行半可以得出节名称.节在内存中的偏移. 以及节数据在文件中的偏移.

二丶节成员解析

  根据上方节中两个重要成员我们明白了其意思.那么我们看看其他成员.

联合体中的成员.

  联合体中的成员我们一般看第二个.

  1. union {
  2. DWORD PhysicalAddress;
  3. DWORD VirtualSize; //节数据没有对齐后的大小.也就是没有对齐.节数据有多大.
  4. } Misc;

VirtualSize 虚拟大小.指的就是节数据没有对齐后的大小.

换句话说就是节的数据真实大小. 但是注意,如果此成员大于SizeofRawData.那么就填0.因为实际大小数据.不可能大于对齐后的大小.

  1. SizeOfRawData 这个成员则是对齐后的大小.比如我们节数据大小是0x1FFC 那么对齐后的大小就是0x2000 就是按照对齐之后进行存放的.对齐是按照文件对齐进行对齐的.

根据文件对齐后的大小.那么我们就能确定一个节数据到底由多大.

文件中开始的位置已经有了.然后对齐后的大小也已经有了. 文件开始位置是0x400.对齐后的数据有0x2000.那么节数据大小就是从0x400开始.占0x2000大小.那么结束位置就是0x2400位置.

节的属性.也就是最后一个成员.表明了这个节是可读的可写的.还是可读可写可执行. 具体可以查看一下宏.

三丶总结

  总结来说节表中重要成员有三个.

  1.内存中起始位置

  2.节数据对齐后大小

  3.文件中起始位置.

根据第二个成员和第三个成员可以得出节数据从哪里结束. 计算公式 节起始位置+节数据对齐后大小 = 节结束位置.

  节属性也很重要. 这个需要查询.所以一定牢记.

PE知识复习之PE的节表的更多相关文章

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

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

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

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

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

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

  4. PE知识复习之PE新增节

    PE知识复习之PE新增节 一丶为什么新增节.以及新增节的步骤 例如前几讲.我们的PE文件在空白区可以添加代码.但是这样是由一个弊端的.因为你的空白区节属性可能是只读的不能执行.如果你修改了属性.那么程 ...

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

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

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

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

  7. PE知识复习之PE扩大节

    PE知识复习之PE扩大节 一丶为什么扩大节 上面我们讲了,空白区添加我们的代码.但是有的时候.我们的空白区不够了怎么办.所以需要进行扩大节. 扩大节其实很简单.修改节数据对齐后的大小即可. 并且在PE ...

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

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

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

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

随机推荐

  1. java用jsoup解析HTML

    步骤 1获取document对象 //方法一 Document doc = Jsoup.connect(网址).get() //方法二 Document doc = Jsoup.parse(html字 ...

  2. MyBatis(十一) 嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则

    (1)接口中编写方法 public Dept getDeptPlusById(Integer id); (2)Mapper文件 <resultMap type="com.eu.bean ...

  3. SSM框架mapper.xml模糊查询语句

    SSM框架mapper.xml模糊查询语句 在用SSM框架时,如果想要实现模糊查询,可以在mapper.xml文件中进行数据库语句的书写,方法有很多种,在这里我选择了两种介绍: 方法1: <se ...

  4. 微信测试号开发入门配置问题java

    这个测试号配置弄了好几天了,入了无数坑,终于解决了...辛苦我了,手动安慰一下自己.. 为了萌新们以后不要再浪费时间绕半天做无用功.看看楼楼的艰苦历程吧. 此教程针对没有云服务器,没有自己的域名的.没 ...

  5. python print 中文重定向失败

    一直以来认为解决python字符集编码,不一定需要通过sys.setdefaultencoding.因为既然python实现过程中,默认禁用了该操作,说明是不推荐的. 通过不断的字符转换,也cover ...

  6. [python] bluepy 一款python封装的BLE利器

    1.bluepy 简介 bluepy 是github上一个很好的蓝牙开源项目,其地址在 LINK-1, 其主要功能是用python实现linux上BLE的接口. This is a project t ...

  7. 贪心算法----区间覆盖问题(POJ2376)

    题目: 题目的大概意思是约翰这个农民有N条牛,这些牛可以在一天中的某个时间段可以进行工作,他想把这个时间段分成若干个片段让这些牛去进行打扫任务,你的任务是安排尽量少的牛然后可以完成分成这些片段的打扫任 ...

  8. Javascript高级编程学习笔记(85)—— Canvas(2)2D上下文

    2D上下文 使用2D上下文提供的方法可以绘制简单的2D图形,如矩形,弧线和路径; 2D上下文的坐标开始域<canvas>元素的左上角,原点坐标为(0,0) 后续所有操作的计算都基于原点,x ...

  9. [Swift]LeetCode957. N天后的牢房 | Prison Cells After N Days

    There are 8 prison cells in a row, and each cell is either occupied or vacant. Each day, whether the ...

  10. [Swift]LeetCode982. 按位与为零的三元组 | Triples with Bitwise AND Equal To Zero

    Given an array of integers A, find the number of triples of indices (i, j, k) such that: 0 <= i & ...