PE文件(七)扩大节合并节数据目录

news2024/12/25 2:39:04

添加shellcode有以下几种的方式:

1.直接在任意节的空白区添加代码

2.新增节添加代码

3.扩大最后一个节添加代码

4.合并节并添加代码

今天我们学习如何扩大节,合并节

扩大节

在上一节的学习中,我们可以通过上移NT头和节表覆盖DOS Stub以获取足够的空白区来增加新的节表以及后续新增节,但是当整体上移覆盖DOS Stub之后,多出来的空白区域还不够新增节表时,我们就可以使用扩大最后一个节的方法来添加我们的shellcode

扩大节主要用于当我们在任意空白区添加比较多的代码,但空白区不够时使用,我们通常扩大最后一个节。这是因为当我们扩大其他某个节时,其他节的偏移量之类的属性都需要修改,这样很麻烦。而选择扩大最后一个节,这样就不用修改其他节的属性了

扩大节步骤:

1.拉伸到内存

2.分配一块新的空间:SizeOfImage + EX

3.将最后一个节的SizeofRawDateVirtualSize改成N

N = (SizeofRawDateVirtualSize内存对齐后大者的值) + EX

SizeofRawDate = VirtualSize

4.修改SizeOfImage大小为SizeOfImage + EX

就直接把要添加的代码加到最后一个节中即可,这样可以保证不影响上面的所有地址。具体操作参考代码区空白区添加代码文章

注意事项:

1.文件加载到内存后,最后一个节的VirtualAddress + VirtualSize对齐后的位置就是一个文件在内存中的结束位置,即SizeOfImage。文件在硬盘上时,最后一个节的PointerToRawData + SizeOfRawData的位置就是整个文件再硬盘上的结尾。

2.文件在内存中,节与节之间的排列是根据VirtualAddress和VirtualSize以及其内存对齐后的结果进行判断。如果在硬盘上,节与节之间的排列,是根据PointerToRawData和SizeOfRawData来判断,这是因为SizeOfRawData已经是文件数据经过对齐后的结果了

合并节

当我们整体上移后,留出来的空白区域不足以添加我们新的节表时,我们便可以利用合并节来添加数据了,将添加的代码加到最后一个节的空间中。由于内存对齐的原因,我们会有很大一部分的空间供我们去添加代码。这样可以保证不影响上面的所有相对地址的计算

注意:合并节一定要在ImageBuffer中进行操作,不然在FileBuffer容易出现错误,比如节中未初始化数据在拉伸后导致节变大等等情况。

合并节就是将所有的节表只保留第一个(其他节表可删可不会删,因为这些数据没有意义了),把第一个节开始一直到最后一个节的结尾都当成第一个节

但是可能会造成合并后文件变大,因为文件对齐粒度一般都要小于内存对齐粒度,所以虚拟内存中每个节的空白区一般比文件空白区要大一些,现在合并节是把虚拟内存中从第一个节开始到文件结束都当成一个节,最后再变成FileBuffer就会变大。

步骤:

1.NumberOfSections改成1

2.修改第一个节表的字段

VirtualSize:

方法一:SizeOfImage - 第一个节VirtualAddress

方法二:还可以通过最后一个节的VirtualAddress + 最后一个节的VirtualSize内存对齐后的大小 - SizeOfHeader内存对齐后的大小获取整个VirtualSize

方便起见我们选择方法一

SizeOfRawData:等于VirtualSize即可

将第一个节的属性改为包含所有节的属性,即用第一个节的属性与其他的节的属性做或运算

数据目录

数据目录的引入

可选PE头时,有一个字段为DWORD NumberOfRvaAndSizes,NumberOfRvaAndSizes的值表示_IMAGE_DATA_DIRECTORY DataDirectory[16];这种类型的结构体的数量

Win32操作系统下,PE文件不仅有文件本身的数据,编译器也会替我们往每一个节中加很多重要的内容:比如一个文件使用系统提供的函数时,编译器就会在PE文件中添加这些函数的相关信息,告诉该文件在运行时需要去哪里找到这个函数并进行系统调用。由于一个程序不仅可以使用系统的函数,也可以提供函数给别的文件使用,所以此时编译器会添加此程序中供别人使用的函数相关信息

