菜鸡的偷学MoleBox壳脱壳

上午搞到一个MoleBox壳的小程序,下面就来介绍一下这种壳应该怎么脱

将程序用od加载,进去的界面是这样的,有没有很熟悉?pushad,对的,先来个esp大法
菜鸡的偷学MoleBox壳脱壳
菜鸡的偷学MoleBox壳脱壳
已经看到pushad了,说明壳代码已经执行过一次了,那么如果没有多层的壳,下一个call很有可能就是oep,这里,很幸运,call eax进去的就是oep,f7跟进,尝试在此处脱壳(记住oep的值00046C6D,后续有用)
菜鸡的偷学MoleBox壳脱壳

用iat修复dump出来的文件时,会发现有一些无效的api,先不管他,把无效的删除,直接修正试一试,发现程序崩了。
菜鸡的偷学MoleBox壳脱壳菜鸡的偷学MoleBox壳脱壳
这说明我们的iat修复出了问题,此时你有两种方法去解决它
1.还记得刚才哪个iat修复工具上面显示的无效指针吗,第一个的rva为66178,我们可以看到,这段内存周围还有很多正常解读的函数。
菜鸡的偷学MoleBox壳脱壳
还有一种方法也能找到这个地址,还记得刚刚在od找到的oep吗,跟着下面代码看,可以发现有一个call,哪个call就是去获取iat的,跟随那里的地址,也能找到这里
菜鸡的偷学MoleBox壳脱壳
选一个异常的函数,对其下硬件访问断点,清除原来的断点,然后f9.(f9之前在数据窗口跟随刚刚下断点的地址,盯着他的数据看)
菜鸡的偷学MoleBox壳脱壳
在多次f9之后,我们发现此地址变成了一个api函数的地址
菜鸡的偷学MoleBox壳脱壳
此时,准备单步跟着走
菜鸡的偷学MoleBox壳脱壳
跟进这个call,继续单步
菜鸡的偷学MoleBox壳脱壳
这说明iat的改变就是因为这个赋值的过程导致的,那么要解决这个问题有两种方法:一是将图中方框处赋值语句下硬件访问断点,然后重新执行nop掉该语句;二是修改该汇编代码前面的一个跳转,个人觉得nop更好一点。
菜鸡的偷学MoleBox壳脱壳
然后删除硬件断点,跳转到oep的位置,下个断点,f9到oep,再次按照常规脱壳方式脱壳即可。
菜鸡的偷学MoleBox壳脱壳
菜鸡的偷学MoleBox壳脱壳
菜鸡的偷学MoleBox壳脱壳