VB程序的调试

6 篇文章 0 订阅

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++程序的方法,不过调试的时候应该多注意一下堆栈,很多信息都是在这里面表现出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值