• 内嵌补丁练习二


    0x00 前言

     对于上篇所讲的那个练习,PE文件属于运行时解压缩文件,而且文件包含校验和检验,如果直接修改代码可能得花点功夫了。对于这种情况我们可以使用内嵌补丁轻松解决。

     

    由上图我们知道要进行运行内嵌补丁,先得找到外壳程序跳往OEP的关键跳转。上篇我们已经知道4018083处为跳往OEP的关键跳。

    0x01  内嵌补丁编写

    1. 首先我们要确定补丁位置。一般而言有三种方式。文件空白区,扩展到最后字节,添加新节区。我们先用PEviewer查看.text节区情况。有下图:

     

    上图我们知道text节区在文件中的大小为400h,而映射到内存的实际大小才为280h280h-400h的地方都是空白。我们就将补丁嵌入此区域。

     2.使用lordPE查看imagebasetext区块的起始地址。如下图:

     

     

    由上图可知text映射到内存地址401280处为空白区域。跳转至该处得到下图:

     3.下面编写内嵌补丁。

     

    上图红框标注的地方就是我们今天要替换掉的内容,我们先找到字符串位置。这是个messageBox我们直接运行至OEP处查看传递的参数。如下图:

     DialogBoxParamA函数的原型如下:

    INT_PTR DialogBoxParamA(

      HINSTANCE hInstance,

      LPCSTR    lpTemplateName,

      HWND      hWndParent,

      DLGPROC   lpDialogFunc,

      LPARAM    dwInitParam

    );其中lpDialogFunc用来指出DialogBoxParamA的显示地址,这个就是显示的内容的关键参数。由于汇编的入参是和从右到左,我们可以从上图知道传递的参数是4010F5。我们跳转至该区域得到稍微往下翻就能的到下图:

    由上图我们得到这几个字符串的地址分别为。40110A401141401123。我们等下就是要用自己的字符串替换掉这几个。

    4.再次跳往401280处编写补丁得到下图:

     

    字符串修改完毕折后需要跳转至OEP处。但是还需修改一处:401083,这个地址本来是跳转至OEP的,但是我们现在要让他跳往我们的补丁位置。如下图:

     

     5.以为大功告成了吗?直接这样保存的话肯定无法运行。我们先保存下来运行以下试试。

    保存之后果然无法运行!那么问题出在哪里呢?接下来才是本次补丁最为关键的地方。我们都是知道地址为401007后面的大小为7F代码和004010F5下面的大小为154的区域都是加密的,其中我们的关键跳转401083就在这块被加密过一次的大小为7F的区域内!!假如我们直接把代码修改成jmp 401080,其机器码为E9 81 01,保存后这句代码运行时再被xor 7解密就变成了ee ff 06,解密后在运行这句代码肯定无法运行!所以我们应该现在hexworkshop中把代码修改为ee ff 06,这样运行时经过解密操作代码恢复原状了,这样才能正常运行。我们用hexworshop打开保存后的文件,找到该处的机器码,修改为ee ff 06,如下图:

     

    点击保存,再点击原程序,正常运行!

     

  • 相关阅读:
    联赛练习:好数
    CF703D Mishka and Interesting sum
    POJ2689 Prime Distance
    联赛练习:draw
    题解:luogu P2634 [国家集训队]聪聪可可
    题解:luoguP3806 【模板】点分治1(在线处理询问做法)
    题解:luogu P1073 最优贸易
    题解报告——聪聪与可可
    题解报告——森林
    题解报告——星际战争
  • 原文地址:https://www.cnblogs.com/2f28/p/9941523.html
Copyright © 2020-2023  润新知