PE文件:节表-添加节

在所有节的空白区域都不够存放我们想要添加的数据时,这个时候可以通过添加节来扩展我们可操作的空间去存储新的数据(如导入表、代码或资源)。

过程步骤

1.判断是否有足够的空间添加节表

PE文件的节表紧跟在PE头之后,每个节表的大小为40字节。判断是否有足够的空间添加节表需要先定位到最后一个节表,这边以之前PE文件系列文章中的样例程序为例子,样例程序中的最后一个节表后存在一大片"空地",有足够的空间可以添加一个节表。

注意:如果节表后有非0数据,这些数据可能是其他有用数据(如对齐数据或其他结构),直接覆盖可能会导致文件损坏。

2.添加节表

在紧挨着最后一个节表末尾的空间添加一个节表(40个字节),此处先用CC占位。

使用CC填充空白区域后,ctrl + s保存一下修改结果,接着尝试运行一下该程序。若程序能够正常运行则表示此处可以添加节表。

接着就需要修改节表的数据,这边附上节表结构体:

#define IMAGE_SIZEOF_SHORT_NAME              8
​
typedef struct _IMAGE_SECTION_HEADER {BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];union {DWORD   PhysicalAddress;DWORD   VirtualSize;} Misc;DWORD   VirtualAddress;DWORD   SizeOfRawData;DWORD   PointerToRawData;DWORD   PointerToRelocations;DWORD   PointerToLinenumbers;WORD    NumberOfRelocations;WORD    NumberOfLinenumbers;DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

①首先修改第一个字段:Name[IMAGE_SIZEOF_SHORT_NAME]节表名称,这边将新增的节表命名为.addc

②修改第二个字段:VirtualSizeVirtualSize 表示节在内存中的大小,通常需要按内存对齐值(SectionAlignment)对齐。

节表的Misc联合体字段中的PhysicalAddress最初用于描述节的实际物理地址,但在现代 PE 文件中,这个字段已经被废弃;出于兼容性原因,仍然保留此名称,但其实际用途已被重定义。所以在现代 PE 文件中该字段中上存储的数据为VirtualSize。

这边设置新增的节在内存中的大小为0x1000字节,该字段的大小可以根据自己要填入的数据大小进行设置。

③修改第三个字段:VirtualAddressVirtualAddress是 PE 文件中每个节的虚拟地址,描述了该节在内存中的起始位置(相对于 ImageBase 的偏移量),它指示操作系统加载器将该节映射到内存的哪个位置。

修改该字段时,我们需要按照文件对齐,与上一个节表对齐存放,该样例文件中最后一个节表的内容如下:

此时我的上一个节在内存中的大小为:0000 0DF8,因为该字段需要与SectionAlignment(0x1000),所以此时该节在内存中实际占用的空间为0000 1000,且上一个节的开始地址(VirtualAddress)为0001 6000,通过这些信息可以确定新增节在内存中的起始地址应该为0001 7000

④修改第四个字段:SizeOfRawDataSizeOfRawData表示节在文件中占用的大小(以字节为单位),这是节在磁盘上的对齐后的大小,该值必须是 FileAlignment (文件对齐值)的倍数。

由于我们第二个字段的值为0x1000,已经是文件对齐值的倍数,所以我们可以直接修改SizeOfRawData的值为0x1000

⑤修改第五个字段:PointerToRawData表示该节在 PE 文件中开始位置的偏移量(以字节为单位)。新增的节应该要紧挨着PE文件原来的节,此时应该参照上一个节在PE文件中的大小和在PE文件存储的起始位置。

如图所示,前一个节在PE中所占的大小为0000 0E00,在PE文件中的起始位置为0001 2800,那么此时新增节在PE文件中的其实地址应该为:0001 3600

节表的后四个字段基本上不用,可以随意修改,这边我们就将前一个中的值拿过来填充新增节表的这四个字段好了,以下就是我们新增的节表最后的数据内容:

3.修改NumberOfSections字段

修改文件头中(_IMAGE_FILE_HEADER)中的NumberOfSections字段,该字段记录了文件中节的个数,此时我们要新增一个节,所以要将文件头中的该字段加1(原本是05,现改为06)。

