常见的脱壳技巧

来源:互联网 发布:golang教程 csdn 编辑:程序博客网 时间:2024/06/06 07:35

         一个软件的保护,除了加入花指令之类的保护,当然是离不开壳的保护的。那么,常见的壳大多可以分为两种,一种是加密壳,一种是压缩壳。当我们想对一个软件的源码进行分析或者是想对一个软件进行优化的时候,壳就是挡在我们面前的第一个问题。那么,我们可以在这里讨论下常见的脱壳技巧,来看看以前的壳都是怎么来保护软件的。一般情况下,压缩壳是将一些常用的代码进行替换,然后在程序运行之前,壳的代码先运行,将替换掉的代码再替换回去,紧接着再进行程序的运行。所以说压缩壳的保护强度并不会太强,而加密壳,则是用自己的算法将程序的代码进行换算,修改导入表IAT,然后再在程序运行之前,修复导入表IAT进行解密。所以说,原理上当一个程序没有脱壳之前,我们是无法对它进行修改和分析源代码的。

           那么,我们现在来看下常见的脱壳技巧,一般来说,常见的脱壳技巧有:单步跟踪法、堆栈平衡法(ESP定律法)、二次内存镜像法、一步直达法、模拟跟踪法、最后一次异常法。我们一个个的来看。

          所谓单步跟踪法,就是将程序载入OD,然后单步F8进行跟踪,遇到向下的跳转就跟着跳,遇到向上的跳转就在它跳转的下一行按F4让他直接运行下来。然后一步步的跟踪,再遇到一个跨度很大的跳转(一般是jmp跳转)就可以到达真正的OEP,就可以进行脱壳了。这里解释下,一般情况下,程序的壳的代码在后面,所以,它一些向上的跳转就是进行一些替换,然后最后的一个大跳转,就是替换完毕,然后开始运行真正的程序。

          而堆栈平衡法(ESP定律法)就是,我们将带壳的程序载入OD以后,开始单步F8,然后遇到第一个push的时候注意右边的寄存器窗口,关注ESP寄存器,当发现它变化了之后,就可反手键选择在数据窗口中跟随,然后在第一行的位置全部选择,反手键,选择断点,硬件访问的word或者dword。然后F9运行,等到断下来的时候继续F8运行,直到继续遇到大跳转,到达OEP。(这里的堆栈平衡主要是程序加了壳以后,会进行一个压栈操作,然后有压栈必定有出栈,那么就可以用堆栈平衡法)

          接下来说二次内存镜像法,这里的操作是我们将忽略所有异常全部取消,然后打开内存界面,在.rsrc段按F2下断,然后shift+F9运行,断下来以后,再次在内存界面中的.code段F2下断,再次shift+F9,然后就可以到达程序的OEP。对于这个方法,可以理解为程序先让它的壳的代码进行加载,然后壳加载完毕之后,程序肯定要到自己的OEP,这时候我们在代码段下的断就会把它断下来,我们就可以捕捉到真正的OEP了。

          所谓的一步直达法,其实主要是针对UPX壳和aspack壳的,对其余的壳不是很管用。接下来介绍下方法,因为这样的壳,刚载入OD的时候我们会发现它是有一个pushad,压栈,那么肯定就有popad出栈,我们就可以打开搜索命令,记得不要勾选全部,然后输入popad,搜索到以后下断,F9,然后F8几步一个大跳转就会到真正的OEP了。

          模拟跟踪法经常和SFX法在一起,我们打开OD的选项,调试设置中找到sfx,然后选择在第二个或第三个,就可以让程序自己去寻找OEP了。没什么技术含量,而且很费时间,不太推荐这种方法。

          最后一次异常法,其实是取消忽略所有异常,然后一直shift+F9,记得数你按了几次shift+F9(假设是n次),然后再次载入,,按n-1次shift+f9,到了以后查看右下角的堆栈窗口,选择SE句柄那一句,我们就可反手键数据窗口跟随,然后再在数据窗口全选第一行,反手键选择内存写入断点,shift+F9,到了以后,F8几步就会到达真正的OEP。(很惭愧,这个方法的原理我也不太清楚其实),不过这里我可以给大家说一个最后一次异常法的简单技巧,我们第一次不需要取消忽略所有异常,直接让程序运行,然后打开OD的log窗口,查看它有几次访问违例,就再第二次载入程序的时候,按几次shift+f9。然后再在内存段下断,就会来到OEP。

0 0
原创粉丝点击