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文件加载进内存前和和加载后的结果对比。

加载前

加载后

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

窥探QCC518x/308x系列与手机之间的蓝牙HCI记录与分析 - 手机篇

今天要介绍给大家的是, 当我们在开发高通耳机时如果遇到与手机之间相容性问题, 通常会用Frontline或Ellisys的Bluetooth Analyzer来截取资料分析, 如果手边没有这样的仪器, 要如何窥探Bluetooth的HCI log.这次介绍的是手机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 U…

【MySQL】数据库约束和多表查询

目录 1.前言 2.数据库约束 2.1约束类型 2.2?NULL约束 2.3 NUIQUE:唯一约束 2.4?DEFAULT:默认值约束 2.5?PRIMARY KEY:主键约束 2.6 FOREIGN KEY:外键约束 1.7?CHECK约束 3.表的设计? 3.1一对一 3.2一对多 3.3多…

Unity HybridCLR Settings热更设置

需要热更的程序集放到 热更新Assembly Definitions中。 记得补充元数据AOT dlls 打包完成后遇到TypeLoadException: could not load type 时 可能需要在Assets/link.xml中增加对应的设置 <assembly fullname"your assembly" preserve"all"/> link…

LLM - 大模型 ScallingLaws 的迁移学习与混合训练(PLM) 教程(3)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145212097 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

【Python】Selenium根据网页页面长度,模拟向下滚动鼠标,直到网页底部的操作

最近在弄selenium的爬取的过程中&#xff0c;我发现一些网站上的表格&#xff0c;是需要手动拉到底部才能加载完成的。 如果没有拉到底部&#xff0c;那么在获取网页表格的时候&#xff0c;表格就会只有显示的一部分&#xff0c;页面就不完整。 所以我就整理了一些模拟滚动鼠…

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求&#xff1a;有个长方形的容器&#xff0c;但是需要正方形的网格线&#xff0c;网格线是等比缩放的并且可以无线拖动的&#xff0c;并且添加自适应缩放和动态切换&#xff0c;工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…

Lora理解QLoRA

Parameter-Efficient Fine-Tuning (PEFT) &#xff1a;节约开销的做法&#xff0c;fine-tune少量参数&#xff0c;而不是整个模型&#xff1b; Low-Rank Adaptation (LoRA) &#xff1a;是PEFT的一种&#xff1b;冻结原参数矩阵&#xff0c;只更新2个小参数矩阵。 原文经过对比…

Elasticsearch:Jira 连接器教程第二部分 - 6 个优化技巧

作者&#xff1a;来自 Elastic Gustavo Llermaly 将 Jira 连接到 Elasticsearch 后&#xff0c;我们现在将回顾最佳实践以升级此部署。 在本系列的第一部分中&#xff0c;我们配置了 Jira 连接器并将对象索引到 Elasticsearch 中。在第二部分中&#xff0c;我们将回顾一些最佳实…

联发科MTK6762/MT6762安卓核心板_4G智能模块应用

MT6762安卓核心板是一款工业级高性能、可运行 android9.0 操作系统的 4G智能模块。MT6762平台打造具备 AI 体验、先进双摄像头拍摄效果且具备丰富连接功能的智能手机主板。 MT6762安卓核心板 是一款髙性能低功耗的 4G 全网通安卓智能模块。此模块支持 2G/3G/4G 移动&#xff0c…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前&#xff0c;先弹出隐私协议弹框1.2 上述弹框点击同意&#xff0c;得到如下弹框1.3 点击三个点&#xff0c;然后点设置 1.4 在1.2步骤下&#xff0c;无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

网安快速入门之Windows命令

在Windows中 我们今天介绍几个命令&#xff1a; help copy dir cd type del ipconfig net netstat tasklist sc1. help 显示命令的帮助信息。或者显示Windows内置命令。 常用参数&#xff1a; <命令>&#xff1a;查看指定命令的帮助。 示例&#xff1a;help copy 显…

Red Hat8:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…

Git 安装 操作 命令 远程仓库 多人协作

Git作用 Git诞生史 很多人都知道&#xff0c;Linus在1991年创建了开源的Linux&#xff0c;从此&#xff0c;Linux系统不断发展&#xff0c;已经成为最大的服务器系统软件了。Linus虽然创建了Linux&#xff0c;但Linux的壮大是靠全世界热心的志愿者参与的&#xff0c;这么多人在…

Vue快速开发之环境搭建nodejs与运行第一个Vue项目

步骤一:下载node.js 注意: 建议下载v12.16.0版本以上的,因为版本低无法创建Vue的脚手架。文件选择:下载方式1: 从官网下载:http://nodejs.cn/download/ 下载方式2: 从我发现的一个网站下载,选择自己想要的版本 https://nodejs.org/download/release/ 比如我下载的时v2…

AUTOSAR通信篇 - PDU和收发数据

点击订阅专栏不迷路 文章目录 一、概述二、OSI模型与AUTOSAR层级关系三、I-PDU、N-PDU、L-PDU及其关系3.1. L-PDU3.2. N-PDU3.3. I-PDU 四、数据流4.1. 普通数据流4.2. 诊断数据流4.3. 动态PDU数据流4.4. 安全通信数据流4.5. XCP数据流 返回总目录 一、概述 在学习Autosar通信…

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件&#xff1a;VideoViewControl.axaml 需引用&#xff1a;VideoLAN.LibVLC.Windows包 Linux平台需安装&#xff1a;VLC 和 LibVLC &#xff08;sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev&#xff09; .axaml 代码 注…

哈尔滨有双线服务器租用吗?

哈尔滨有双线服务器租用吗&#xff1f;双线服务器是一种针对哈尔滨特有的网络环境优化的服务器解决方案&#xff0c;它能够同时支持中国电信和中国联通或移动其中两家主要ISP&#xff08;互联网服务提供商&#xff09;的连接。 由于中国南方地区多采用电信网络&#xff0c;而北…

58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1

进入靶场 和2次注入的页面很像 不过养成查看源代码的好习惯 先访问source.zip 下载后解压&#xff0c;发现两个文件 第一个文件夹打开又有4个PHP文件 那还是先看index.php文件好了 有PHP和HTML两部分&#xff0c;下面是PHP部分代码&#xff08;HTML太长了&#xff0c;先放一…

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…

图像处理|闭运算

闭运算&#xff08;Closing&#xff09;是形态学操作中的另一种基本操作&#xff0c;它与开运算&#xff08;Opening&#xff09;类似&#xff0c;但执行的步骤相反。闭运算结合了膨胀和腐蚀操作&#xff0c;顺序为 先膨胀后腐蚀。这种操作通常用于填补图像中的小空洞&#xff…