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] |