手工脱壳之AsPack压缩脱壳-随机基址

一、工具及壳介绍

  • 使用工具:Ollydbg、PEID、ImportREC、LoadPE、010 Editor
  • 查看待脱壳程序

1531793958260

  • 查看AsPack壳特有的区段信息

1531794016727

  • 小结:根据链接器版本推断待脱壳程序应该是VS 2013编写

二、脱壳

1、ESP定律脱壳

  • 使用OD加载程序,发现pushad指令,判断程序已加壳,这里可以采用ESP定律脱壳

1531794622095

  • 单步过pushad处指令后,在esp处下硬件断点

1531794992650

  • 让程序运行起来,程序中断的地方即为popad的地方,单步几次之后,一般就能找到原始OEP

1531795186671

  • 单步几次后发现CALL和JMP组合

1531796672746

  • 使用回车进入CALL后发现VS 2013 程序特有的几个函数,确认到达OEP处

1531796070153

  • 查看此时模块基址(exe的基址)

    注意:本次为11000000(每次重启系统有可能不相同)

1531796880679

  • 在原始OEP处dump文件,使用OD插件OllyDump

    修改起始地址为基址,入口地址为原始OEP地址并取消重建输入表选项

1531797600797

  • 转储文件后,使用导入表修复工具(ImportREC)对导入表进行修复

1531798219386

  • 转储文件后运行脱壳程序

    发现程序无法运行,并且导入表修复没有问题,那基本可以确定是随机基址的问题

1531798301700

  • 使用010 Editor找到特征(40 81)修改随即机制的标记位,在运行程序

1531798509478

1531798716511

2、单步跟踪脱壳

  • AsPack加壳之后的OEP处就存在花指令

1531883223932

  • 1117007处的代码第一个字节永远不会执行的指令,将其填充成nop指令可去除干扰

1531883325117

  • 重新加载待脱壳程序,当我们单步跟踪时,遇到的函数时GetModuleHandleA,而且我们发现参数是kernel32.dll,调用此函数获取的信息时kernel32.dll的基地址

1531821138338

  • 有了kernel32的基地址之后就可以获取这个模块的其他任意函数,接下来调用的应该是GetProcAddress

1531821291182

  • 继续单步跟踪,发现第三个函数调用

1531821487942

  • 在这里VirtualAlloc函数的出现,一般与解压解密代码有一定的关联,继续跟踪

1531876748384

  • 发现又有一个VirtualAlloc函数的调用,继续跟踪分析。发现一个函数调用,查看内部调用发现很繁琐,只能分析一下参数,分析之后发现这个函数大有文章。

1531877113838

  • 分析参数发现4个参数与我们想要找的解压代码函数很相似,有申请的内存地址,有代码段的大小(代码段大小的识别第一看数值大小,第二看调用完之后的情况,由于之前已经分析过,所以代码段大小非常容易确定),单步不过这个函数,分析缓冲区,发现190000中果然是解压的代码

1531877434471

  • 这个函数暂时不需要往里面跟踪,继续单步往下分析。能够看到有一段代码在寻找E8或E9,然后修复E8或E9后面的值,也就是说整个代码段CALL和JMP都将会被修复

1531877864252

  • 观察修复后的值和未修复的值,发现修复后的值是原先的代码,而未修复的值是经过转换的,这个值看起来是为了迎合压缩算法而进行的转换,分析到这,不需要在深入进行分析,总结一下,到目前为止我们分析的代码中最有价值的就是代码进行了解压,对代码进行了修正

1531878040802

  • 经过修正代码的循环,继续往下跟踪,可以发现将解压的代码拷贝到原始代码段的代码。

1531878514105

  • 拷贝完之后,申请的内存就没有用了,所以单步跟踪发现释放内存的函数

1531878587883

  • 继续单步跟踪,发现一个向上的跳转

1531878660947

  • 单步一下这段代码发现原来是在循环解压代码、数据等各区段

1531879076708

  • 继续跟踪,代码访问了重定位的区段,分析之后发现是在重定位代码

1531879595829

  • 其中有一行代码时清除重定位信息的,正是有了这行代码,我们脱壳之后,随机基址才无法支持,所以在脱壳时,应该将这行代码nop掉。
  • 重定位代码之后,继续单步跟踪分析,发现有这样的一组调用。

1531880127154

  • 修复IAT的时候才会有这样一组操作,继续往下分析

