PE文件(三)节表

news2024/11/24 16:16:06

节表引入

PE文件的结构是由DOS头+PE标记+标准PE头+可选PE头+节表+多个节构成的,如下便是一个pe文件结构图,它的每一段都可以被称作节

图中这么多的节在硬盘上和内存中的存储位置都由节表去管理和记录,而不是随意的存储。

节表相当于是一个对各个节(.text、.idata等)进行概要性描述的具有管理权限的一个目录,与之相对的DOS头和NT头则是对整个文件的概要性描述

节表位置与个数

节表个数

一个PE文件有多少个节,就有多少个节表,(标准PE头中的NumberOfsections的值便是节的数量,也就是节表的数量)。每一个节表都是一个结构体,他们的的大小都是40字节,用来记录管理一个节的信息

节表位置:节表紧接着可选PE头后面,如果有多个节表,它们就一个接一个顺序排列直到没有节表可排 。

硬盘上的地址: DOS头大小(64字节) + 垃圾空位 + PE签名大小(4字节) + 标准PE头大小(20字节) + 可选PE头大小(查标准PE头中的SizeOfOptionalHeader字段的值)。所以e_lfanew + 4 + 20 + SizeOfOptionalHeader = 节表开始地址

内存中的地址:节表在4GB内存中的地址要加上imagebase的值,才是节表真正在内存中的起始地址

节表结构

节表是一个结构体,其具体结构如下:

#define IMAGE_SIZEOF_SHORT_NAME   8 //宏定义

 

由上图可知,每个节都有相应的节表,每个节表记录着对应的节的信息。节表数据紧接着可选PE头数据后面,如果有多个节表,它们就一个接一个顺序排列直到没有节表可排 。所有的节表一起记录了该.exe文件中所有的节的信息,每一个节都有对应的节表来存储信息,所有的节对应的节表组合在一起就构成了PE文件的节表结构

节表主要字段含义

1.Name[IMAGE_SIZEOF_SHORT_NAME]:8个字节大小,一般情况下是以"\0"结尾的ASCII码来表示节的名称,名字可以自定义(一般是编译器加的)。

注意:数组元素是从最后一个元素开始倒着入栈的,所以从低地址往高地址分别是从数组的第一个元素到最后一个元素

容易出现的安全问题:

Name数组的长度最大为8字节,如果定义节的名称为.text,由于.text对应的ASCII码分别为0x2E, 0x74, 0x65, 0x78,0x74,所以Name数组中的数据为2E 74 65 78 74 00 00 00,一共8字节。如果此时用一个指针指向Name数组首地址,即char* np = Name。由于使用printf("%s",np)的方式去打印一个数组,程序会从数组首地址一直打印到\0停下,即0x00结束打印。所以此时以该方式打印此节表的名字,将会正常打印.text

但是如果我们自定义名字或者编译器帮我们定义的名字长度等于8,把这8位全占了,没有给\0留位置存储。比如.abcdefg,每个字符转换成1字节的ASCII码后, Name数组中的数据为2E 61 62 63 64 65 66 67,一共8字节。如果此时我们还是使用char* p = Name作为数组的起始地址,使用printf("%s",p);来打印名字,就会有越界问题。这是因为该数组没有以\0结尾了,所以程序会接着把Name后面的内存中的数据打印出来,直到遇到一个0x00为止。此时打印的名字就可能是.abcdefg 5J@.??.等乱码

解决方法:自己定义一个char arr[9] 的数组,然后使用库函数strncpy(arr,name,8),或者自己写一个循环将名字依次赋值进我们自定义的数组中,最后一位补‘\0’,此时使用char* p = arr作为数组的起始地址,printf("%s",p);的方法便可以正常打印出节的名字了

2.Misc:该成员为联合体类型变量,大小为4字节,用于表示该节表管理的节在没有对齐前(装入内存)的真实尺寸,该值不确定。该值的修改了对程序的运行没有影响

由于有的编译器或者软件喜欢用PhysicalAddress,,有些喜欢用VirtualSize,但这两个东西是一样的,为了减少内存占用就选择使用了联合体

如图是一个节在内存中被0填充对齐后的数据,圆圈中的数据便是没有对齐前的真实尺寸:

