zoukankan      html  css  js  c++  java
  • Windows PE变形练手3-把通用模板机器码直接覆盖目标PE

    把通用模板机器码直覆盖目标PE

        这个地方真是尝试了好久,遇到很多坑点,Win PE那本书上的东西有点不够,也就直接写书上的例子会发现很多地方不是说的那样,里面提供的信息太少了,就比如里面并没有提被注入的目标PE的随机基址问题,比如说中给了一套模板(模板里面有一些变量定义了没有使用,还有获取Kernel32.dll的地方是错误的,还有通用模板运行的时候内存溢出了...)额...总之不要在意这些细节。我自己摸索着弄吧,这个地方。

        今天打算尝试几种姿势手动把自己的模板机器码添加到目标PE某个位置让其加载我们的功能。

        对于模板代码来说,要注意的问题之前说过了,注意导入表、注意数据段、注意重定位等等。其实重定位还是很好解决的。导入表和数据段可以解决,但是很麻烦,需要重构,这也就意味着给我们的目标无形中带来了兼容性的问题。学习的时候可以过度开发。深刻研究,但是一旦你是为了实现功能而写代码的时候建议一定要从简,我们的目的是实现功能。出招过慢通常是因为姿势过多[这个是别人提醒我的话]OK不废话,说正题。

    尝试1

    1)随便写一个程序,作为宿主文件,记住代码多写点。别弄的代码段只有很少内容,结果自己注入的模板字节码比原来.text还大。[记住这个文件的随机基址一定要关闭,如果你用的是VS的话,在这里]

     


    2)编写一个通用模板程序(加载dll的),汇编代码在最后,开发环境(vs2012+masm32,这个程序的基址随不随机无所谓,因为一会只是把.text段部分拷贝过去。

    下图是生成的载体EXE:

     

     

    (3)然后把1生成的那个exe,的程序入口改成对应FOA=0X400的地方。在把2生成的EXE的代码段部分拷贝到1FOA=0X400处,运行1生成的exe会发现成功加载了相关dll

    下图是改PE头里面程序入口地址:


    然后是替换代码段的部分:

     

        最后那个E9 XXX 我没有修改,这个地方是留着最终嵌入到目标程序某个位置,执行完之后最好是跳转回原来的函数入口,这样就不会影响原目标载体的正常执行,同时又能执行我们自己的代码逻辑。

    这个实验是要是为了验证载体的独立行和可行性。因为源程序里并没有嵌入代码里的那些调用函数,也没有导入表,也没有数据段。这样只要让目标文件的逻辑指向咱们的入口就OK了,咱们是完全独立的。同时上面注意一个问题,就是再写被注入载体例子的时候,我是关掉了随机基址选项。接下来实验二尝试打开随机基址选项。因为实际嵌入别人程序很多时候对方的随机基址选项是开着的。开不开随机基址,看PE头信息就能看出来:




    尝试2

        这次打算解决上一个例子的不足。关于随机基址的问题,在平时使用的过程中,通常要做的是嵌入到别人的程序里,所以咱们认为很多的程序的那个选项是开着的,也就是基址是随机的,这个地方我刚刚做了很多尝试,我一开始是发现我嵌入的代码在call的地方失败了,call的地址什么都没有,然后我就在嵌入模板里在这个位置上做了很多次尝试,结果都失败了。我用全局变量重定位的姿势搞了这个call,结果还是不行(可能是姿势错误)。后来我反复编译我自己的一个helloworld[因为我也不知道到底那个选项改了什么],发现那个选项对代码段没有影响,额...既然我的代码是独立可以运行的,同时那个东西对代码段又没有影响,那是不是在我的程序里,我可以直接把那个随机的选项抹掉:


    结果我是在PE头里找到那个位置,把那个改成0,发现可以成功运行,然后我又找来chrome等别的程序,测试了几个,发现可以。
       

        然后打算下个PE比较工具看下具体细节,随便点击了一个界面进去了:

    看到的这个:


    一如既往的”喜欢的界面”,看那个大大橙色点击下来你就会下载一个你都不知道是啥的东西,对,都怪你,不仔细看细节。然后在下面不起眼的地方找到了“真实”的下载地址,下载了个这货:

    依然很熟悉的套路

        百度上搜索东西,下载很多都是下载个这么个东西,超级大礼包。[打着签名哦,而且国内杀软几乎都方行了],也许上面也是,都没违规只是做的不明显让你取消安装。但是国外貌似不承认这种所谓的不违规:

        下面是avast上执行这个exe的结果,执行前没报毒,也就是祖国的这款大礼包程序并没有对avast的动态扫毒做免杀,打着签名还被avast报毒,这肯定是一点都没有免杀...


        最后经过重重困难,在虚拟上安装了UC,然后运行不起来。FK。浪费时间。算了这个地方酱紫。继续 实验的测试流程

     

     

     

        然后就硬着试了一次:把目标PE头里面的这个字段直接抹成0,然后在用 实验的姿势去做,结果发现是可以的。OK 说下这次尝试的姿势步骤:

     

    (1)找到本机chrome.exe,修改PE头的两个地方

     {

          A:基部重定位表地址为0

          B:程序入口地址RVA(FOA=0x400)

     }

     

    (2) 然后编译嵌入模板文件,把.text(FOA=400)处的机器码拷贝到(1)改变之后的对应FOA=0X400的位置上。

    (3) 把测试dll和改好后的exe放到,chrome原来文件夹下,记住改名为chrome.exe,无意发现,chrome.exe如果换了名字之后就运行不起来了,额...不知道这个是处于防护还是什么,应该不是防护,防护的话这么做感觉没什么卵用,难道是怕别人做类似chrome->chrome2,my.exe->chrome.exe 这类事? 反正便面上看没卵用。

    (4) 运行chrome会发现相关dll被加载,点击确定之后chrome崩溃,崩溃是必然,因为首先没有给最后的那个跳转指令E9 XXXX更改实际值,同时因为暴力覆盖了原来代码部分,导致代码损坏。So这就是下个实验要做的事,把代码嵌入到某个位置,比如某个间隙,某个段(比如最后一段),或者自己单独创建一个段。放在里面等等。然后修改函数入口跳转进来,做完事再跳转到之前该跳转的位置。

     

    下面是实验2的一些细节截图:

    下图成功通过chrome.exe加载了dll

     

    下图是我本机上原版chrome重命名后起不来,弹的错误窗口:

     

        劫持过程中发现360弹窗,注意木马名称。之前没见过这个颜色的窗,我没记错的话之前是见过红色的[应该是加载服务或者驱动的时候],黄色的[镜像劫持或者hook的时候,直接cmd强行修改密码也是黄色]...不过不重要,可能就是随便换个皮肤吧,还顺便打个广告。主要是看描述和名称。同时还发现一个问题,如果是改chrome的话发现有保护,改自己写的代码并没有保护,没猜错应该是有这种特判逻辑,有时间研究下怎么过这个。不过这个不重要了,平时很少分析国内杀软。也不知道国内杀软都什么套路,就像发现电脑管家的一个优点就是界面贼帅,但是随便TDL无签名加上一个驱动,然后干掉它。全程没有提示。额.....


        360提示报毒之后,被修改的chrome.exe被干掉了,但是那个劫持I.dll,没被清理掉。这个地方差评,也许是还没到我加载这个DLL的时候就已经被截断了,所以就直接把exe干了。然后并没有在沙箱里跑我,看我操作那些文件,进一步清理。不过这样做也可以理解。没有理由继续深一步清理。产品---用户,效率---过度开发。很多时候过度开发就是在浪费生命。


     

    之后的实验是在不破坏原来PE结构的前提下附加我们的补丁代码。姿势有很多,我觉得我会选择扩展最后一节大小来做这个事,不过越简单的东西也就越容易被检测出来,想到最后一节扩展,突然想起个事,最后一节改完之后,然后对其,然后修改PE头。貌似对于大签名的文件来说签名还是正常的。这个之前分析过。BUT,这么改肯定要修改PE头的另两个字节,入口地址和代码重定位值。签名跟定无效了。So......

    感觉今天废话说的有点多,可能是周末时间多,无聊吧。看到都好奇,就简单看看。

  • 相关阅读:
    做正确的事,正确的做事
    博客园翻车启示录
    从一次线下读书会获得的收获
    坚持一个好习惯该有多难?
    有道云笔记
    Leetcode 10. 正则表达式匹配
    C++版
    VS 2013 professional版在win10上安装出错的解决方法
    华为校招2016.09机试 第1题: 字符串按指定长度重新分割
    C#版
  • 原文地址:https://www.cnblogs.com/csnd/p/12061965.html
Copyright © 2011-2022 走看看