关于压缩壳脱壳步骤详解!看这一篇足够。
本帖最后由 ajun2019 于 2022-5-26 18:06 编辑在文末我放置了常见的七种压缩壳,大家可以自己尝试着,用这些方法去脱一脱。分享出你脱壳的心得。期待!!!
什么是壳:
壳是一种概念上的东西,人们为了保护软件不会被轻易的修改或者反编译,希望软件能够获得一种保护,能如同乌龟壳保护乌龟一般,能有一个东西保护自己,于是壳就出现了。
关于壳的作用:
壳的初始作用是保护软件,但后来发展的方向不一就出现了各种各样的壳,大致有压缩壳、加密壳、VM 壳的分类。压缩壳故名思意,主要作用是用于压缩方面,可以有效的减小软件的大小;加密壳,其主要作用是保护软件;VM 壳是一种很特殊的壳,它利用了虚拟机技术,可以很有效的保护指定地址代码,但很大的牺牲了效率,所以一般只在关键代码处使用。
关于压缩壳的简介:
压缩壳的特点就是减小软件体积大小,加密保护不是其重点。
常见的压缩壳
upx、aspack、fsg、Aspack Scrambler、ExeStealth、 n Protector、V2Packer、WWPack32、XComp0.98、 BeRoEXEPacker、dePACK、ExeShield Protector、KByS、NsPacK、tElock、 NspackPECompect PetitewinUpack
脱壳——寻找 OEP 的 7 中方法:
1、单步跟踪法
单步跟踪法的原理就是通过 Ollydbg 的单步(F8)、单步进入(F7)和运行到(F4)功能,完整走过程序的自脱壳过程(不断使用 F8 向下运行,遇见向上跳转的就用 F4 ,),跳过一些循环恢复代码的片段,并用单步进入确保程序不会略过OEP。这样可以在软件自动脱壳模块运行完毕后,到达OEP,并 dump 程序。
单步跟踪法是最直接的方法,其主要的缺点是单步跟踪时十分枯燥,使用起来所花时间久,还可能出现跑飞的情况,但适用范围广。
主要原理是通过一次次的步过,让壳完成数据的解密等工作后,停止在程序的 OEP 处。
2、ESP定律法 (80%的压缩壳可脱)
ESP 定律法是脱壳的利器,是应用频率最高的脱壳方法之一。ESP 定律的原理在于程序中堆栈平衡的合理利用。由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器内容压栈,如使用 pushad,在解压结束后,会将之前的寄存器值出栈,如使用 popad。因此在寄存器出栈时,往往程序代码被自动恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪,就很容易到达正确的 OEP 位置。
具体操作步骤:pushad开头,F8一次以后,8个寄存器只有ESP是红色时候,就可以使用该定律。
右键ESP 选择数据窗口跟随,数据窗口下硬件访问断点,F9运行,此时已经接近OEP。
之前的大佬,用ESP定律脱壳的演示步骤,感兴趣的可以去看看。
https://www.52pojie.cn/forum.php?mod=viewthread&tid=396184&page=22#pid9791824
3、内存镜像法(二次断点法)
内存镜像法是在加壳程序被加载时,通过 OD 的 ALT+M 快捷键,进入到程序虚拟内存区段。然后通过加两次内存一次性断点,到达程序正确 OEP 的位置。
内存镜像法的原理在于对于程序资源段和代码段下断点,一般程序自解压或者自解密时,会首先访问资源段获取所需资源,然后在自动脱壳完成后,转回程序代码段。这时候下内存一次性断点,程序就会停在OEP处。
加壳程序在运行时,先将 .code 段进行自解密,然后再将其他段进行自解密。
操作步骤:我们需要先在其他任意资源段下一个断点,使得 .code 段已经完成自解密,然后再在 .code 段下断点,使得程序断在执行 OEP 处。
图文教程演示:https://www.52pojie.cn/forum.php ... &page=38#pid9992513
4、一步到达OEP
所谓的一步到达 OEP 的脱壳方法,是根据所脱壳的特征,寻找其距离 OEP 最近的一处汇编指令,然后下 int3 断点,在程序走到 OEP 的时候 dump 程序。 如一些压缩壳往往 popad 指令距离 OEP 或者大 Jump 特别近,因此使用Ollydbg的搜索功能,可以搜索壳的特征汇编代码,达到一步断点到达OEP的效果。
ctrl+f 查找 popad
ctrl+l 跳转到下一个匹配处
找到匹配处, 确认是壳解压完毕即将跳转到 OEP 部分, 则设下断点运行到该处
只适用于极少数压缩壳
5、最后一次异常法
最后一次异常法的原理是,程序在自解压或自解密过程中,可能会触发无数次的异常。如果能定位到最后一次程序异常的位置,可能就会很接近自动脱壳完成位置。现在最后一次异常法脱壳可以利用Ollydbg的异常计数器插件,先记录异常数目,然后重新载入,自动停在最后一次异常处。
步骤:
1、 保留所有异常,载入程序。按"SHIFT"+“F9”,并开始记数M,直到程序运行。
2、 重新载入程序。按"SHIFT"+“F9"忽略异常M-1次。
3、 查看堆栈窗口中,“SE 句柄"前面的地址。
4、 按"ctrl+g”,打开表达式跟随窗口,输入,在堆栈窗口查到的地址。
5、 F2下断,按"SHIFT”+"F9"来到断点处,去掉断点。
6、 在OD的右下角会出现一个SE句柄,按CTRL+G,输入SE 句柄前的地址。
7、 F2下断,SHIFT+F9来到断点处。
8、 去掉断点,F8走到程序的OEP。
图文演示步骤:https://www.52pojie.cn/forum.php ... &page=38#pid9992482
关于 DUMP 的方法及原理:
工具:PETools(以管理员身份运行)、 importREC(以管理员身份运行)
在其中找到我们所需要进行 dump 的程序,选择完整转存,然后就可以得到转存的文件了,再使用 importREC 进行修复 IAT 。其中 OEP 地址,RVA 需要注意填写的正确,可以通过查询 FF 15 查找 IAT 起始地址,从而得到 RVA 。
IAT RVA:IAT 起始地址 - 程序虚拟起始地址
IAT 大小:IAT 起始地址 - IAT 结尾地址(可以超出,不能小)
————————————————
这七种壳,是最常见的压缩壳,大多数都能用ESP定律去掉。
另外的内存镜像和单步跟踪就能找到OEP,推荐大家尝试下。
就可以突破压缩壳脱壳困境了。
tyz1234 发表于 2022-5-26 16:28
到达OEP处就代表脱壳完成了吧?楼主别介意哈,我是纯小白
到达OEP只是代表你找到了程序的真正入口点,并不代表脱壳完成,找到OEP后使用OD自带的脱壳插件或者用loardpe进行脱壳,脱壳后程序能正常运行表示脱壳成功。 只会用脱壳工具来脱壳的小白路过,学习一下,谢谢分享 tyz1234 发表于 2022-5-26 16:28
到达OEP处就代表脱壳完成了吧?楼主别介意哈,我是纯小白
是的{:1_927:}脱壳完成! 膜拜大佬 非常感谢,mark学习 涨知识了{:1_893:} 没个演示步骤吗, 感觉内容很易懂,如果排版再精细一点,估计能上热门。 学习一下 有点难