编译器添加的内容包含了诸如:PE程序的图标位置,用到了哪些系统提供的函数,为其他的程序提供哪些函数等各种信息,如果编译器不添加这些数据的话,程序就找不到这些东西的地址,程序也无法正常运行。

数据目录的作用

每个PE文件都有16个数据目录用来记录编译器在PE文件中添加的16种不同的信息,并说明这些信息存在在哪里

数据目录的内容

可选PE头最后一个成员,就是数据目录,一共有16个

分别是:导出表的数据目录、导入表的数据目录、资源表的数据目录、异常信息表的数据目录、安全证书表的数据目录、重定位表的数据目录、调试信息表的数据目录、版权所有表的数据目录、全局指针表的数据目录、TLS表的数据目录、加载配置表的数据目录、绑定导入表的数据目录、IAT表的数据目录、延迟导入表的数据目录、COM信息表的数据目录、最后一个保留未使用

其中比较重要的就是导出表、导入表、重定位表、IAT表这四张表的数据目录,这四张表和程序的运行有直接关系,不管是加壳、脱壳、破解、病毒或反病毒,这些都是基础中的基础

数据目录的结构

结构如下:

struct _IMAGE_DATA_DIRECTORY{

    DWORD VirtualAddress;  //内存偏移,必须有

       DWORD Size;  //大小,破坏了也不会影响程序运行

};

16个数据目录的大小一样,都是8字节

手动查找数据目录

从节表开始往上倒着推8行,就是数据目录开始

也可以从可选PE头开始,往后数第25个DWORD就是数据目录开始

上图中前8字节是导出表的数据目录:当中前4个字节为导出表的VirtualAddress–0x0;后4字节为导出表的Size–0x0,说明此可执行文件没有导出表

再接着8字节为导入表的数据目录:前4字节为为导入表的VirtualAddres–0x6D20;后4字节为导入表的Size–0xC8,此可执行文件的导入表在ImageBase + 0x6D20处开始,大小为0xC8

下面以此类推

数据目录的应用

数据目录只是记录了对应的表的内存偏移地址和大小。我们通过找到相应表的数据目录,得到相应表的内存偏移地址,然后加上ImageBase才是相应表本身真正的所在位置!

举例:我们找到导出表的数据目录,通过数据目录中的VirtualAddress + ImageBase得到导出表所在的地址

IMAGE_DIRECTORY_ENTRY_EXPORT

struct _IMAGE_DATA_DIRECTORY {

    DWORD VirtualAddress;

    DWORD Size;

};

如图:

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

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

相关文章

VBA即用型代码手册:删除重复行Delete Duplicate Rows

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…

【python】python化妆品销售logistic逻辑回归预测分析可视化(源码+课程论文+数据集)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

基于51单片机的车辆动态称重系统设计

一 动态称重 所谓动态称重是指通过分析和测量车胎运动中的力,来计算该运动车辆的总重量、轴重、轮重和部分重量数据的过程。动态称重系统按经过车辆行驶的速度划分,可分为低速动态称重系统与高速动态称重系统。因为我国高速公路的限速最高是120,所以高速动态称重系统在理论…

按键精灵在Win11中弹窗出现乱码并且自带的部分系统插件不能使用的解决方法

按键精灵中出现以下问题: 提示信息的弹窗出现乱码: 系统自带的部分像 plugin. 开头的插件不能使用,如下:s Plugin.Sys.GetDateTime() screenX Plugin.GetSysInfo.GetScreenResolutionX screenY Plugin.GetSysInfo.GetScreenRe…

线程知识点总结

Java线程是Java并发编程中的核心概念之一,它允许程序同时执行多个任务。以下是关于Java线程的一些关键知识点总结: 1. 线程的创建与启动 继承Thread类:创建一个新的类继承Thread类,并重写其run()方法。通过创建该类的实例并调用st…