3.VirtualAddress:该值为该节表所管理的节的起始位置在内存中相对imagebase的偏移地址,所以该值加上imagebase的值才是.exe文件运行时,此节在4GB内存中的真实地址。

4.SizeOfRawData:4字节大小,用于表示该节表所管理的节在文件中对齐后所有数据大小

5.PointerToRawData:该节表所管理的节对齐后在文件中的偏移地址:即文件在硬盘上时,经过文件对齐后,该节相对于文件起始地址的偏移量,一定是文件对齐的整数倍。

6.Characteristics:节的属性: 4字节(32位),每一位都表示该节表所管理的节的一个属性。我们一般关注的属性是是否可读、可写、可执行

如下便是常见的属性和值的对照表:

特征对照表的解释:

上表中每一个值转换为32位值以后,都有某一位的值是1,每一个1都表示一个属性,如下举例:

如果某值为0x00000020,转换成32位二进制后,它的第6位为1,表示这个节包含可执行代码

如果某值为0x00000040,转换成32位二进制后,它的第7位为1,表示此节包含已初始化的数据

如果某值为0x20000000,转换成32位二进制后,它的第30位为1,表示此节可执行

依此类推,便可得出任意一个值他所表示的属性,接下来我们举一个综合的例子:

一个名为.text的节的characteristics字段值为0x60000020,当它转换为32位值以后发现它的第31位为1、第30位为1、第6位为1,根据上面的分析可知,该.text节的属性是可读、可执行、包含可执行代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1626469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文解读:Label Hallucination for Few-Shot Classification

文章汇总 动机 本文的一个思想就是:尽管新类的标签并不能“恰如其分”地表示基数据集中的样本,但是很多基数据集的样本会包含与新类中相似的对象,例如,基数据集中的老虎和新类中的猫有相似的特征,那么就有60%的概率将…

补充centos7软件包的方式/编译安装源码包软件/企业案例/linux进程管理/企业管理进程系列命令(企业经验)--8820字详谈

cenros7软件包的安装方式 软件包分类安装方式优缺点rpm包软件开发商编译打包,安装简单,快速软件版本可能偏低,安装路径是固定好的源码包自己手动编译安装并且复杂软件爸爸随意选,可以定制安装路径二进制包解压就可以使用不能进行…

new String和直接赋值的一些问题

分析1 我们先看以下代码: String str1 "abc"; // 在常量池中String str2 new String("abc"); // 在堆上System.out.println(str1 str2)以上结果的输出是什么? 输出:false 前置知识: 在JVM中&#xff0c…

PTA 天梯赛 L1-010 比较大小【C++】 L1-011 A-B 【C++ vector动态数组】【Python 字符串replace函数】

L1-010 比较大小 判断顺序很重要 #include<iostream> using namespace std; int main() {int a, b, c;cin >> a >> b >> c;int temp;if (a > b) {temp a;a b;b temp;}if (a > c) {temp a;a c;c temp;}if (b > c) {temp b;b c;c te…

从零开始的软件测试学习之旅(二)测试方法及禅道使用篇

测试方法bug统计以及禅道使用 按是否要运行程序进行划分测试方法测试计划和测试方案测试方案包含:测试用例设计方法一.等价类划分法二.边界值法三.判定表法四.因果图: 输入条件或输入条件组合较多,组合使用判定表与因果图五.正交法:基于数学概率学,设计最经济的实验路径六.场景…

Vue面试经验

Vue部分 Vue编译时声明周期的执行顺序 Vue中父子组件渲染顺序&#xff08;同步引入子组件&#xff1a;import Son from ‘/components/son’ &#xff09; 父子组件编译时的生命周期执行顺序 这里修改data数据时也修改了dom&#xff0c;如过知识通过按钮对数据进行操作&…

Veeam配置备份oracle实例

Veeam是一家专门提供数据管理和数据保护解决方案的软件公司。他们的产品主要包括备份、复制和虚拟化管理等功能&#xff0c;旨在帮助企业保护其数据、应用程序和系统&#xff1b;NBU&#xff0c;COMMVALT&#xff0c;Veeam 国际三大知名备份软件厂商。本文介绍使用Veaam 备份Li…

数据结构——二叉树的操作 (层序遍历)(C++实现)

