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,一经查实,立即删除!

相关文章

图论的起点——七桥问题

普瑞格尔河从古堡哥尼斯堡市中心流过,河中有小岛两座,筑有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效果演示提供资料进行效果演…

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

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

GPU 硬件原理架构(一)

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

CSS布局与响应式

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

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

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

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,虽然在某些项目上还能用但是明显跟不上时代的步伐了,所以要…

计算机网络速成

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

【React】静态组件动态组件

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

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

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

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

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

李宏毅机器学习课程笔记03 | 类神经网络优化技巧

文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training:Batch and MomentumSmall Batch vs Large Batch回顾:optimization优化 找到参数使L最小问题:为什么要用Batch&#xff…

如何学习网络安全?有哪些小窍门?

学好网络安全其实没有所谓的捷径,也没有什么小窍门。 入门网络安全首先要有浓厚的学习兴趣,不然很容易就变成了从入门到放弃了。 其次要能静下心,踏踏实实的打好基础。如果你是零基础,建议从Web安全入手,课程难度相对…

测试工程师的linux 命令学习(持续更新中)

1.ls """1.ls""" ls -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出 ls -l等同于 ll第一列共10位,第1位表示文档类型,d表示目录,-表示普通文件,l表示链接文件。…

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

Nginx三种不同类型的虚拟主机(基于域名、IP 和端口)

🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击! ⏰️创作时间:2025年1月15日13点14分 目录 1. 基于域名的虚拟主机 …

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展,虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络,Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展,OVN 提供了对虚拟网络抽象的支持,使得大规模部署和管理…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 9.1 检查点(Checkpoint) 9.1.1 检查点的保存 1)周期性的触发保存 “随时存档”确实恢复起来方便,可是需要我…