1531880441301

  • 找到了填充IAT的地方,到此为止shell部分的代码基本上分析的差不多了,我们可以查看一下代码段及数据段。
  • 代码段已经恢复

1531880668806

  • IAT函数调用也都恢复

1531880704634

  • 接着继续跟踪,最后就是修改各区段的内存属性,填充原始OEP地址,跳转到原始OEP

1531881151449

  • 最终跳转到原始OEP处,然后进行dump,修改等操作就可以了

1531881413448

3、基址重定位的修复

  • 在单步跟踪时我们注意到了有重定位相关的代码,并发现有对重定位表清除的操作

1531881651034

  • 我们能识别出内存中重定位表的信息,只要大片以3开头的word数据,一般都是基址重定位信息,基址的RVA是16000

1531882254841

  • 在清除重定位信息的地方下断点,观察寄存器的值和寄存器指向的内容

1531882338795

  • 可以看出是在清除重定位表中的数据,确定之后可以将其nop掉

1531882415990

  • 之后需要分析出基址重定位的总大小,查看内存之后发现最大应该是0xC72

1531882611573

  • 总结一下,基址重定位表的RVA是16000,大小是0xC72,将dump出的程序,使用LoadPE对数据目录表中基址重定位项进行修改

1531882916874

  • 完成修改,进行测试运行,程序完美支持随机基址

1531882962447

个人总结:ESP定律脱壳很简单,后边的使脱壳程序支持随机基址很重要。

附件:

AsPack.exe

 
 
 
 



