头部背景图片
senrenbankaの部落格 |
senrenbankaの部落格 |

记一次小软件脱壳

目标: 跑跑排行榜1.9.exe
界面: 跑跑排行榜-界面

首先用PEID查壳,得知是tELock v0.98的壳:
跑跑排行榜-查壳

首先,愉快地打开OD:
跑跑排行榜-OD初始界面

直接F9,到第一次异常发生的地方:
跑跑排行榜-第一次F9

可以看到上面有个pushad,一开始是打算用esp定律的,无奈这方法不管用,程序直接跑飞(事实上还是可以用到esp的),跑飞点在下面的这句

0042C001  F9 call 跑跑排行.0042C009

此时可以选择单步进入,然后单步跟踪,但是过程很复杂,所以这里不采用单步跟踪的思路,用追踪异常的方法:在第一次F9之后,到了第一个异常点,这时候我们shift+f9,就是忽略异常执行,然后会停在下一个异常点,我们不断重复此步骤,最终到程序执行为止。不过事实上,这个程序在到下面这个地方后,再shift+f9就飞到了系统领空了,并且这个领空用alt+f9是出不来的,所以我认为这个地方是最后一个异常点(说来奇怪,我在这个异常点shift+f9居然还是在这个地方,再按一次才跑到系统领空):
跑跑排行榜-最后一次异常点1

查看此时堆栈段情况:
跑跑排行榜-最后一次异常1-堆栈

易知0042CDF4处理这个异常的函数,那么在这个地方下断点,然后shift+f9过掉它:
跑跑排行榜-最后一次异常1-绕过

然后就是漫长的单步,最后到了本次脱壳的又一个关键点:
跑跑排行榜-最后一次异常1-关键跳转

如图所示,这个jmp跳转很大,可能是OEP,第一次我试着跳了,结果发现是个死循环,出不去的,于是我判断这个跳转是不能跳的,那么尝试f4到下面:
跑跑排行榜-最后一次异常2

怎么有种似曾相识的感觉QAQ,这不是刚才的那个异常点么,再看下堆栈,SE处理程序是0042D7FD,哦,怪不得我刚才第一次在0042D819处shift+f9还是这里,这里应该是发生了两次异常,而且处理异常的函数是不同的,那么我们在0042D7FD下断点,shift+f9再次绕过这个异常,然后经过一系列的单步,到了OEP跳转点:
跑跑排行榜-OEP跳转

愉快的f8到了OEP,妥妥的VC++6.0程序:

跑跑排行版-OEP

然后就是脱壳了,这里用OD的脱壳方法是不行的,因为有很多指针是没有修复的,所以先上LORD PE转存,然后用Import REC修复:

跑跑排行榜-修复1

Import REC先用tElock v0.98 的3级追踪修复一堆指针,剩余的几个反汇编看了下,没什么用,就是垃圾指针,所以剪切掉:

跑跑排行榜-修复2

跑跑排行榜-修复3

dump掉,再用PEID查壳:
跑跑排行榜-脱壳后-查壳

完成。

avatar AONOSORA 今生今世轮回尽, 来世愿为幻想乡