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扩大节的更多相关文章

  1. PE知识复习之PE合并节

    PE知识复习之PE合并节 一丶简介 根据上一讲.我们为PE新增了一个节. 并且属性了各个成员中的相互配合. 例如文件头记录节个数.我们新增节就要修改这个个数. 那么现在我们要合并一个节.以上一讲我们例 ...

  2. PE知识复习之PE的绑定导入表

    PE知识复习之PE的绑定导入表 一丶简介 根据前几讲,我们已经熟悉了导入表结构.但是如果大家尝试过打印导入表的结构. INT IAT的时候. 会出现问题. PE在加载前 INT IAT表都指向一个名称 ...

  3. PE知识复习之PE的重定位表

    PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思.  如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234.  如果Im ...

  4. PE知识复习之PE的导入表

    PE知识复习之PE的导入表 一丶简介 上一讲讲解了导出表. 也就是一个PE文件给别人使用的时候.导出的函数  函数的地址 函数名称 序号 等等. 一个进程是一组PE文件构成的.  PE文件需要依赖那些 ...

  5. PE知识复习之PE的导出表

    PE知识复习之PE的导出表 一丶简介 在说明PE导出表之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗. 答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就 ...

  6. PE知识复习之PE新增节

    PE知识复习之PE新增节 一丶为什么新增节.以及新增节的步骤 例如前几讲.我们的PE文件在空白区可以添加代码.但是这样是由一个弊端的.因为你的空白区节属性可能是只读的不能执行.如果你修改了属性.那么程 ...

  7. PE知识复习之PE文件空白区添加代码

    PE知识复习之PE文件空白区添加代码 一丶简介 根据上面所讲PE知识.我们已经可以实现我们的一点手段了.比如PE的入口点位置.改为我们的入口位置.并且填写我们的代码.这个就是空白区添加代码. 我们也可 ...

  8. PE知识复习之PE的RVA与FOA的转换

    PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...

  9. PE知识复习之PE的节表

    PE知识复习之PE的节表 一丶节表信息,PE两种状态.以及重要两个成员解析. 确定节表位置: DOS + NT头下面就是节表. 确定节表数量: 节表数量在文件头中存放着.可以准确知道节表有多少个. 节 ...

随机推荐

  1. 原生JS制作简易Tabs组件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. C#调用Interrop.excel导出Excel文件失败解决方案

    最近操作员反馈系统在导出Excel时失败,有抛出如下异常:系统错误信息:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失 ...

  3. 限制输入字数JS

    <tr> <th><b>说明内容:</b><span id="content">(500字以内)</span> ...

  4. python 错误记录

    class Func: d = dict() def __setitem__(self, key, value): # xxx object does not support item assignm ...

  5. .net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法

    web程序发布后,通过浏览器访问程序显示如下的错误信息: 编译器错误消息: CS0433: 类型“ASP.global_asax”同时存在于“c:\WINDOWS\Microsoft.NET\Fram ...

  6. ES6 浏览器兼容性 和 Transpilation

     浏览器兼容性 和 Transpilation 你的 web 浏览器可能每隔几个月就会提示你去更新,你知道为什么吗,主要是一些安全漏洞,新特性,以及支持新的 HTML.CSS 和 JavaScript ...

  7. Spark 异步Action

    异步不保序,但大作业执行时间后移. .set("spark.scheduler.mode", "FAIR") 公平调度,充分使用集群资源. Spark Doc ...

  8. 完整的系统帮助类Utils

    //来源:http://www.cnblogs.com/yuangang/p/5477324.html using System; using System.Collections.Generic; ...

  9. npm修改淘宝原

    //修改之前查看一下npm config get registry https://registry.npmjs.org/ //设置源npm config set registry https://r ...

  10. mysql 主从设置

    方法: 1.主服务器建立二进制日志,每产生语句或磁盘变化,写进日志 2.从服务器建立 relaylog日志 3.主服务器授权复制账号 4.从服务器利用复制账号来监听主服务器的日志 5.注意:所以的my ...