逆向基础——软件手动脱壳技术入门


01一些概念

1.1 加壳

加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。

加壳是利用特殊的算法,对EXEDLL文件里的资源进行压缩、加密。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。它们附加在原程序上通过Windows加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可以防止程序被静态反编译。

壳的类型通常分为压缩壳和加密壳两类。压缩壳的特点是减小软件体积大小,加密保护不是重点。加密壳种类比较多,不同的壳侧重点不同,一些壳单纯保护程序,另一些壳提供额外的功能,如提供注册机制、使用次数、时间限制等。

1.2 OEP

OEP:(Original Entry Point),程序的入口点。软件加壳一般隐藏了程序真实的OEP(或者用了假的OEP), 我们需要寻找程序真正的OEP,才可以完成脱壳。

一般加壳程序在使用Ollydbg等动态调试工具时,会停在壳的预处理块。即处在对于程序原始代码块的解压或解密操作之前,在运行完程序自脱壳模块后,会停留在程序加壳之前的OEP位置,此时是dump程序的最佳时期。脱壳时在真实OEP处下int3断点,就可以捕捉到程序代码段完全恢复的状态。因此,寻找加壳程序的正确OEP,也成了手动脱壳时的第一要务。

1.3 IAT

IAT:(Import Address Table),导入地址表。由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL中。当PE文件被装入内存的时候,Windows装载器才将DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成。其中导入地址表就指示函数实际地址。 多数加壳软件在运行时会重建导入地址表,因此获取加壳程序正确的导入地址表也是手动脱壳操作中的一个关键问题。

02 一些脱壳方法

 


2.1单步跟踪法

单步跟踪法的原理就是通过Ollydbg的单步(F8)、单步进入(F7)和运行到(F4)功能,完整走过程序的自脱壳过程,跳过一些循环恢复代码的片段,并用单步进入确保程序不会略过OEP。这样可以在软件自动脱壳模块运行完毕后,到达OEP,并dump程序。

2.2 ESP定律法

ESP定律法是脱壳的利器,是应用频率最高的脱壳方法之一。

ESP定律的原理在于程序中堆栈平衡的合理利用。由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器内容压栈,如使用pushad,在解压结束后,会将之前的寄存器值出栈,如使用popad。因此在寄存器出栈时,往往程序代码被自动恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪,就很容易到达正确的OEP位置。

2.3内存镜像法(二次断点法)

内存镜像法是在加壳程序被加载时,通过ODALT+M快捷键,进入到程序虚拟内存区段。然后通过加两次内存一次性断点,到达程序正确OEP的位置。

内存镜像法的原理在于对于程序资源段和代码段下断点,一般程序自解压或者自解密时,会首先访问资源段获取所需资源,然后在自动脱壳完成后,转回程序代码段。这时候下内存一次性断点,程序就会停在OEP处。

2.4一步到达OEP

所谓的一步到达OEP的脱壳方法,是根据所脱壳的特征,寻找其距离OEP最近的一处汇编指令,然后下int3断点,在程序走到OEP的时候dump程序。 如一些压缩壳往往popad指令距离OEP或者Magic Jump特别近,因此使用Ollydbg的搜索功能,可以搜索壳的特征汇编代码,达到一步断点到达OEP的效果。

2.5最后一次异常法

最后一次异常法的原理是,程序在自解压或自解密过程中,可能会触发无数次的异常。如果能定位到最后一次程序异常的位置,可能就会很接近自动脱壳完成位置。现在最后一次异常法脱壳可以利用Ollydbg的异常计数器插件,先记录异常数目,然后重新载入,自动停在最后一次异常处。

2.6 模拟跟踪法

模拟跟踪法的原理就是使用Ollydbg下条件断点,SFX相当于是一个自解压段,在自解压段结束时(eip的值转到代码段时),已经距离OEP很近,但是这种跟踪方法会比较耗时。

2.7 “SFX”法

SFX”法利用了Ollydbg自带的OEP寻找功能,可以选择直接让程序停在OD找到的OEP处,此时自解压已经完成,可以直接dump程序。03一些脱壳实践

 


下面给出整理的使用以上方法,自己尝试手动脱这几种常用壳的脱壳笔记。

3.1UPX脱壳笔记

首先进行侦壳:

首先把程序扔到OllyIce里面可以看到:

 

然后这里尝试使用ESP定理:即在ESP第一次改变时,对ESP的地址设置硬件字访问断点,这样可以在代码被UPX算法还原之后,跳转到程序的正常入口处。

 

然后F5运行,并没有直接到跳转到程序入口处的大跳位置,但是可以看到UPX的大跳就在眼前:

所以被还原后的程序入口点就是0x00445151(通过单步往下走,F4略过往回走的循环语句,也可以看到这个大跳的位置。)接下来走到大跳位置,跳到正常程序入口处:

 

然后去掉硬件断点,并使用LoadPEdump功能dump目标程序:

先修正映像大小,然后再选择完整脱壳,这样可以得到第一步dump的程序,然后再使用ImportREC修复dump程序的OEPOEP的信息通过OD自带的dump功能查询或者直接填45151

 

将正确的入口地址填入ImportREC中,然后自动搜索IAT信息:

然后点击获取输入表得到修正IAT之后的程序函数输入表,然后再点击显示无效函数,愉快地发现没有无效函数,那么就可以直接修复转存文件了。

 

 

选择刚刚第一步dump下来的转储文件进行修复,修复完成之后脱壳完成:

这里对于压缩壳UPX,直接使用了ESP定律,可以很方便找到OEPdump程序。

4.2 tElock脱壳笔记

这里脱的是一个tElock的壳:

2008883-20200421163035952-1113707905.pnguploading.4e448015.gif正在上传…重新上传取消

88721317_11uploading.4e448015.gif正在上传…重新上传取消

1、先使用最简单的最后一次异常法: 首先把程序扔到OllyIce里面设置OD调试选项中的异常选项,

2008883-20200421163044161-1273486774.pnguploading.4e448015.gif正在上传…重新上传取消

88721317_12uploading.4e448015.gif正在上传…重新上传取消

仅保留内存非法访问异常,然后使用异常计数器插件,在使用前要清空断点设置:

88721317_13uploading.4e448015.gif正在上传…

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值