VB程序的调试

前端之家收集整理的这篇文章主要介绍了VB程序的调试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

3.VB程序的调试

由于VB会把程序编译成解释型(http://zh.wikipedia.org/wiki/VB_%E4%BC%AA%E4%BB%A3%E7%A0%81)或者P-Code(http://en.wikipedia.org/wiki/Microsoft_P-Code),所以它的执行方式有点奇怪,它要通过MSVBVM60.DLL才可以解释运行,而一般VB程序的入口都是如下代码

004011E0 >/$ 68 24134000 push 00401324 ; (initial cpu selection)
004011E5 |. E8 EEFFFFFF call <jmp.&MSVBVM60.#100>

这次示例程序也不例外,那么怎么调试它呢?如果你单步走的话你会发现这个程序一会儿在EXE领空,一会儿在DLL领空(http://www.unpack.cn/archiver/tid-46130.html),很是麻烦,有两种方法可以快速调试它。

本文来自www.sacour.cn 转载注明来源

第一种:由于VB程序是基于Unicode的,所以可以右键点击代码区,选择“Ultra String Reference”-“2 Find UNICODE”,然后找到对应的UNICODE字符,再移动到该段代码的第一句(1002.HTML中有提到,即表示为$的语句)下断点,运行程序。

第二种:右键点击代码区,选择“Analysis”-“Analysis code”,

然后按下Ctrl+M,右键点击“Search”-ascii中输入“vb6chs.dll”,然后Search,记下此字符出现的地址,然后回到代码窗口,按下Ctrl+G,进入此地址,往下翻找到类似

00401454 /2C184000 dd 工程1.0040182C ; ASCII "Form"

的地址,然后其后面一个dd xxx.xxxxxx即为Form_Load函数

找到以后,

0040145C /FC144000 dd 工程1.004014FC

在这儿按Enter键,调到4014FC,

004014FC . /E9 0F060000 jmp 00401B10

再按Enter键,到达Form_Load函数内,在此按F2,然后F9运行:

00401B10 > \55 push ebp

接着就可以调试了,过程都很简单,1002已经说过了,这儿稍微列一下VB使用的函数

00401B4F . FF52 04 call dword ptr [edx+4] ; MSVBVM60.Zombie_AddRef

这个是用来处理对象引用(Object Reference)的函数

00401B7B . FF15 48104000 call dword ptr [<&MSVBVM60.__vbaFixst>; MSVBVM60.__vbaFixstrConstruct

这句是因为我使用了Dim x As String * 256这一固定长度字符串而出现的,它就是处理固定长度字串的函数

继续往下走,可以看到:

00401C84 . E8 5FFCFFFF call 004018E8

这儿可以按F7进入

004018E8 $ A1 DC324000 mov eax,dword ptr [4032DC]
004018ED . 0BC0 or eax,eax
004018EF . 74 02 je short 004018F3
004018F1 . FFE0 jmp eax
004018F3 > 68 D0184000 push 004018D0
004018F8 . B8 60114000 mov eax,<jmp.&MSVBVM60.DllFunctionC>
004018FD . FFD0 call eax ; <jmp.&MSVBVM60.DllFunctionCall>
004018FF .- FFE0 jmp eax ; kernel32.GetModuleFileNameA

可以看到这就是VB调用函数方法,可以跟进看看,跟进系统函数以后,可以使用菜单栏的Debug-Execute till return返回

函数

00401C9D . FF15 5C104000 call dword ptr [<&MSVBVM60.__vbaStrTo>; MSVBVM60.__vbaStrToUnicode

则是把ANSI字串转为Unicode用的。

00401CA9 . FF15 18104000 call dword ptr [<&MSVBVM60.__vbaLsetF>; MSVBVM60.__vbaLsetFixstr

则是对应String函数

00401D49 . FF15 7C104000 call dword ptr [<&MSVBVM60.__vbaStrCo>; MSVBVM60.__vbaStrCopy

这个就是简单的“=”操作符

00401D50 . FF15 14104000 call dword ptr [<&MSVBVM60.#519>] ; MSVBVM60.rtcTrimBstr

这个对应Trim函数

00401D10 . FF15 28104000 call dword ptr [<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox

这个对应MsgBox函数

其他的调试方法都类似C++程序的方法,不过调试的时候应该多注意一下堆栈,很多信息都是在这里面表现出来的。

猜你在找的VB相关文章