ESP定律脱壳一般的加壳软件在执行时,首先要初始化,保存环境(保存各个寄存器的值),一般利用PUSHAD(相当于把所有寄存器都压栈),当加壳程序的外壳执行完毕以后,再来恢复各个寄存器的内容,通过跨区段的转移来跳到程序的OEP来执行原程序,简单点来说就是会将加壳过程执行一遍之后会跳到OEP来执行源程序,当我们找到了OEP的时候就是找到了源程序,即可实现脱壳。
通常在软件的破解过程中,会遇到代码经过混淆器混淆的程序,此类混淆器可以称之为壳,壳又可分为压缩壳(常见的有UPX、北斗、ASDPack、Npack、PECompact等)和保护壳(如强壳Safengine、VMprotect、winlicense、Themida等),压缩壳作用是把程序进行体积缩小化处理,保护壳主要作用是混淆或加密代码防止他人进行逆向程序、破解程序。我们可以通过一些侦壳程序进行识别,但有些壳会采用伪装技术来混淆侦壳程序。
本次我们使用ESP定律来脱一个ASPack的壳,先来准备课前工具,以后将使用这几个工具。
DIE查壳工具:https://files.cnblogs.com/files/LyShark/DiE_0.64.zip
课件内容:https://files.cnblogs.com/files/LyShark/ASPack.zip
1.首先使用DIE载入查询待脱壳程序,观察是使用那种语言来实现的,还有判断是加了那种壳,这里当然是aspack
上面的报告可以看出,编译器使用的是VC++ ,版本不确定,压缩器使用的是ASPack2.12版本。
2.OD载入待脱壳的程序,会看到第一条指令是Pushad,这种指令往往是成对出现的,而且能够使用ESP定律搞定。
3.接着我们按一下F8单步执行一次,会发现右侧寄存器窗口,只有ESP变成了红色,这样的情况可以使用ESP定律了。
4.在ESP寄存器上,右键,选择在数据窗口中跟随。
5.查看数据窗口,并选择下面的区域,设置断点,硬件访问断点,类型为DWORD
6.然后,F9 让程序跑起来,会停在以下代码区域。
7.然后按下F8,3次,到程序返回,最后看到下面的代码处,说明已经到了OEP的位置了。
8.直接脱壳,选择用od dump 脱壳调试进程。
9.点击获取OEP,脱壳,保存程序即可了。
10.最后,对比一下两个文件,会发现大小发生变化了。