转载于:https://www.cnblogs.com/PhantomW/p/9328102.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一.脱壳机名字的由来 skylly's CoolDumpper,借用了看雪论坛里高人某个让人流口水的工具的名字 界面也是盗版的CoolDumpper,不过本人盗版技术不高,做成了个四不像~~ 二.脱壳机的原理 由以下几大要部分组成, 1.侦壳功能. 完全拷贝自看雪论坛“任平生”的代码 2.Dummpper(进程转存) 初期,完全拷贝自lenus的lenus's Dummper代码, 现在为了适应脱壳的需要,发现原来的代码对非标准格式的PE文件的处理有些小问题, 所以代码基本都重写过了,但是基本处理步骤还是一致的,外表上看不出来 3.cooldebugger plugin(调试插件) 完全自主开发的插件,说是调试器其实没有用调试,而是注入,然后进行一些最简单的内存操作,没有 什么技术含量,可以完美躲过调试器检测的壳,对于内存检验比较强的壳可能不是很好用。 4.真正意义上的调试器 用最简单的调试API做的一个具有基本功能的调试器,目前还不能用于脱壳,只是一个玩具,为了将来扩展用的。 但是hook api始终不是很妥当,总会让壳有机可乘,以后可能会考虑加入驱动,驱动最让我不放心的是它的稳定性。 三,关于源码 由于还在开发中,暂不开源(主要是怕被人拿去篡改,反而让人以为他是正宗,我是盗版) 等到我不再开发时,会开放全部源代码,技术这东西,共享才是王道。 四。使用说明。 我想不用说太多了吧,选择目标文件后(支持拖放),再选择对应的插件,再点击脱壳按钮就可以了。可以说是接近傻瓜化了... 几个子功能说明: 详细日志:是调试器用的 PE标准化:是对某些被改得乱七八糟的壳(如upack)进行简单的PE修复 移除自校验:这个功能可以说是没有设计好,不同的壳自检验的地方不一样, 所以处理也应该不一样,可按照现有的工作模式又不可能把它做到plugin(插件)里面去, 但是,总之我会加进去的。 第x次调用API中断:这个功能是从CoolDumpper那儿抄袭界面遗留下来的,光有界面,未实现功能,将来如果有自动脱壳搞不定 的壳时,可能可以把这个地方扩展成手动脱壳。 OEP输入框和IAT输入框:功能已经弱化,由脱壳插件自动完成。 纠正映象大小:功能已经弱化,已经由dumpper自动完成。 五。关于private版本. 由于种种原因,不再发布public版本,仅作为私下交流之用。 所谓私下交流,可以算一种"精华"门槛吧. 1.看雪论坛或者一蓑烟雨,30精以上的朋友(高手)或者500帖以上的朋友(超级水牛),或者30贴以内且精华率在1/3以上的(超级高手)随时可以向我索要最新版。不过我相信高手们只会把我这个东西当玩具玩玩而已。 2.在使用这个脱壳机过程中遇到比较严重的问题或者不能脱的壳,可以来E-mail和我交流,欢迎技术交流,谢绝任何形式的脱壳请求, 因为我只是个菜鸟。对于有价值的来信,我会酌情回复最新版脱壳机。 得到这个脱壳机的人,任由其处置。 六。开发目标 开发常见压缩壳和加密壳的插件并实现自动脱壳压缩壳插件做十个左右,加密壳插件做二十个左右。 压缩壳插件: upx, upack, aspack, nspack, mew, hmimys, pecompact, expressor, fsg, kbys, packman, PEncrypt (已经基本完成。) 加密壳插件:(还没想好,暂定, 刚刚开始开发) pe-armor, armadillo, aspr, acpr, telcok, execrypt, pelock, pc-guard, morphine, safedisc, themida, enigma, obsidium, starforce, yoda_s_cryptor, epe, pespin, svkp, sdp.............. 预估主程序最终版本版本号:2.0 预估所有插件最终版本号:0.3 已知bug: 1.由于修复输入表是用的ImpRec.dll这个动态链接库,我没有源码,它在处理某些IAT不连续的程序时,获取的IAT的大小有问题,所以暂时还没 有解决方案来对付,等我复习好输入表结构,以后脱壳机就自己来重建输入表了,呵呵。 2.无法对付多层壳. 3.处理自校验有问题,请不要随便选中,否则后果自负 现在发布的这个版本仅仅代表了一个脱壳机的起步阶段,当玩具吧。
### 回答1: ASPack 全自动脱壳是指通过使用特定的软件工具来自动解压被 ASPack 打包加壳的可执行文件。ASPack 是一款常用的可执行文件压缩软件,它能够将程序代码进行压缩,减小文件体积,并添加加密保护,使得逆向工程更加困难。 实现 ASPack 全自动脱壳需要借助于一些反病毒、反调试工具或专门的脱壳器。这些工具能够自动检测和解析被 ASPack 打包的文件,找到加壳程序代码的入口点,并将压缩的代码还原为原始的可执行文件。 ASPack 全自动脱壳的步骤通常包括以下几个阶段: 1. 选择适当的脱壳工具:根据具体的需求,选择能够支持 ASpack 解压的脱壳工具或软件。 2. 加载被加壳的可执行文件:将需要脱壳的文件加载到脱壳工具中。 3. 设置脱壳参数:根据加壳文件的特点,设置脱壳的参数,例如加壳文件的版本、解密算法等。 4. 运行脱壳工具:运行脱壳工具进行解壳操作,工具会自动检测解密代码的位置,并将压缩的代码还原。 5. 生成解壳后的文件:脱壳工具将解密后的代码写入新的文件中,生成一个解壳后的可执行文件。 6. 执行解壳后的文件:最后,可以执行解壳后的文件,得到原始的可执行程序。 当然,不同的加壳程序可能具有不同的特征和算法,因此实际操作过程可能有所差异。对于一些特别复杂的加壳程序或者高级的保护机制,可能需要更加专业的工具或技术来完成全自动脱壳。 ### 回答2: ASPack是一款常用的可执行文件压缩工具,用于减小可执行文件的体积。全自动脱壳是指通过一系列的技术手段,自动化地将ASPack压缩的可执行文件进行解压,恢复成原始的可执行文件。 实现ASPack全自动脱壳主要包括以下步骤: 1. 静态分析:通过逆向工程,对ASPack压缩的可执行文件进行静态分析,了解其内部结构和机制,如标识符、函数调用等。 2. 自动解包:根据静态分析的结果,编写自动化脚本或程序,对ASPack压缩的可执行文件进行解包。解包的过程可能包括找到压缩代码的入口点、定位密钥等。 3. 调试修复:解压后的文件可能由于压缩导致一些问题,例如跳转地址错误,数据部分错误等。通过调试可执行文件,修复这些问题,使得解压后的文件能够正确地执行。 4. 重构源代码:通过静态分析和调试修复,获取到解压后的可执行文件。如果需要对其进行二次开发或其他操作,可以将其转化为源代码形式,以方便进一步的操作。 尽管实现ASPack全自动脱壳需要一定的技术和经验,但是通过静态分析和自动化脚本,可以有效地减少手动操作的工作量,提高脱壳的效率和准确性。这对于安全研究人员和开发人员来说,是一个非常有用的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值