数据结构——二叉树的操作&#xff08;2&#xff09;&#xff08;C实现&#xff09; 统计叶子结点个数统计结点个数层序遍历非递归方式递归方式 我们今天接着来看二叉树的操作&#xff0c;如果还没有看过上一篇的可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/a…

ezplot--Matlab学习

目录 一、代码 二、效果 ​编辑 三、ezplot讲解 四、如何自定义一个函数 一、代码 clc; clear; t0:32; x4(t) cos(2*pi*t/4).*sin(2*pi*t/4); x8(t) cos(2*pi*t/8).*sin(2*pi*t/8); x16(t) cos(2*pi*t/16).*sin(2*pi*t/16); subplot(3,1,1) ezplot(x4,[0,32]); subplot…

怎样选购内衣洗衣机?2024年5款最新推荐机型种草

随着科技的不断发展&#xff0c;内衣洗衣机成为了家家户户必备的小家电之一&#xff0c;为我们的生活带来了极大的便利。但面对市场上众多的内衣洗衣机品牌&#xff0c;如何选择一款质量好的内衣洗衣机呢&#xff1f;本文将为您推荐5款最新的内衣洗衣机品牌&#xff0c;从而帮助…

冯唐成事心法笔记 —— 知人

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录PART 2 知人 人人都该懂战略人人都该懂战略第一&#xff0c;什么是战略第二&#xff0c;为什么要做战略第三&#xff0…

【GitHub】如何在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰

【GitHub】如何在github上提交PR(Pull Request 写在最前面1. 准备工作1.1 注册 GitHub 账号1.2 了解 Git 基础1.3 找到一个项目 2. 创建你的 PR2.1 Fork 和克隆仓库2.2 创建一个新的分支2.3 进行更改2.4 推送更改到 GitHub2.5 创建 Pull Request 3. 优化你的 PR3.1 保持提交清晰…

投资标的参考

1、中央汇金投资有限责任公司 1.1、香港中央结算有限公司 2、中央汇金投资有限责任公司持股列表 _ 东方财富网_ 数据频道东方财富网提供十大流通股东数据、十大股东数据、股东持股明细、股东持股变动统计、股东持股分析、股东持股统计、股东协同等数据&#xff0c;充分展示股东…

Java中的ArrayList

ArrayList<E>的特点 可调整大小的数组实现 <E>:是一种数据类型 ArrayList的构造方法 ArrayList list new ArrayList();创建一个空的集合对象 package dayhou40.day45; ​ import java.util.ArrayList; ​ public class Arraylisttest {public static void ma…

大数据第五天(操作hive的方式)

文章目录 操作hive的方式hive 存储位置hive 操作语法创建数据表的方式 操作hive的方式 hive 存储位置 hive 操作语法 创建数据表的方式 – 创建数据库 create database if not exists test我们创建数据库表的时候&#xff0c;hive是将我们的数据自动添加到数据表中&#xf…

uniapp——授权报错,选择合适的基础库

说明 我的小程序开发版本点击选择头像报错 更换基础库就好了

[华为OD] 给航天器一侧加装长方形或正方形的太阳能板 100

给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支 柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度 不同&#xff0c;太阳能板的安装面…

JavaScript-3(内置对象+数组对象+字符串对象)

目录 1.预解析 2.对象 什么是对象 创建对象的三种方法 利用字面量创建方法 利用new Object创建对象 构造函数创建对象 new关键字 遍历对象 3.内置对象 Math对象 Math概述 Math随机数 Date日期对象 格式化日期 Date总的时间毫秒 4.数组对象 创建数组的两种方式…

tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性 很久以前我开始纠结 tcp 锯齿&#xff0c;很多年后我知道这叫 capacity-seeking&#xff0c;甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为&#xff0c;而该行为生成了 tcp 锯齿。 在消除锯齿&#xf…

01.Scala概述及环境配置

文章目录 [toc] 1.**Scala概述**2.**Scala环境搭建**2.1下载2.2环境变量配置 1.Scala概述 特点&#xff1a; 同样运行在JVM上&#xff0c;可以与现存程序同时运行。可直接使用Java类库。同Java一样静态类型。语法和Java类似&#xff0c;比Java更加简洁&#xff08;简洁而并不…