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