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

时间:2022-09-09 22:09:05

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

一丶简介

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

我们也可以利用这个知识.实现PEDLL注入. 原理就是 修改入口. 跳转到我们空白区执行我们的代码.我们空白区进行重定位.调用Loadlibary. 并且load的是我们的DLL

实现功能就是 我们只要给PE注入了代码.那么这个PE程序一旦启动就会加载我们的DLL

关于PEDLL注入,后面会有博客分类中会讲解.此时首先讲解怎么在我们的空白区添加我们的代码.

二丶空白区添加代码的注意事项.

  在空白区添加代码.首先就要熟悉汇编知识.因为我们添加的代码都是机器码.而机器码是被翻译成汇编指令.本质还是机器码.

  还需要注意的是重定位技术. 比如 E9 对应汇编是JMP. 那么后面跟着的是一个偏移. 偏移的计算公式 (目的地址 - 源地址 - JMP指令长度(5)) == 偏移.

这两点熟悉了那么下面就好办了.

  空白区添加代码的步骤:

1.寻找OEP所对应的文件偏移位置.

2在文件中修改OEP的指向.

3.指向我们的空白区

4.空白区添加我们的代码.

三丶实战空白区添加代码

  1.寻找OEP所在的文件偏移位置

    首先随便找一个文件,查看扩展头中OEP RVA 以及 ImageBase, 并且换算出属于哪个节.并且转换为文件偏移.

例如下图:

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

得出OEP RVA == 0x01104b  得出 ImageBase为 0x00400000  那么内存中OEP开始位置就是 RVA +Imagebase == 0x1104b + 0x00400000 == 0x0041104b

  查看RVA属于哪个节.

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

首先线观看两个节,第一个节 Textbss 在内存中的位置是0x1000开始,因为要判断RVA >= 节.虚拟地址  && RVA <= 节.虚拟地址 + 节.节数据对齐后的大小 才可以.但是第一个节并没有节对齐后的大小.所以不能断定.

所以看第二个节,第二个节 text节. 内存中展开的虚拟地址是 0x011000 并且 节对齐后的大小是 0x00004E00 . 判断RVA就是属于这个节.所以算出差值偏移.,并且求出FOA位置

  RVA - 节.RVA == 差值偏移   0x1104b - 0x11000 == 0x4b 差值偏移为0x4b

差值偏移 + 文件偏移 == FOA  0x4b + 0x400 == 0x44b

那么0x44b位置就是OEP的入口代码执行处.

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

内存中查看代码是否跟我们文件偏移代码出一样

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

可以看到OEP在内存中的地址位 0x0041104b.并且对应的代码为 E9 400F0000  E9后面是一个偏移.  是目的地址 - OEP地址 - JMP指令长度(5) 得出的一个偏移.

  2.修改OEP指向

上面我们得到了OEP的位置.并且得出对应机器码了. 那么我们完全可以修改OEP的指向.指向我们的空白区位置.

比如指向PE文件中0x2开始的位置. 也就是 MZ成员后面的字节. DOS就两个重要成员.其余的位置我们可以随便使用.

因为E9后面是偏移. 所以我们要跳转到PE中0x2的位置. 但因为PE在内存中展开的时候.是以Imagebase成员为基址进行展开的.所以我们要跳转的位置是 0x00400002的位置.

计算一下偏移公式.

  目的地址 - 源地址 - 5  =  0x00400002 - 0x0041104b ==0xFFFEEFB2  得出偏移了.那么我们在文件中OEP位置就可以进行修改了.

PE知识复习之PE文件空白区添加代码 修改后. 注意是小端模式修改.

内存中查看修改后

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

可以看到OEP跳转的位置为0x00400002位置.此时我们在0x400002位置.添加我们的代码即可.

  3.空白区填写我们的代码

以前我们OEP跳转的位置为 0x411f90 也就是这个位置是我们代码开始执行位置. 此时我们OEP跳转到了 0x00400002位置. 所以我们在0x400002位置添加我们的代码

我们可以在空白区位置添加一个代码,例如 C3 (ret)

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

内存中查看.是否跳转的位置代码执行是c3

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

已经更改为C3了. 那么此时我们也可以自己进行重定位.继续让代码跳转到我们以前没修改OEP指向的时候的位置.

以前的位置为 0x411f90 现在位置 0x400002

进行重定位

目的地址 -源地址 - JMP指令长度(5) ==0x11F89

所以我们在C3的位置改成E9 后面的偏移按照小端模式填写到文件中即可.

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

运行我们的程序.看看代码是否成功修改

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

确实代码成功修改也能跳转到我们原OEP代码执行位置.

但是当x32dbg执行的时候.会出现C05内存访问异常.原因是我们这个地方的内存属性.并不是可执行的.所以会出现内存访问一样.我们需要修改内存属性才可以.

不过上面所说已经完成了一个空白区添加代码了.具体可以自己尝试.去找空白区即可.

  

PE知识复习之PE文件空白区添加代码的更多相关文章

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

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

  2. PE知识复习之PE扩大节

    PE知识复习之PE扩大节 一丶为什么扩大节 上面我们讲了,空白区添加我们的代码.但是有的时候.我们的空白区不够了怎么办.所以需要进行扩大节. 扩大节其实很简单.修改节数据对齐后的大小即可. 并且在PE ...

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

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

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

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

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

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

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

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

  7. 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. linux-12基本命令之 cat&comma;more&comma;head&comma; tail &comma;tr&comma;od&comma;wc&comma;cut&comma;diff

    1.cat 命令 用于查看纯文本文件(较短),格式:"cat[选项][文件]" 查看文本文件 [root@localhost /]# cat 文件名 cat 参数 参数 作用 -n ...

  2. VBS获得随机数,截图函数

    '获取随机数 Public function randonum() Randomize  randonum = replace(10000*rnd(),".","a&qu ...

  3. Sprite Editor 图集切片精灵

    切图需求 假设有一张大的UI的图集,我们想把它里面的小图一张一张地切割出来,如果有plist文件,请查阅我的另一篇文章<还原TexturePacker plist 文件 切开各小图片> 今 ...

  4. js 中数组或者对象的深拷贝和浅拷贝

    浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...

  5. Java版网络爬虫基础

    网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...

  6. VxWorks各部分初始化流程

    一)configAll.h中定义所有定置系统配置的宏 INCLUDED SOFTWARE FACILITIES:定义了基本组件: EXCLUDED FACILITIES:定义了扩充组件,缺省不包括: ...

  7. 2018-2019-2 20165303《网络攻防技术》Exp5 MSF基础应用

    实践目标 1.一个主动攻击实践 ms17_010(成功) ms08_067(成功) 2.一个针对浏览器的攻击 ms13-008(成功唯一) ms11-050(失败) ms13-069(成功唯一) ad ...

  8. echarts折线图

    https://echarts.baidu.com/examples/#chart-type-bar

  9. 修改 Vultr 登录密码

    Debian,Ubuntu 访问控制台,打开在线 Console,点击右上角的 “Send CtrlAltDel”,按 ESC 键启动 GRUB boot prompt. 按 e 编辑第一启动项.按 ...

  10. 关于LCA

    LCA:最近公共祖先 指在有根树中,找出某两个结点u和v最近的公共祖先 如图,5,7的最近公共祖先就是3 接下来,我们来了解如何求解LCA No.1 暴力 首先想到的肯定是暴力,我们搜索,从两个节点一 ...