打印本文 打印本文 关闭窗口 关闭窗口
关于VB中数据的存储格式和寻址方式
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2025  更新时间:2009/4/23 15:42:23  文章录入:mintao  责任编辑:mintao
p;    push esi :00401DC2 52                      push edx * Reference To: MSVBVM60.rtcMsgBox, Ord:0253h                                   | :00401DC3 FF1528104000            Call dword ptr [00401028]  ;出现成功对话框

很明显的比较方式,用SoftICE跟一下,胡乱输入1111,中断在401D51处,可是当D eax,D ecx时只能看到08
:d eax
016F:0063F3EC 08 00 00 00 00 00 4A 21-CC 0F 51 00 86 72 6F 17  ......J!..Q..ro.
016F:0063F3FC F4 F8 63 00 B6 10 40 00-34 F3 63 00 A0 10 40 00  ..c...@.4.c...@.
016F:0063F40C 01 00 00 00 1C F4 63 00-73 AD 02 66 CC 05 51 00  ......c.s..f..Q.
:d ecx
016F:0063F3DC 08 00 00 00 36 18 76 8B-E0 0F 51 00 0C 00 0D 00  ....6.v...Q.....
016F:0063F3EC 08 00 00 00 00 00 4A 21-CC 0F 51 00 86 72 6F 17  ......J!..Q..ro.
016F:0063F3FC F4 F8 63 00 B6 10 40 00-34 F3 63 00 A0 10 40 00  ..c...@.4.c...@.
当然不可能是把两个08比较,实际的UNICODE字串地址是在8个字节后的地方。即510FCC和510FE0
:d 510fcc
016F:00510FCC 52 00 6F 00 42 00 61 00-00 00 00 00 14 00 00 A0  R.o.B.a.........
016F:00510FDC 08 00 00 00 31 00 31 00-31 00 31 00 00 00 00 00  ....1.1.1.1.....
016F:00510FEC 11 00 00 A0 1C 00 41 00-0C 00 41 00 EC 0F 51 00  ......A...A...Q.
:d 510fe0
016F:00510FE0 31 00 31 00 31 00 31 00-00 00 00 00 11 00 00 A0  1.1.1.1.........
016F:00510FF0 1C 00 41 00 0C 00 41 00-EC 0F 51 00 02 00 00 A0  ..A...A...Q.....
016F:00511000 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ................
那么08是什么意思呢?为什么EAX,ECX要指向这么一个莫名其妙的值呢?我猜想那个08就是表示Varient的实际类型,换一个类型试试:
代码:
Private Sub Command1_Click() Dim b As Variant b = Text1.Text If b = 5678 Then MsgBox "Well done!", vbOKOnly, "Crack" End If End Sub

代码:
:00401D13 50                      push eax :00401D14 51                      push ecx :00401D15 C7857CFFFFFF2E160000    mov dword ptr [ebp+FFFFFF7C], 0000162E ;162Eh=5678 :00401D1F C78574FFFFFF02800000    mov dword ptr [ebp+FFFFFF74], 00008002 ;类型值 * Reference To: MSVBVM60.__vbaVarTstEq, Ord:0000h                                   | :00401D29 FF1540104000            Call dword ptr [00401040] :00401D2F 6685C0                  test ax, ax :00401D32 0F8484000000            je 00401DBC

在401D29时,d eax仍然看到08,d *(eax+8)可以看到我们随意输入的字符串,而d ecx时看到
:d ecx
016F:0063F384 02 80 00 00 66 24 27 06-2E 16 00 00 B0 00 DD 00  ....f$''''.........
016F:0063F394 00 00 00 00 00 00 00 00-00 00 00 00 00 00 08 00  ................
016F:0063F3A4 00 00 00 00 10 DB 01 00-0E 84 D7 3A 00 00 00 00  ...........:....
可以看到02,那么按上面方面类推,ecx+8处是什么呢?162E,呵~~~~,不就是5678的十六进制吗,那么02当然就表示Integer了.(高位的80不知道什么作用,改成00似乎也没有影响)
问题清楚一些了,Variant变量的第一个字节表示数据的实际类型,后面七个字节不知有什么用,在第九个字节处才是数据的值或数据的地址。
我整理出的Variant变量的各种实际类型的代码:
代码:
02  Integer    用d eax+8可以看到,占两字节 03  Long    用d eax+8可以看到,占四字节 04  Single    用ds eax+8可以看到 05  Double    用dl eax+8可以看到 08  String    用d *(eax+8)可以看到 0B  Boolean    用d eax+8可以看到,True为FFFFFFFF 11  Byte    用d eax+8可以看到,占一字节

以后当你D出一个05,08这样的数字时不会再感到莫名其妙了吧。

还是有许多不明白的地方,比如中间的七位到底有什么用,在那些有Var字样的函数内部实现的过程究竟是怎样(我跟进了一个vbaVarAdd发现极其复杂)等等,还请各位大大指出来,帮助我们这些在黑暗中摸索的菜鸟们。

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口