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头下面就是节表. 确定节表数量: 节表数量在文件头中存放着.可以准确知道节表有多少个. 节 ...
随机推荐
- 原生JS制作简易Tabs组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#调用Interrop.excel导出Excel文件失败解决方案
最近操作员反馈系统在导出Excel时失败,有抛出如下异常:系统错误信息:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失 ...
- 限制输入字数JS
<tr> <th><b>说明内容:</b><span id="content">(500字以内)</span> ...
- python 错误记录
class Func: d = dict() def __setitem__(self, key, value): # xxx object does not support item assignm ...
- .net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法
web程序发布后,通过浏览器访问程序显示如下的错误信息: 编译器错误消息: CS0433: 类型“ASP.global_asax”同时存在于“c:\WINDOWS\Microsoft.NET\Fram ...
- ES6 浏览器兼容性 和 Transpilation
浏览器兼容性 和 Transpilation 你的 web 浏览器可能每隔几个月就会提示你去更新,你知道为什么吗,主要是一些安全漏洞,新特性,以及支持新的 HTML.CSS 和 JavaScript ...
- Spark 异步Action
异步不保序,但大作业执行时间后移. .set("spark.scheduler.mode", "FAIR") 公平调度,充分使用集群资源. Spark Doc ...
- 完整的系统帮助类Utils
//来源:http://www.cnblogs.com/yuangang/p/5477324.html using System; using System.Collections.Generic; ...
- npm修改淘宝原
//修改之前查看一下npm config get registry https://registry.npmjs.org/ //设置源npm config set registry https://r ...
- mysql 主从设置
方法: 1.主服务器建立二进制日志,每产生语句或磁盘变化,写进日志 2.从服务器建立 relaylog日志 3.主服务器授权复制账号 4.从服务器利用复制账号来监听主服务器的日志 5.注意:所以的my ...