zoukankan      html  css  js  c++  java
  • PE知识复习之PE文件空白区添加代码

              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, 并且换算出属于哪个节.并且转换为文件偏移.

    例如下图:

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

      查看RVA属于哪个节.

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

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

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

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

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

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

    可以看到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位置就可以进行修改了.

     修改后. 注意是小端模式修改.

    内存中查看修改后

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

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

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

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

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

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

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

    进行重定位

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

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

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

     

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

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

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

      

  • 相关阅读:
    iOS键盘监听事件
    JDBC中的Statement和PreparedStatement的区别 分类: JavaWeb 2014-05-18 13:46 5255人阅读 评论(2) 收藏
    Android中的隐藏API和Internal包的使用之获取应用电量排行 分类: Android 2014-05-16 17:55 3874人阅读 评论(4) 收藏
    Android中怎么破解游戏之修改金币数 分类: Android 2014-05-14 18:27 4802人阅读 评论(8) 收藏
    Android中通过反射来设置Toast的显示时间 分类: Android 2014-05-11 13:14 3291人阅读 评论(4) 收藏
    MySql中的变量定义 分类: Java 2014-05-04 10:41 6507人阅读 评论(0) 收藏
    MySql中创建存储过程 分类: Java 2014-05-04 10:31 4711人阅读 评论(1) 收藏
    MySQL数据库事务隔离级别(Transaction Isolation Level) 2014-05-04 09:52 4407人阅读 评论(0) 收藏
    C++中的static关键字 分类: Android 2014-04-22 13:45 448人阅读 评论(0) 收藏
    Android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据 分类: Android 2014-04-17 16:15 11412人阅读 评论(18) 收藏
  • 原文地址:https://www.cnblogs.com/iBinary/p/9735026.html
Copyright © 2011-2022 走看看