【C语言】插入排序(经典算法,建议收藏!!!)

目录 1、原理2、代码展示3、解析代码4、适用场景 1、原理 插入排序(Insertion Sort)是一种简单直观的排序算法,其原理可以简述如下: 1.分已排序区间和未排序区间: 将数组分为已排序区间和未排序区间。初始时,已排序区…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法,然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

突破网络屏障:掌握FRP内网穿透技术

1.FRP介绍 1.frp是什么 frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 I…

Python 潮流周刊#55:分享 9 个高质量的技术类信息源!

大家好,我是猫哥,今天给大家分享几个高质量的技术类信息源。 本文分享的信息源都是周刊类型的,所谓周刊类,就是以固定每周的频率更新,每期分享很多精华内容的链接。它的特点是信息密度极高,可以节省你去查…

log4j日志打印导致OOM问题

一、背景 某天压测,QPS压到一定值后机器就开始重启,出现OOM,好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地,打开Java sdk bin目录下的jvisualvm工具&a…

2024PTA算法竞赛考试编程题代码

目录 前言 题目和代码 L1-006 连续因子 L1-009 N个数求和 L2-004 这是二叉搜索树吗? L2-006 树的遍历 L2-007 家庭房产 L4-118 均是素数 L4-203 三足鼎立 L2-002 链表去重 L2-003 月饼 L2-026 小字辈 L4-201 出栈序列的合法性 L4-205 浪漫侧影 前言 所…

BarTender 常见的使用要点

BarTender 简述 BarTender是由美国海鸥科技(Seagull Scientific)推出的一款条码打印软件,被广泛应用于标签、条形码、证卡和RFID标记的设计和打印领域。它在全球范围内拥有众多用户,被公认为标签打印方面的全球领先者。BarTender…

把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 “诺依” 啊)

FolkMQ (消息中间件)支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版,就相当于 H2 或 SQLite 数据库一样。给一些小项目(或者特别需求)带来了方便。大项目,则可以使用独立部署的 “单机版” 或 “…

搞懂银行的各类号码 — Account Number, Routing Number 和 Swift Code

1. 前言2. 名词解释 2.1. Debit Card Number 储蓄卡卡号2.2. Account Number 账户号码2.3. Routing Number 路由号码2.4. SWIFT Code SWIFT 号码3. 查找信息 3.1. 支票3.2. 网上银行3.3. 手机银行4. SWFIT Code 4.1. 看懂 SWIFT Code4.2. 询问银行4.3. Google 大神4.4. 部分常用…

24.6.9( 概率dp)

星期一: abc356 D atc传送门 思路:按位与操作,M的非零位对答案一定没有贡献,对M为1的位,考虑有多少k此位也为1 按位枚举,m此位为0跳…

CAS Server Restful接口实现后台认证

背景 对于一些比较复杂定制化登录页的情况下,之前提到过可以自定义修改使用CAS Server提供的登录页这种操作已经明显跟不上复杂定制场景了,所以CAS Server也提供了支持Restful接口,支持服务端后台登陆,对于复杂登陆场景时&#x…

vscode 访问容器的方式

方法一:先连服务器,再转入容器 配置客户机A M1. 客户机A通过 vscode 连接服务器B,再连接容器C 配置vscode的ssh配置文件:~.ssh\config(当需要多个不同的连接时,使用 IdentityFile 指定公钥位置)…

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…

280 基于matlab的摇号系统GUI界面仿真MATLAB程序

基于matlab的摇号系统GUI界面仿真MATLAB程序,输入总数量及摇号需求,进行随机性摇号,并对摇取的号码进行双重随机性数据检测,确定是否符合要求。程序已调通,可直接运行。 280 GUI人机交互 摇号系统GUI界面仿真 - 小红书…

本地搭建支持语音和文本的中英文翻译服务-含全部源代码

实现目标 1、支持文本中英文互译; 2、支持中文语音输入; 3、支持英文语言输入; 进阶(未实现) 4、优化web界面; 5、优化语音输入js实现逻辑; 6、增加语音输入自纠错模型,纠正语音识别…