PE知识复习之PE扩大节
PE知识复习之PE扩大节
一丶为什么扩大节
上面我们讲了,空白区添加我们的代码.但是有的时候.我们的空白区不够了怎么办.所以需要进行扩大节.
扩大节其实很简单.修改节数据对齐后的大小即可. 并且在PE文件中添加0数据进行填充即可.
首先看一下我们的节表
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //8个字节名字.自己可以起.编译器也可以给定.不重要.
union {
DWORD PhysicalAddress;
DWORD VirtualSize; //节数据没有对齐后的大小.也就是没有对齐.节数据有多大.
} Misc;
DWORD VirtualAddress; //加载到内存中的第一个字节的地址.也就是虚拟地址.节在内存中哪里开始.内存中的VA + ImageBase 才是真正的节开始位置
DWORD SizeOfRawData; //修改这个属性的值,即可扩大节.并且在PE文件中添加相应的0数据进行填充.
DWORD PointerToRawData; //在文件中的偏移.是文件对齐成员倍数.
DWORD PointerToRelocations; //一下都是调试相关.
DWORD PointerToLinenumbers; //
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics; //节的属性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
二丶扩大节实战以及注意问题
PE扩大节的时候一般是最后一个节.原因是自己不用修正偏移等各项属性了.如果是最后一个节扩大就很简单了.
我们节表要修改的属性就是将节对齐后的数据进行修改即可.
公式: 设一块我们添加的控件为x的倍数
设要修改后的值为M
那么 M = (节.sizeofRawData 或者 节.VirtualSize 按照对齐后大小对齐) + X即可.
看公式很复杂,其实就是节的对齐后的数据.按照内存对齐后修改.并且加上我们新空间的大小即可.
例如原来大小: 0x600, 你要扩大0x100个字节. 那么 修改后的值就为 0x700. 0x700要按照内存对齐进行存放.
还要修改扩展头中的 SizeofImage(内存PE镜像大小)
三丶扩大节实战
1.添加数据
随便找一个PE文件.在最后文件偏移处添加数据. 比如我们要扩大0x1000.那么添加0x1000大小.

开始位置89f0 添加0x1000大小. 那么结束位置是 0x99F0

为了确认我们的节数据会映射到内存.我们0数据我们填充为FFFF

2.修改节表属性
因为我们添加了0x1000个字节大小.所以需要修改文件中节表的对齐后的大小. 也就是 节.sizeofRawToData
此时我们没有修改之前.

,没有修改之前数据大小是0x0600.那么内存中节映射也不会有我们的FFFF数据. 观看内存节起始位置为0x01c000 那么我们去内存中
节数据位置看看.是否有我们的FFF填充的数据

并没有我们的FF数据. 我们修改文件节对齐数据为 0x1600.因为加了0x1000的数据.

再次在内存中查看已经有我们映射的内存了. 第一个是F0结尾.下方是我们的数据.
但是注意,修改之后并不能直接查看.因为PE没法运行.我们必须修改扩展头中的sizeofImage属性.这样我们的内存镜像大小才是真正的大小.
我是修改过了.节才会映射到内存中.所以可以查看.
3.修改SizeofImage属性
我的SzieofImage属性.原值就是按照内存对齐进行存放的.也就是0x01D000. 所以当我增加0x1000个字节的数据.其实并没有超过SizeofImage的对其值.所以可以映射到内存那种.如果加了数据超过了SizeofImage
那么我们就需要进行内存对齐了. 加上我们扩展后的数据.然后进行内存对齐.
4.程序运行.