4.修改SizeOfImage字段

修改扩展头(IMAGE_OPTIONAL_HEADER)中SizeOfImage字段,我们新增了0x1000节数据大小,那么我们的镜像大小也要加0x1000大小进行映射。当前SizeOfImage的值为0001 7000。(定位就是从PE标识开始数10个半行)

这个时候加上0x1000就是0001 8000

5.新增节

根据我们新增的节表中的SizeOfRawDataPointerToRawData字段信息在PE文件中添加节。

通过PointerToRawData得到新增节的在PE文件中开始地址为:0001 3600,通过SizeOfRawData得到节的大小为0x1000,接着就可以直接加数据了。

接着选中结尾部分,右击:

编辑->粘贴0字节->输入粘贴的0字节个数

添加4096个字节,即可快速添加数据。

这边我们可以将该PE文件的导入表数据贴入其中,接着进行动态调试查看该节是否成功载入。通过CFF工具定位到导入表。(如果不会定位导入表,可以看笔者前面的PE文件结构系列文章:《PE文件结构:导入表》)

成功将导入表复制到新加的节中。

最后,使用x86dbg动态调试该文件,查看节的内容。

通过新增的节表定位节,这边需要计算节的VA,ImageBaseRVA如下图:

VA = ImageBase + RVA= 0056 0000 + 0001 7000= 0057 7000

选定内存框,ctrl + G进行定位,下面附上PE文件加载进内存前和和加载后的结果对比。

加载前

加载后

可以看到新增节中的导入表已经成功被载入内存。

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

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

相关文章

【开源宝藏】Jeepay VUE和React构建WebSocket通用模板

WebSocket 服务实现:Spring Boot 示例 在现代应用程序中,WebSocket 是实现双向实时通信的重要技术。本文将介绍如何使用 Spring Boot 创建一个简单的 WebSocket 服务,并提供相关的代码示例。 1. WebSocket 简介 WebSocket 是一种在单个 TC…

图论的起点——七桥问题

普瑞格尔河从古堡哥尼斯堡市中心流过,河中有小岛两座,筑有7座古桥,哥尼斯堡人杰地灵,市民普遍爱好数学。1736年,该市一名市民向大数学家Euler提出如下的所谓“七桥问题”: 从家里出发,7座桥每桥…

Fabric区块链网络搭建:保姆级图文详解

目录 前言1、项目环境部署1.1 基础开发环境1.2 网络部署 2、后台环境2.1、环境配置2.2、运行springboot项目 3、PC端3.1、安装依赖3.2、修改区块链网络连接地址3.3、启动项目 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加…

02JavaWeb——JavaScript-Vue(项目实战)

一、JavaScript html完成了架子,css做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习 JavaScript,这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过JS/js效果演示提供资料进行效果演…

MySQL程序之:连接到服务器的命令选项

本节介绍大多数MySQL客户端程序支持的选项,这些选项控制客户端程序如何建立与服务器的连接、连接是否加密以及连接是否压缩。这些选项可以在命令行或选项文件中给出。 连接建立的命令选项 本节介绍控制客户端程序如何建立与服务器的连接的选项。 表6.4连接建立选…

Windows 蓝牙驱动开发-蓝牙设备栈

蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈,已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中,设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块,以…

GPU 硬件原理架构(一)

这张费米管线架构图能看懂了,整个GPU的架构基本就熟了。市面上有很多GPU厂家,他们产品的架构各不相同,但是核心往往差不多,整明白一了个基本上就可以触类旁通了。下面这张图信息量很大,可以结合博客GPU 英伟达GPU架构回…

CSS布局与响应式

学习链接 Grid网格布局 前端五大主流网页布局 flex布局看这一篇就够了 grid布局看这一篇就够了 用六个案例学会响应式布局 伸缩盒响应式页面布局实战 实现响应式布局的五种方式 - csdn 如何完成响应式布局,有几种方法?看这个就够了 响应式布局总…

mysql 如何快速删除表数据

