VB程序的脱壳技巧

自己来解决吧,也许能搞出个自创的方法,叫什么Monster脱壳法。
在这里大家必须了解一引些小知识。
VB程序的启动方式:每个VB程序通常都会调用到许多的API,但是其中有一个API是雷


打不动的,这就是我们都知道的ThunRTMain函数。VB程序在运行时,都会首先调用


ThunRTMain函数,ThunRTMain函数将会为程序初始化进程,并获取进程ID等做一些


初始工作。
栈帧:每个任务(进程)都有一个栈,而在这个进程中的每个函数被调用时会分别从


这个栈中分出一段区域并占用它,这段区域我们称它为栈帧
函数调用:每一个函数独占自己的栈帧空间,当前正在运行的函数的栈帧总是在系统


栈的顶端,在程序运行时当遇到一个call指令,程序会自动跳到这个call指定所指的


的地址去执行指令,这时call所指向的地址处的指令的开头一般是这样的:
push ebp ; 保存调用前的栈桢基址到堆栈
mov ebp, esp ; 把当前堆栈栈顶当做新栈桢基址
其实在做这个动作之前,call指令已经做了另一个动作,就是把call指令下面一条指


令的地址作为被调用函数的返回地址也一起压入了栈中,等到程序遇到retn指令时,


首先从栈中弹出返回地址,并跳到返回地址处执行指令。
现在,我们首先打开VB,做出一个简单的测试程序


接着我们再运行OD,把刚做出来的测试程序载入到OD中,这时我们就可以看到程序停


在了这里


大家看这里的代码:
00401128 > $ 68 9C124000 push 0040129C
0040112D . E8 F0FFFFFF call
00401132 . 0000 add byte ptr [eax], al
对于一般来说,如果是用VB做的程序,那么它的的入口点基本都是这样的,我们再来


看看第二句的call,这里的call调用了一个函数,但是这到


底是个什么样的函数呢?我们在OD中按Ctrl+N打开程序的输入表看看


第一行就是这个MSVBVM60.#100函数,我们选中这一行后按回车,然后代码就来到了


这里


嘿嘿,原来#100就是ThunRTMain函数啊。
我们来用OD跟踪一下程序,因为第二句就是一个call,所以我们要使用F7跟进这个


call,这时,我们只需要F7一下就好,现在,我们来注意一下OD堆栈窗口中的数据


堆栈窗口中的第一句就是“0012FFBC 00401132 返回到无壳.00401132来自


”,这是的00401132是什么呢?从上面的图2中,我可以发现


,这就是ThunRTMain函数的返回地址,但是00401128才是我们程序的入口点,从


ThunRTMain函数的返回地址和程序入口点的关系,我们可以得出这样一个公式:
程序入口点=ThunRTMain函数的返回地址-AH(AH就是十进制的10)
根据上面所得出的结论,我们现在可以进行脱壳了。
实战篇
现在我们给程序加个ASPack的外壳


把加了壳后的新文件载入OD,接着在OD的命令行窗口中输入BP ThunRTMain,回车,


给ThunRTMain函数下个断点


接着再按F9让程序在OD中运行起来,OD就会被断在
这时就要发挥我们明锐的洞察能力了,嘿嘿,现在我们再来看一下OD右下角的堆栈窗


口中的内容


我们看第一行,0012FFBC这里的数据,是00401132,后面的说明是“返回到加


壳.00401132来自加壳.00401122”,这里告诉我们的地址00401132就应该是


ThunRTMain函数的返回地址了,现在我们再回过头来看看上面的图2,00401132的确


就是ThunRTMain函数的返回地址,我们现在想对程序进行脱壳,就需要知道程序的入


口点,根据我们上面得出的那个公式我们来计算一下:
程序OEP=00401132-AH
00401132-AH=00401128
最后我们得出的程序的入口点就是00401128,现在我们知道了程序的入口点,我们只


要把他DUMP出来就可以了,但是因为现在我们的OD正处于msvbvm60的领空,现在我们


DUMP是不合适的,我们必须先返回到程序的领空,我们在OD中按Alt+F9就可以完成这


一步骤,等OD返回程序的领空后,我们在OD的反汇编窗口中点击鼠标右键选择“Dump 


debugger process”


接着在弹出的窗口中把Modify这一框中的内容改为程序的入口点地址


现在我们只要把程序从内在中给DUMP出来就可以了,用PEID 来检测一下我们DUMP 后


的文件


运行一下,脱壳成功。

你可能感兴趣的:(加壳脱壳)