程序可以正常运行.并且我们添加的数据也映射到内存中了.
PE知识复习之PE扩大节的更多相关文章
- PE知识复习之PE合并节
PE知识复习之PE合并节 一丶简介 根据上一讲.我们为PE新增了一个节. 并且属性了各个成员中的相互配合. 例如文件头记录节个数.我们新增节就要修改这个个数. 那么现在我们要合并一个节.以上一讲我们例 ...
- PE知识复习之PE的绑定导入表
PE知识复习之PE的绑定导入表 一丶简介 根据前几讲,我们已经熟悉了导入表结构.但是如果大家尝试过打印导入表的结构. INT IAT的时候. 会出现问题. PE在加载前 INT IAT表都指向一个名称 ...
- PE知识复习之PE的重定位表
PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思. 如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234. 如果Im ...
- PE知识复习之PE的导入表
PE知识复习之PE的导入表 一丶简介 上一讲讲解了导出表. 也就是一个PE文件给别人使用的时候.导出的函数 函数的地址 函数名称 序号 等等. 一个进程是一组PE文件构成的. PE文件需要依赖那些 ...
- PE知识复习之PE的导出表
PE知识复习之PE的导出表 一丶简介 在说明PE导出表之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗. 答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就 ...
- PE知识复习之PE新增节
PE知识复习之PE新增节 一丶为什么新增节.以及新增节的步骤 例如前几讲.我们的PE文件在空白区可以添加代码.但是这样是由一个弊端的.因为你的空白区节属性可能是只读的不能执行.如果你修改了属性.那么程 ...
- PE知识复习之PE文件空白区添加代码
PE知识复习之PE文件空白区添加代码 一丶简介 根据上面所讲PE知识.我们已经可以实现我们的一点手段了.比如PE的入口点位置.改为我们的入口位置.并且填写我们的代码.这个就是空白区添加代码. 我们也可 ...
- PE知识复习之PE的RVA与FOA的转换
PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...
- PE知识复习之PE的节表
PE知识复习之PE的节表 一丶节表信息,PE两种状态.以及重要两个成员解析. 确定节表位置: DOS + NT头下面就是节表. 确定节表数量: 节表数量在文件头中存放着.可以准确知道节表有多少个. 节 ...
随机推荐
- [SCOI2015]小凸玩矩阵
Description: 给你一个n*m的网格,每个格子有一个数字,每行每列只能选一个数字,问所选数字中第k大的数字的最小值是多少 Hint: \(n \le 250\) Solution: 显然是二 ...
- 20181115 python-第一章学习小结part2
Python基本知识 变量,用来存储中间计算结果,在后面可进行调用被使用的东西,叫做变量. 变量的命名规则: 字母,数字,下划线组合 不能用数字开头 常见的关键字不能用啊 常量,不会变的量,称作常量. ...
- mysql基本命令总结
1.在Ubuntu上安装MYSQL sudo apt-get install mysql-server sudo apt-get install mysql-client 2.安装结束后,用命令验证是 ...
- $.each()和$().each(),以及forEach()的用法
1.forEach() 是JS遍历数组的方法 var arr=[1,2,3]; arr.forEach(function(val,index,arr){ // var 为数组中当前的值 // inde ...
- linux学习:curl与netcat用法整理
CURL 语法: curl [option] [url] 常用参数:-A/--user-agent <string> 设置用户代理发送给服务器-b/--cookie <name=st ...
- python处理参数的getopt的使用
在写脚本程序的时候需要添加一些额外的参数来实现脚本的附加功能或者增强功能,通常的做法是同sys.argv[i]直接来获取参数的值,但是这个比较局限,要求参数的输入一定要按照顺序. fileName = ...
- react-quill 富文本编辑器 ---- 图片处理
import React,{Component} from 'react'; import ReactQuill,{ Quill } from 'react-quill'; import 'react ...
- Array.from();Object.keys();Array.map()
Array.from():方法从一个类似数组或可迭代对象创建一个新的数组形式: const bar = ["a", "b", "c"]; A ...
- android颜色color.xml设置
XML Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- 关于 Senparc.Weixin.Cache.Redis 引用的 StackExchange.Redis 版本不匹配的反馈测试
推测原因是老系统中有地方引用了旧版本的 StackExchange.Redis,原因是 StackExchange.Redis 1.2.6 版本未提供针对 .net 4.6 以上的支持,导致库引用会失 ...
