• 脱壳_00_压缩壳_ASPACK


    写在前面的话:

    Aspack是最常见的一种压缩壳,具有较好的兼容性、压缩率和稳定性,今天我们就来一起分析一下这个壳;

    零、分析压缩壳:

    0、在开始动态调试前,用PEID和LoadPE查看一些信息,做到心中有数;

    1、了解了基本的信息后,我们将文件拖到调试器中,进行分析;

    分析之前,要明确以下几点,这也是我们的目的(分析时,该做些什么);

    I).   找到原始OEP

    II).  dump文件;

    III). 如果需要修复文件,则进行修复,一般IAT;

    IV). 如果程序仍然无法运行,去掉脱壳后的随机基址,再次尝试;

    V).  如果仍然有问题,单步跟踪;

    程序入口点处,有个pushad,根据这个,其实可以知道,这个PE文件,8成加过壳了

     

    第一步,找OEP;

    遇到这种pushad/pushfd之类的,我们寻找OEP的方法就是ESP定律,有pushad,就一定会有popad,那就会访问到pushad后ESP的位置;

    因此,首先单步运行(F7),在ESP地址处,下断【硬件访问】

    下完断点后,F9运行程序,会在我们下断点的位置处触发断点:

    说明壳的代码,基本执行完毕了,接下来,就单步,顺利的话,一般会有些jmp,跳转到未加壳之前PE的OEP处,这里,就需要

    我们对程序的OEP处的敏感信息有所警惕了,什么样的程序,OEP都有什么样的特征,这样也可以帮助我们对OEP的判断;

    单步几次后,程序跳转到这个位置,注意下:

    A) 地址010F11D2,跳转之前的地址约么在01107425,有些跨度,要注意了;

    B) call xxx; jmp xxx,典型的VS编译的程序的特征,加上PEID查看到的链接器版本12.0,初步推断,是VS2013编译的;

    为了进一步验证我们的推断,看下CALL里的内容

    到这里,找到了证据,因此,我们认为,这个位置,就是原程序的OEP;

    在开始dump之前,看下它的IAT信息,结合刚刚call中的函数,调试器已经正确的标识出了函数名,其实,我们可以猜想,这个壳

    对IAT并没有做加密操作;【附录:FF 15 表示的call,就是在call IAT表,call后就是IAT地址,正常的call是E8】

    我们可以看到,IAT表里存放的就是真实的函数地址,并没有加密,因此,我们可以开始dump了;

    附录:如果地址显示是16进制,需要转为地址格式,进行查看:

     第二步,dump(x32dbg的dump和OD不同,OD的就不再介绍了,在32dbbg里,用到了一个插件Scylla)

    PS:看到这个插件,不禁想起了大学时光,那些年我们都在越狱;

    脱壳完成了,能运行吗,尝试下:

    无法运行,根据最初我们的步骤,猜测是重定位导致的问题,先把随机基址去掉,重新运行下:

    修改40为00

    保存后,重新运行:

    成功,说明确实是随机基址导致的问题,因此,为了完美解决问题,我们需要修复重定位表;

    第三步,修复重定位

     其实到这一步,我们已经结束了,既然知道了重定位表的地址,便可以知道原PE文件的RVA和Size,拖到loadpe中修改就行了,

    至于说那个搞破坏的那部分代码,不用管它,因为OEP改变后,壳的那部分代码已经不执行了,还有什么必要去修改它呢;

    保存后,我们再运行下,看看:

    至此,脱壳成功;

    一、ASPACK压缩壳特点:

    0. 并未加密IAT,可在x32dbg中,Scylla进行修复;

    1. 只需要找到重定位的RVA和大小就行了;不用理会壳自身对重定位的改动;

    2. 可以利用ESP定律定位到OEP;

    结语:整体来看,在脱壳的时候,虽说是压缩壳,但是,只要找到那几个关键的步骤点,我们是没有必要去搞懂具体是怎么压缩的;

    因为,压缩千变万化,当然,如果想练习下阅读汇编的能力,是推荐读者找个壳,自己仔细单步分析下的;

  • 相关阅读:
    创建字典的方法
    python中,a=10.0 b=10.0 a is b 为什么输出是false
    Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
    二十三种设计模式及其python实现
    python字符串替换的2种方法
    数据库索引的实现原理?
    异步IO数据库队列缓存RabbitMQ队列
    Python 如何用列表实现栈和队列?
    Python数据结构与算法?
    django -----原生SQL语句查询与前端数据传递?
  • 原文地址:https://www.cnblogs.com/Reginald-S/p/8879975.html
Copyright © 2020-2023  润新知