脱壳学习记录----EXE找OEP

参考文献就是加密解密3,算是整合一下自己的学习记录吧,方便以后看

脱壳:程序总有自己的初始入口点(OEP),可以为了保护或者是隐藏性破坏,会给程序加上一层壳,这样当你分析带壳的程序时,访问的入口点就不会是OEP,分析程序的时候可以能出吧外壳里的一大堆混淆或者其余代码段读入,导致无法清晰的分析。那么就需要脱壳了,显然第一步就是要找到OEP

我们先自己给程序加个壳

初始程序链接:https://pan.baidu.com/s/1b2tZlKSv-A-DnxKMNHymxQ 密码:lp1d

加壳器链接:https://pan.baidu.com/s/1VCHLbJPok96xtpBdK29U2g 密码:a530

我们加玩壳后比较一下RVA,可以看到地址明显不同,用LordPE就可以看见没加壳前是1130h,加壳后如下

脱壳学习记录----EXE找OEP

并且还多了一个区段,应该就是加壳加上去的

脱壳学习记录----EXE找OEP

1.方法一:跨区跳转

执行完外壳后,带壳程序总要跳回主代码段执行的,那么我们可以在区段上设置断点(即跳转时就会停止),那么停止的地方就是真正的OEP,试一下

直接OD中加载程序,Alt+M打开内存,在text区段设置访问断点

脱壳学习记录----EXE找OEP

运行后停止在了一个奇怪的地方00413145,不知道是啥,但肯定不是OEP

后来经过搜集,了解到程序会对代码段解压完毕,在跳到主程序,毕竟如果是压缩壳之类的,区段的位置可能会发生变化,那么第一次停止的地方应该就是解压执行段,我们先离开这个函数,再次设置内存访问断点

当然还有个方法是别的地方参考来的,更方便一点,就是直接先设置非代码区段的断点执行后,再次设置代码区段的断点,更简洁的二次跳转

跳转成功后,我们可以看到一堆没分析过的

脱壳学习记录----EXE找OEP

Ctrl+A重新分析就好了

2.方法二:堆栈平衡

从外壳加载和脱去的时候,主程序的现场环境都要维持,否则就乱套了,而现场环境维持则意味着寄存器的值需要还原,利用这一特点也可以找到OEP(虽然我更喜欢上一种,但上一种有局限性)

pushad、popad两个指令的作用就是压入或这弹出所有寄存器的值,所以还原现场环境需要关注这两个语句

我们看到加壳后的成句,反汇编后起始就是一个pushad

我们可以看到ESP寄存器执行完pushad后的值,在Command里对该值下硬件断点,在运行程序

脱壳学习记录----EXE找OEP

可以看到OEP就在不远处了