在数据库管理中, 经常会遇到需要删除大量数据的情况. 对于 MySQL 数据库而言, 如何高效快速地删除数据是一个值得深入探讨的问题. 本文将详细介绍几种在 MySQL 中快速删除数据的方法及相关注意事项. delete 语句 delete 语句可以删除符合条件的指定数据, 但是在删除大量数据…

大疆最新款无人机发布,可照亮百米之外目标

近日,DJI 大疆发布全新小型智能多光旗舰 DJI Matrice 4 系列,包含 Matrice 4T 和 Matrice 4E 两款机型。DJI Matrice 4E 价格为27888 元起,DJI Matrice 4T价格为38888元起。 图片来源:大疆官网 DJI Matrice 4E DJI Matrice 4T D…

Haskell语言的网络编程

Haskell语言的网络编程 引言 随着互联网技术的迅猛发展,网络编程已经成为计算机科学和软件开发领域的重要组成部分。网络编程可以让我们构建各种各样的应用程序,从简单的网页到复杂的分布式系统。而在众多编程语言中,Haskell以其独特的函数…

Nmap入门

- 在已有的参数上加上哄骗或是使用文件 nmap -iL data.txt ------- nmap -PS -PA -O -ttl 200 -F -D dcay1, dcay2,dcay3... -vv -P 3306 1.1.1.0/24 -oN data.txtNmap端口的6个状态 open 应用程序正在该端口接收TCP或UDP报文 closed 关闭的端口对于Nmap也是可访问的(它接受…

ubuntu18.04开发环境下samba服务器的搭建

嵌入式linux的发展很快,最近准备在一个新项目上采用新一代的linux核心板,发现linux内核的版本已经更新到5.4以上甚至6.0以上;之前常用的linux内核版本是2.6.4,虽然在某些项目上还能用但是明显跟不上时代的步伐了,所以要…

Android-V lmkd 中的那些属性值

源码基于:Android V 相关博文: Android lmkd 机制详解(一) Android lmkd 机制详解(二) Android lmkd 机制从R到T 1. 汇总 属性名说明默认值 ro.lmk.debug 启动 lmkd 的debug 模式,会打印一…

消息中间件的基础概念入门

目录 一、什么是消息中间件 1.1、简介 1.2、消息中间件的主要作用 解耦合 异步通信 负载均衡 可靠性与持久性 消息路由与调度 削峰 事务支持 监控与审计 跨平台和跨语言支持 二、常用消息中间件对比 2.1、 RabbitMQ 2.1.1、特点 2.1.2、适用场景 2.2、Apache K…

计算机网络速成

前言:最近在做一些动态的crypto,但是配置总搞不好,正好也有学web的想法,就先学学web再回去做密码,速成视频推荐b站建模老哥 目录 计算机网络概述网络的范围分级电路交换网络(电路交换)报文交换网…

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件: 组件第一次渲染完毕后,无法基于内部的某些操作让组件更新「无法实现自更新」;但是,如果调用它的父组…

Qt/C++ 基于 QGraphicsView 的绘图软件 (附源码下载链接)

基于 Qt 的 QGraphicsView 绘图软件项目进行深入讲解,分析其核心代码与功能实现,帮助开发者理解 QGraphicsView 的用法。 项目概览 该项目实现了一个简单的绘图应用,用户可以在界面中创建和编辑矩形、椭圆、直线、多边形和文本等图形对象。功…

Vue2+OpenLayers给2个标点Feature分别添加独立的点击事件(提供Gitee源码)

前言:之前开发都是将所有的点位存放在一个图层上面,并统一赋予它们相同的点击事件,如果其中某些点的点击事件不一样呢,这种问题如何解决呢,本篇博客就是解决这个通点。 目录 一、案例截图 二、安装OpenLayers库 三…

山石防火墙命令行配置示例

现网1台山石SG6000防火墙,配置都可以通过GUI实现。 但有一些配置在命令行下配置效率更高,比如在1个已有策略中添加1个host或端口。 下面的双引号可以不加 1 创建服务 1.1 单个端口 service "tcp-901"tcp dst-port 901 1.2 端口范围 servi…