VB程序的脱壳技巧

前端之家收集整理的这篇文章主要介绍了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 <jmp.&MSVBVM60.#100> 00401132 . 0000 add byte ptr [eax],al 对于一般来说,如果是用VB做的程序,那么它的的入口点基本都是这样的,我们再来 看看第二句的call,这里的call调用了一个函数<jmp.&MSVBVM60.#100>,但是这到 底是个什么样的函数呢?我们在OD中按Ctrl+N打开程序的输入表看看 第一行就是这个MSVBVM60.#100函数,我们选中这一行后按回车,然后代码就来到了 这里 嘿嘿,原来#100就是ThunRTMain函数啊。 我们来用OD跟踪一下程序,因为第二句就是一个call,所以我们要使用F7跟进这个 call,这时,我们只需要F7一下就好,现在,我们来注意一下OD堆栈窗口中的数据 堆栈窗口中的第一句就是“0012FFBC 00401132 返回到无壳.00401132来自 <jmp.&MSVBVM60.#100>”,这是的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 后 的文件 运行一下,脱壳成功。

猜你在找的VB相关文章