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

一、工具及壳介绍
二、脱壳
1、ESP定律脱壳
2、单步跟踪脱壳
3、基址重定位的修复

一、工具及壳介绍

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

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

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

二、脱壳

1、ESP定律脱壳

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

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

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

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

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

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

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

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

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

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

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

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

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

2、单步跟踪脱壳

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • IAT函数调用也都恢复

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

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

3、基址重定位的修复

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

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

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

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

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

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

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

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

附件:

AsPack.exe

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/PhantomW/p/9328102.html

时间: 2024-10-08 18:08:59

手工脱壳之AsPack压缩脱壳-随机基址的相关文章

【LinuxC】GCC编译C程序,关闭随机基址

1.编译.链接和运行程序 C代码示例: #include <stdio.h> #include <stdlib.h> int main() { printf("hello world!\n"); exit(0); } 编译运行参数如下: [[email protected] Desktop]# gcc -o hello hello.c [[email protected] Desktop]# ./hello 2.关闭内存地址随机化机制(alsr) 关闭 [[em

脱壳的艺术

脱壳的艺术 Mark Vincent Yason 概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一.为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键.这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者. 本文主要目的是介绍壳常用的反逆向技术,同时也探讨了可以用来躲过或禁用这些保护的技术及公开可用的工具.这些信息将使研究人员特别是恶意代码分析人员在分析加壳的恶意代码时能识别出这些技术

病毒加壳技术与脱壳杀毒方法解析【转载】

壳是什么?脱壳又是什么?这是很多经常感到迷惑和经常提出的问题,其实这个问题一点也不幼稚.当你想听说脱壳这个名词并试着去了解的时候,说明你已经在各个安全站点很有了一段日子了.下面,我们进入"壳"的世界吧. 一.金蝉脱壳的故事 我先想讲个故事吧.那就是金蝉脱壳.金蝉脱壳属于三十六计中的混战计.金蝉脱壳的本意是:寒蝉在蜕变时,本体脱离皮壳而走,只留下蝉蜕还挂在枝头.此计用于军事,是指通过伪装摆脱敌人,撤退或转移,以实现我方的战略目标的谋略.稳住对方,撤退或转移,决不是惊慌失措,消极逃跑,而是

UPX 脱壳初见

1.壳是什么? 加壳一般是指保护程序资源的方法. 脱壳一般是指除掉程序的保护,用来修改程序资源. 病毒加壳技术与脱壳杀毒方法 : 壳是什么?脱壳又是什么?这是很多经常感到迷惑和经常提出的问题,其实这个问题一点也不幼稚. 壳,在我们的印象中,它的作用就是保护,例如龟壳,这是传统意义上的壳,通常被用来保护自己:今天我们讨论的壳是程序的壳,它的功能和一般意义上的壳有相同的地方,它们都是保护作用,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序.它们一般都是先于程序运行,拿到控制权,

ORiEN脱壳分析

作者:Fly2015 ORiEN这种壳之前没有接触,到底是压缩壳还是加密壳也不知道,只能试一试喽.需要脱壳的程序是吾爱破解脱壳练习第7期的题目. 首先对加壳程序进行查壳,这一步也是程序脱壳的必要的一步. 使用DIE工具对加壳程序进行查壳,发现被加壳程序原来是用Delphi语言编写的,这个信息对于找原程序的OEP是很有帮助的. 下面OD载入程序进行分析,被加壳程序入口点汇编代码: 对被加壳的程序进行脱壳的时候,先不慌着脱壳,最好先看下程序的汇编代码,F7/F8单步走几步看看,没准你会有新发现. F

android脱壳之DexExtractor原理分析[zhuan]

http://www.cnblogs.com/jiaoxiake/p/6818786.html内容如下 导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1.  需要动态调试 2.  对抗反调试方案 为了提高工作效率, 我们不希望把宝贵的时间浪费去和加固的安全工程师去做对抗.作为一个高效率的逆向分析师, 笔者是忍不了的,所以我今天给大家带来一种的新的脱壳方法——DexExtractor脱壳法. 资源地址: Dex

android脱壳之DexExtractor原理分析

导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1.  需要动态调试 2.  对抗反调试方案 为了提高工作效率, 我们不希望把宝贵的时间浪费去和加固的安全工程师去做对抗.作为一个高效率的逆向分析师, 笔者是忍不了的,所以我今天给大家带来一种的新的脱壳方法--DexExtractor脱壳法. 资源地址: DexExtractor源码:https://github.com/bunnyblue/DexExtracto

Apk脱壳圣战之---如何脱掉“梆梆加固”的保护壳

一.前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁.这样的恶意软件是非常让人痛恨的.所以本文就用一个案例来分析如何破解这类应用,获取解锁密码,让被骗的用户可以找回爽快! 二.分析软件锁机原理 本文用的是一款叫做:安卓性能激活.apk,关于样本apk文件后面会给出下载地址,从名字可以看到它肯定不会是一个恶意软件,但是当我们安装的时候,并且激活它的权限之后就完了.下面不多

Android通用脱壳工具DexHunter的原理分析和使用说明(二)

本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53715325 前面的博文<Android通用脱壳工具DexHunter的原理分析和使用说明(一)>中已经记录了很多关于DexHunter脱壳工具的脱壳原理和思考的思路问题并没有涉及到DexHunter脱壳工具的代码的分析,今天我就代码分析.理解和DexHunter脱壳工具的使用以及需要注意的地方进行博文的记录. 在阅读DexHunter的代码之前,复习下几个须知: 1>.