按前面vb5/6程序结构,发现这个程序只有1个form,上面控件放了不少,不过只有一个按钮里面有click事件处理,下断点,跑程序(或者ida直接跑到代码段…要是万一没注意到其他的程序段,没下好断点就亏了,还是看看有多少个程序过程,都给下上断点)…
要直接输入密码,随便输入(要是直接就正确了就成大神了…),点注册按钮,先不管断点了,看看出错有提示没…
提示“兄弟,加油啊!”…有提示就是好,呵呵.
在按下按钮,去断点看看细节:
00404DC0 Form1_Command1_Click_2 proc near ;
00404DC0 var_15C= dword ptr -15Ch
….
….
00404DC0 var_14= dword ptr -14h
00404DC0 var_C= dword ptr -0Ch
00404DC0 var_8= dword ptr -8
00404DC0 var_4= dword ptr -4
00404DC0 arg_0= dword ptr 8
00404DC0 arg_40102C= dword ptr 401034h
00404DC0
00404DC0 push ebp
…
…
00404E0A lea eax, [ebp+var_5CArray1]
00404E0D xor ebx, ebx
00404E0F push offset array1
00404E14 push eax
00404E15 mov [ebp+var_24], ebx
...
00404E08 push 0Ch
....
00404E7B call esi ; __vbaAryConstruct2
00404E7D push 0Ch
00404E7F lea ecx, [ebp+var_88Array2]
00404E85 push offset array2
00404E8A push ecx
00404E8B call esi ; __vbaAryConstruct2
00404E8D push 0Ch
00404E8F lea edx, [ebp+var_B4Array3]
00404E95 push offset array2
00404E9A push edx
00404E9B call esi ; __vbaAryConstruct2
00404E9D mov eax, [ebp+var_7C]
00404E7B call esi ; __vbaAryConstruct2看起来…,
没做过几个破解,算上前面那个,这个才是第四个…还是google看看.
b2eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6u0r3j5X3u0K6K9s2c8E0L8q4)9J5c8V1u0n7f1K6k6Q4x3V1k6H3k6h3c8A6P5e0j5^5y4K6S2Q4x3X3g2Z5N6r3#2Q4c8e0S2Q4b7V1k6Q4z5e0W2Q4c8e0W2Q4z5o6N6Q4z5p5y4Q4c8e0k6Q4z5f1y4Q4z5o6W2Q4c8e0g2Q4z5o6W2Q4z5p5c8Q4c8e0c8Q4b7V1q4Q4b7V1q4Q4c8e0N6Q4b7V1u0Q4z5e0W2Q4c8e0k6Q4z5o6S2Q4z5e0q4Q4c8e0c8Q4b7V1u0Q4b7f1y4Q4c8e0g2Q4z5o6N6Q4z5o6k6Q4c8e0g2Q4b7e0c8Q4z5o6N6Q4c8e0g2Q4b7e0g2Q4b7V1c8Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0S2Q4b7U0g2Q4z5o6c8Q4c8e0k6Q4z5e0k6Q4z5e0W2Q4x3V1y4Q4c8e0k6Q4z5o6c8Q4z5f1k6Q4c8e0S2Q4b7U0m8Q4b7e0u0y4k6h3&6Y4e0r3!0F1k6H3`.`.
调用几个esi ; __vbaAryConstruct2之后,看看之前入栈的参数: ebp+var_5C, ebp+var_88, ebp+var_B4,正是__vbaAryConstruct2调用前最好入栈的,vb一般的返回值哦,按MengLong说的,去这些变量看看,正是数组的结构: 你看到的地址也许和这个不同…堆栈嘛…每次都不一样
Stack[000006C8]:0012F4AC dd 8920001h
Stack[000006C8]:0012F4B0 dd 10h ;MengLong没说这里是什么..我觉得是元素长度,元素可以是type呀
Stack[000006C8]:0012F4B4 dd 0
Stack[000006C8]:0012F4B8 dd offset unk_1588C8
Stack[000006C8]:0012F4BC dd 0Bh
Stack[000006C8]:0012F4C0 dd 0
Stack[000006C8]:0012F4C4 dd 0
其实那里就是元素的字节长度,因为后面的操作可以看出来,定义的就是3个variant数组…
几下数组的结构,知道ebp+var_5C的地址+C就是数组的数据了,那么这些数组的数据地址分别是ebp+var_50,ebp+var_7C, ebp+var_A8,这几个地址后面会用到….额,给这几个地址起个名字不错,寄存器会显示名字的…又懒一次…
.text:00404E9D mov eax, [ebp+var_7C] ;额,访问数组了,数组数据地址到eax
.text:00404EA0 mov esi, ds:__vbaVarMove
.text:00404EA6 mov edi, 2
.text:00404EAB lea edx, [ebp+var_104]
.text:00404EB1 lea ecx, [eax+10h]; 这里,这里,数组元素下标是0开始的,一个元素是16字节(10H),所以
.text:00404EB4 mov [ebp+var_FC], 71h
.text:00404EBE mov [ebp+var_104], edi
.text:00404EC4 call esi ; __vbaVarMove
ecx, [eax+10h]; 这里,这里,数组元素下标是0开始的,一个元素是16字节(10H),所以eax+10H的地址正是下标1的元素
看mov [ebp+var_FC], 71h和mov [ebp+var_104], edi
varian变量赋值类型2,integer类型,值71H,然后用__vbaVarMove给数组里面下标1元素赋值…
8次赋值之后,去看看这个数组的内容,是:
Dim var88(0 to 8) as variant
var88(1) = &H71
var88(2) = &H18
var88(3) = &H59
var88(4) = &H1B
var88(5) = &H79
var88(6) = &H42
var88(7) = &H45
var88(8) = &H4C
继续…F8:
.text:00404F9B lea edx, [ebp+var_104]
.text:00404FA1 lea ecx, [ebp+var_C8]
.text:00404FA7 mov [ebp+var_FC], offset string_wrong ; 兄弟啊,加油啊
.text:00404FB1 mov [ebp+var_104], 8
.text:00404FBB call ds:__vbaVarCopy
.text:00404FC1 lea edx, [ebp+var_104]
.text:00404FC7 lea ecx, [ebp+var_44]
.text:00404FCA mov [ebp+var_FC], offset string_OK ; 你成功了!能写出注册机吗? 发给我 a474528738@163.com
.text:00404FD4 mov [ebp+var_104], 8
.text:00404FDE call ds:__vbaVarCopy
注意var_104和var_fc,正是给variant赋值类型8,string,值是个地址…开始ida显示不是汉字…后来连猜带蒙带去vb严重,才弄了注释的字符串出来…ida不好好干活…
好吧, ebp+var_C8和ebp+var_44这两个变量是我们控制的重点..
出现:
.text:00404FF8 call ds:__vbaObjSet
.text:00405000 lea edx, [ebp+var_CC]
….
.text:0040500E call dword ptr [ecx+0A0h]
看看var_cc,是输入的密码.var_cc也是个string变量,地址指向的地方是个unicode字符串…
.text:00405032 mov eax, [ebp+var_CC]
.text:00405038 lea edx, [ebp+var_E4]
.text:0040503E lea ecx, [ebp+var_34]
.text:00405041 mov [ebp+var_CC], ebx
.text:00405047 mov [ebp+var_DC], eax
.text:0040504D mov [ebp+var_E4], 8
.text:00405057 call esi ; __vbaVarMove
先eax=字符串地址,然后[ebp+var_DC]= eax,并且有[ebp+var_E4], 8
前面说过variant是16字节,4个dword,第一个dd是类型,第三个dd是值,..DC和E4相差正好C…var_E4是个variant,值=var_cc, __vbaVarMove把variant值做了传递,var_34=var_e4=var_cc(类型转换不说了..)
.text:00405065 lea edx, [ebp+var_34]
.text:00405068 lea eax, [ebp+var_E4]
.text:0040506E push edx
.text:0040506F push eax
.text:00405070 mov [ebp+var_FC], 8
.text:0040507A mov [ebp+var_104], 8002h
.text:00405084 call ds:__vbaLenVar
取var_34,就是密码了.长度,注意又给var_104赋值了,看着又是variant,=8
后面:
.text:0040508A lea ecx, [ebp+var_104]
.text:00405090 push eax
.text:00405091 push ecx
.text:00405092 call ds:__vbaVarTstNe; var_104=var_e4=len(password)=8???
call ds:__vbaLenVar的返回值,放在var_e4里面,var_e4的地址也同时在eax,后面直接就push eax了
.text:0040509B jz short loc_405106 ; 条件1 长度>8
如果长度不等于8就跳了…还是回去,输个长度是8的密码…继续下去:
.text:0040515A call ds:__vbaVarForInit
到这里…这个.FroInit,看着好像for …next,自己去vb写个for…next,然后在看看编译的程序…
开始也不知道入栈那么多参数做什么,后面看到了这个:
.text:0040528F lea ecx, [ebp+var_15C]
.text:00405295 lea edx, [ebp+var_14C]
.text:0040529B push ecx
.text:0040529C lea eax, [ebp+var_24]
.text:0040529F push edx
.text:004052A0 push eax.text:004052A1 call ds:__vbaVarForNext ; var_15c=8,var_14c=1
.text:004052A1 ; for var_24=var14c to var_15c
.text:004052A1 ; netx var_24
.text:004052A1 ; 如果循环就另eax=1
总算能明白些了.
下来的程序当时做了太多注释…直接贴:
.text:00405160 loc_405160: ; CODE XREF: Form1_Command1_Click_2+4E9 j
.text:00405160 cmp eax, ebx
.text:00405162 jz loc_4052AE ; if eax=0 then exit for else 继续循环
.text:00405168 lea eax, [ebp+var_E4]
.text:0040516E lea ecx, [ebp+var_24]
.text:00405171 push eax
.text:00405172 push ecx
.text:00405173 mov [ebp+var_DC], 1
.text:0040517D mov [ebp+var_E4], edi ; var_e4=1
.text:00405183 call ds:__vbaI4Var
.text:00405189 push eax
.text:0040518A lea edx, [ebp+var_34]
.text:0040518D lea eax, [ebp+var_F4]
.text:00405193 push edx
.text:00405194 push eax
.text:00405195 call ds:rtcMidCharVar ; var_f4=mid(var_34,var_24,var_e4)
.text:0040519B push edi
.text:0040519C call ds:__vbaStrI2 ; eax=cstr(edi)=cstr(2)
.text:004051A2 mov edx, eax
.text:004051A4 lea ecx, [ebp+var_D0]
.text:004051AA call ds:__vbaStrMove ; var_D0=eax
.text:004051B0 push eax
.text:004051B1 call ds:rtcAnsiValueBstr ; eax=asc(var_D0)
.text:004051B7 lea ecx, [ebp+var_F4]
.text:004051BD lea edx, [ebp+var_CC]
.text:004051C3 push ecx
.text:004051C4 push edx
.text:004051C5 mov bx, ax ; bx=ax=asc(var_D0)=asc(Cstr(2))
.text:004051C8 call ds:__vbaStrVarVal
.text:004051CE push eax
.text:004051CF call ds:rtcAnsiValueBstr ; eax=asc(var_F4)
.text:004051D5 xor ebx, eax ; ebx=ebx xor eax
.text:004051D5 ; =asc(cstr(2)) xor asc(mid(var_34,var_24,1))
.text:004051D7 lea eax, [ebp+var_24]
.text:004051DA push eax
.text:004051DB mov word ptr [ebp+var_10C], bx ; var_114=bx= ... xor ...
.text:004051E2 mov [ebp+var_114], edi
.text:004051E8 call ds:__vbaI4Var
.text:004051EE mov ebx, eax
.text:004051F0 cmp ebx, 0Bh ; 下标是不是超出范围了
.text:004051F3 jb short loc_4051FB ; ecx=ebx=eax=var_24
.text:004051F5 call ds:__vbaGenerateBoundsError
.text:004051FB
.text:004051FB loc_4051FB: ; CODE XREF: Form1_Command1_Click_2+433 j
.text:004051FB mov ecx, ebx ; ecx=ebx=eax=var_24
.text:004051FD mov ebx, [ebp+var_50] ; ebx=var_5CArray1Dat
.text:00405200 shl ecx, 4
.text:00405203 lea edx, [ebp+var_114]
.text:00405209 add ecx, ebx
.text:0040520B call esi ; __vbaVarMove ; var_5Carray1(var_24)=var_114
.text:0040520D lea ecx, [ebp+var_D0]
.text:00405213 lea edx, [ebp+var_CC]
.text:00405219 push ecx
.text:0040521A push edx
.text:0040521B push edi
.text:0040521C call ds:__vbaFreeStrList
.text:00405222 lea eax, [ebp+var_F4]
.text:00405228 lea ecx, [ebp+var_E4]
.text:0040522E push eax
.text:0040522F push ecx
.text:00405230 push edi
.text:00405231 call ds:__vbaFreeVarList
.text:00405237 add esp, 18h
.text:0040523A lea edx, [ebp+var_24]
.text:0040523D push edx
.text:0040523E call ds:__vbaI4Var
.text:00405244 mov ebx, eax ; EBX=EAX=VAR_24
.text:00405246 cmp ebx, 0Bh ; 是不是超出下标范围
.text:00405249 jb short loc_405251
.text:0040524B call ds:__vbaGenerateBoundsError
.text:00405251
.text:00405251 loc_405251: ; CODE XREF: Form1_Command1_Click_2+489 j
.text:00405251 lea eax, [ebp+var_24]
.text:00405254 push eax
.text:00405255 call ds:__vbaI4Var
.text:0040525B cmp eax, 9 ; EAX=VAR_24
.text:0040525E mov [ebp+var_134], eax ; VAR_134=VAR_24
.text:00405264 jb short loc_405272 ; ECX=VAR_5CARRAY_DATA
.text:00405266 call ds:__vbaGenerateBoundsError
.text:0040526C mov eax, [ebp+var_134]
.text:00405272
.text:00405272 loc_405272: ; CODE XREF: Form1_Command1_Click_2+4A4 j
.text:00405272 mov ecx, [ebp+var_50] ; ECX=VAR_5CARRAY_DATA
.text:00405275 mov edx, ebx ; EDX=EBX=VAR_24
.text:00405277 mov ebx, [ebp+var_A8] ; EBX=VAR_B4ARRAY_DATA
.text:0040527D shl edx, 4
.text:00405280 add edx, ecx ; edx=addressof var_5cArray1(var_24)
.text:00405282 mov ecx, eax ; ECX=EAX=VAR_24
.text:00405284 shl ecx, 4
.text:00405287 add ecx, ebx ; ecx=addressof var_b4array1(var_24)
.text:00405289 call ds:__vbaVarCopy ; var_B4Array(var_24)=var_5CArray(var_24)
.text:0040528F lea ecx, [ebp+var_15C]
.text:00405295 lea edx, [ebp+var_14C]
.text:0040529B push ecx
.text:0040529C lea eax, [ebp+var_24]
.text:0040529F push edx
.text:004052A0 push eax
.text:004052A1 call ds:__vbaVarForNext ; var_15c=8,var_14c=1
.text:004052A1 ; for var_24=var14c to var_15c
.text:004052A1 ; netx var_24
.text:004052A1 ; 如果循环就另eax=1
.text:004052A7 xor ebx, ebx
.text:004052A9 jmp loc_405160
一个完整的for..next循环:不解释了,
For i = 1 To 8
var5C(i) = Asc(Mid(strPs, i, 1))
var5C(i) = var5C(i) Xor int2
varB4(i) = var5C(i)
Next i
.text:004052AE loc_4052AE: ; CODE XREF: Form1_Command1_Click_2+3A2 j
.text:004052AE mov ebx, 1
.text:004052B3 lea edx, [ebp+var_104]
.text:004052B9 lea ecx, [ebp+var_24]
.text:004052BC mov [ebp+var_FC], ebx
.text:004052C2 mov [ebp+var_104], edi ; VAR_104=1
.text:004052C8 call esi ; __vbaVarMove ; VAR24=VAR_104=1
.text:004052CA lea edx, [ebp+var_104]
.text:004052D0 lea ecx, [ebp+var_9C]
.text:004052D6 mov [ebp+var_FC], ebx
.text:004052DC mov [ebp+var_104], edi
.text:004052E2 call esi ; __vbaVarMove ; VAR_9C=VAR_104=1
.text:004052E4
.text:004052E4 loc_4052E4: ; CODE XREF: Form1_Command1_Click_2+660 j
.text:004052E4 mov ebx, ds:__vbaI4Var
.text:004052EA lea ecx, [ebp+var_24]
.text:004052ED push ecx
.text:004052EE call ebx ; __vbaI4Var ; EAX=VAR_24
.text:004052F0 cmp eax, 0Bh
.text:004052F3 mov [ebp+var_138], eax ; VAR_138=EAX=VAR_24
.text:004052F9 jb short loc_405301
.text:004052FB call ds:__vbaGenerateBoundsError
.text:00405301
.text:00405301 loc_405301: ; CODE XREF: Form1_Command1_Click_2+539 j
.text:00405301 lea edx, [ebp+var_24]
.text:00405304 lea eax, [ebp+var_104]
.text:0040530A push edx
.text:0040530B lea ecx, [ebp+var_E4]
.text:00405311 push eax
.text:00405312 push ecx
.text:00405313 mov [ebp+var_FC], 1
.text:0040531D mov [ebp+var_104], edi ; VAR_104=1
.text:00405323 call ds:__vbaVarAdd ; VAR_E4=VAR_104+VAR_24
.text:00405329 push eax
.text:0040532A call ebx ; __vbaI4Var
.text:0040532C mov ebx, eax ; EBX=EAX=VAR_24+VAR_104
.text:0040532E cmp ebx, 0Bh
.text:00405331 jb short loc_405339
.text:00405333 call ds:__vbaGenerateBoundsError
.text:00405339
.text:00405339 loc_405339: ; CODE XREF: Form1_Command1_Click_2+571 j
.text:00405339 lea edx, [ebp+var_9C]
.text:0040533F push edx
.text:00405340 call ds:__vbaI4Var ; EAX=VAR_9C
.text:00405346 cmp eax, 0Bh
.text:00405349 mov [ebp+var_134], eax ; VAR_134=EAX=VAR_9C
.text:0040534F jb short loc_405357 ; ECX=VAR_138
.text:00405351 call ds:__vbaGenerateBoundsError
.text:00405357
.text:00405357 loc_405357: ; CODE XREF: Form1_Command1_Click_2+58F j
.text:00405357 mov ecx, [ebp+var_138] ; ECX=VAR_138
.text:0040535D mov eax, [ebp+var_50] ; EAX=VAR_5CVARRAY1DAT
.text:00405360 shl ecx, 4 ; VAR_138
.text:00405363 shl ebx, 4 ; EBX=VAR_24+VAR_104
.text:00405366 add ecx, eax ; ecx=VAR_5CARRAY(VAR_138)
.text:00405368 add ebx, eax ; EBX=VAR_5CARRAY(VAR_24+VAR_104)
.text:0040536A push ecx ; ECX=ADDRESSOF VAR_5CARRAY1(VAR_138)
.text:0040536B lea eax, [ebp+var_F4]
.text:00405371 push ebx ; EBX=ADDRESSOF VAR_5CARRAY1(VAR_24+VAR_104)
.text:00405372 push eax
.text:00405373 call ds:__vbaVarXor ; VAR_F4= VAR_5CARRAY1(VAR_138) XOR VAR_5CARRAY1(VAR_24+VAR_104)
.text:00405373 ; EAX=VAR_F4
.text:00405379 mov ecx, [ebp+var_134] ; ECX=VAR_134
.text:0040537F mov ebx, [ebp+var_50] ; EBX=VAR_5CARRAY1
.text:00405382 shl ecx, 4
.text:00405385 mov edx, eax ; EDX=EAX=VAR_F4
.text:00405387 add ecx, ebx ; ECX=ADDRESSOF VAR_5CARRAY1(VAR_134)
.text:00405389 call esi ; __vbaVarMove ; VAR_5CARRAY1(VAR_134)=VAR_F4
.text:0040538B lea ecx, [ebp+var_E4]
.text:00405391 call ds:__vbaFreeVar
.text:00405397 mov ebx, ds:__vbaVarAdd
.text:0040539D lea ecx, [ebp+var_24]
.text:004053A0 lea edx, [ebp+var_104]
.text:004053A6 push ecx
.text:004053A7 lea eax, [ebp+var_E4]
.text:004053AD push edx
.text:004053AE push eax
.text:004053AF mov [ebp+var_FC], edi ; VAR_104=2
.text:004053B5 mov [ebp+var_104], edi
.text:004053BB call ebx ; __vbaVarAdd ; VAR_E4=VAR_24 + VAR_104
.text:004053BD mov edx, eax ; EDX=VAR_E4
.text:004053BF lea ecx, [ebp+var_24]
.text:004053C2 call esi ; __vbaVarMove ; VAR_24=VAR_E4
.text:004053C4 lea ecx, [ebp+var_9C]
.text:004053CA lea edx, [ebp+var_104]
.text:004053D0 push ecx
.text:004053D1 lea eax, [ebp+var_E4]
.text:004053D7 push edx
.text:004053D8 push eax
.text:004053D9 mov [ebp+var_FC], 1 ; VAR_104=1
.text:004053E3 mov [ebp+var_104], edi
.text:004053E9 call ebx ; __vbaVarAdd ; VAR_E4=VAR_9C + VAR_104
.text:004053EB mov edx, eax
.text:004053ED lea ecx, [ebp+var_9C]
.text:004053F3 call esi ; __vbaVarMove ; VAR_9C=VAR_E4
.text:004053F5 lea ecx, [ebp+var_9C]
.text:004053FB lea edx, [ebp+var_104]
.text:00405401 push ecx
.text:00405402 push edx
.text:00405403 mov [ebp+var_FC], 4
.text:0040540D mov [ebp+var_104], 8002h ; VAR_104=4
.text:00405417 call ds:__vbaVarTstGt ; VAR_104>VAR_9C?
.text:0040541D test ax, ax
.text:00405420 jz loc_4052E4
.text:00405426 mov eax, [ebp+var_50] ; EAX=VAR_5CARRAY
.text:00405429 mov ebx, ds:__vbaVarXor
.text:0040542F lea edx, [ebp+var_E4]
.text:00405435 lea ecx, [eax+10h] ; ECX=VAR_5CARRAY(1)
.text:00405438 add eax, 20h ; EAX=VAR_5CARRAY(2)
.text:0040543B push ecx
.text:0040543C push eax
.text:0040543D push edx
.text:0040543E call ebx ; __vbaVarXor ; VAR_E4=VAR_5CARRAY(1) XOR VAR_5CARRAY(2)
.text:00405440 mov edx, eax ; EDX=EAX=VAR_E4
.text:00405442 mov eax, [ebp+var_50]
.text:00405445 lea ecx, [eax+10h] ; ECX=VAR_5CARRAY(1)
.text:00405448 call esi ; __vbaVarMove ; VAR_5CARRAY(1)=VAR_E4
.text:0040544A mov eax, [ebp+var_50]
.text:0040544D lea edx, [ebp+var_E4]
.text:00405453 lea ecx, [eax+30h] ; ECX=VAR_5CARRAY(3)
.text:00405456 add eax, 40h ; EAX=VAR_5CARRAY(4)
.text:00405459 push ecx
.text:0040545A push eax
.text:0040545B push edx
.text:0040545C call ebx ; __vbaVarXor ; VAR_E4=VAR_5CARRAY(4) XOR VAR_5CARRAY(3)
.text:0040545E mov edx, eax ; VAR_E4
.text:00405460 mov eax, [ebp+var_50]
.text:00405463 lea ecx, [eax+20h] ; VAR_5CARRAY(2)
.text:00405466 call esi ; __vbaVarMove ; VAR_5CARRAY(2)=VAR_E4
.text:00405468 mov eax, [ebp+var_50]
.text:0040546B lea edx, [ebp+var_E4]
.text:00405471 lea ecx, [eax+10h]
.text:00405474 add eax, 20h
.text:00405477 push ecx
.text:00405478 push eax
.text:00405479 push edx
.text:0040547A call ebx ; __vbaVarXor ; VAR_E4=VAR_5CARRAY(1) XOR VAR_5CARRAY(2)
.text:0040547C mov edx, eax ; EAX=VAR_E4
.text:0040547E lea ecx, [ebp+var_70]
.text:00405481 call esi ; __vbaVarMove ; VAR_70=VAR_E4
.text:00405483 lea edx, [ebp+var_104]
.text:00405489 lea ecx, [ebp+var_24]
.text:0040548C mov [ebp+var_FC], 1
.text:00405496 mov [ebp+var_104], edi ; VAR_104=1
.text:0040549C call esi ; __vbaVarMove ; VAR_24=VAR_104=1
.text:0040549E
.text:0040549E loc_40549E: ; CODE XREF: Form1_Command1_Click_2+796 j
.text:0040549E lea eax, [ebp+var_24]
.text:004054A1 push eax
.text:004054A2 call ds:__vbaI4Var
.text:004054A8 mov ebx, eax ; EBX=EAX=VAR_24
.text:004054AA cmp ebx, 9 ; VAR_24<9
.text:004054AD jb short loc_4054B5
.text:004054AF call ds:__vbaGenerateBoundsError
.text:004054B5
.text:004054B5 loc_4054B5: ; CODE XREF: Form1_Command1_Click_2+6ED j
.text:004054B5 lea ecx, [ebp+var_24]
.text:004054B8 push ecx
.text:004054B9 call ds:__vbaI4Var
.text:004054BF cmp eax, 0Bh ; VAR_24<&HB
.text:004054C2 mov [ebp+var_134], eax ; var_134=var_24
.text:004054C8 jb short loc_4054D0 ; EAX=VAR_B4ARRAY3
.text:004054CA call ds:__vbaGenerateBoundsError
.text:004054D0
.text:004054D0 loc_4054D0: ; CODE XREF: Form1_Command1_Click_2+708 j
.text:004054D0 mov eax, [ebp+var_A8] ; EAX=VAR_B4ARRAY3
.text:004054D6 lea edx, [ebp+var_70]
.text:004054D9 shl ebx, 4 ; ebx=var_24
.text:004054DC add ebx, eax ; VAR_B4ARRAY3(VAR_70)
.text:004054DE push edx
.text:004054DF lea eax, [ebp+var_E4]
.text:004054E5 push ebx
.text:004054E6 push eax
.text:004054E7 call ds:__vbaVarXor ; VAR_E4=VAR_B4ARRAY3(VAR_24) XOR VAR_70
.text:004054E7 ; EAX=VAR_E4
.text:004054ED mov ecx, [ebp+var_134]
.text:004054F3 mov ebx, [ebp+var_50]
.text:004054F6 shl ecx, 4
.text:004054F9 mov edx, eax ; EDX=EAX=VAR_E4
.text:004054FB add ecx, ebx ; ECX=VAR_5CARRAY1(VAR_134)
.text:004054FD call esi ; __vbaVarMove ; VAR_5CARRAY1(VAR_134)=VAR_E4
.text:004054FF lea ecx, [ebp+var_24]
.text:00405502 lea edx, [ebp+var_104]
.text:00405508 push ecx
.text:00405509 lea eax, [ebp+var_E4]
.text:0040550F push edx
.text:00405510 push eax
.text:00405511 mov [ebp+var_FC], 1
.text:0040551B mov [ebp+var_104], edi ; VAR_104=1
.text:00405521 call ds:__vbaVarAdd ; VAR_E4=VAR_104 + VAR_24
.text:00405527 mov edx, eax
.text:00405529 lea ecx, [ebp+var_24]
.text:0040552C call esi ; __vbaVarMove ; VAR_24=VAR_E4
.text:0040552E lea ecx, [ebp+var_24]
.text:00405531 lea edx, [ebp+var_104]
.text:00405537 push ecx
.text:00405538 push edx
.text:00405539 mov [ebp+var_FC], 8 ; VAR_104=8
.text:00405543 mov [ebp+var_104], 8002h
.text:0040554D call ds:__vbaVarTstGt ; VAR_104>VAR_24?
.text:00405553 test ax, ax
.text:00405556 jz loc_40549E
.text:0040555C lea edx, [ebp+var_104]
.text:00405562 lea ecx, [ebp+var_24]
.text:00405565 mov [ebp+var_FC], 1
.text:0040556F mov [ebp+var_104], edi
.text:00405575 call esi ; __vbaVarMove ; VAR_24=VAR_104=1
.text:00405577 lea edx, [ebp+var_104]
.text:0040557D lea ecx, [ebp+var_70]
.text:00405580 mov [ebp+var_FC], 0
.text:0040558A mov [ebp+var_104], edi
.text:00405590 call esi ; __vbaVarMove ; VAR_70=VAR_104=0
.text:00405592
.text:00405592 loc_405592: ; CODE XREF: Form1_Command1_Click_2+8AD j
.text:00405592 mov ebx, ds:__vbaI4Var
.text:00405598 lea eax, [ebp+var_24]
.text:0040559B push eax
.text:0040559C call ebx ; __vbaI4Var
.text:0040559E cmp eax, 0Bh ; VAR_24>B?
.text:004055A1 mov [ebp+var_134], eax ; VAR_134=VAR_24
.text:004055A7 jb short loc_4055AF
.text:004055A9 call ds:__vbaGenerateBoundsError
.text:004055AF
.text:004055AF loc_4055AF: ; CODE XREF: Form1_Command1_Click_2+7E7 j
.text:004055AF lea ecx, [ebp+var_24]
.text:004055B2 push ecx
.text:004055B3 call ebx ; __vbaI4Var
.text:004055B5 mov ebx, eax
.text:004055B7 cmp ebx, 9 ; EBX=VAR_24>9?
.text:004055BA jb short loc_4055C2 ; EAX=VAR_134
.text:004055BC call ds:__vbaGenerateBoundsError
.text:004055C2
.text:004055C2 loc_4055C2: ; CODE XREF: Form1_Command1_Click_2+7FA j
.text:004055C2 mov eax, [ebp+var_134] ; EAX=VAR_134
.text:004055C8 mov ecx, [ebp+var_50] ; ECX=VAR_5CARRAY
.text:004055CB shl eax, 4
.text:004055CE add eax, ecx ; EAX=VAR_5CARRAY(VAR_134)
.text:004055D0 push eax
.text:004055D1 mov eax, [ebp+var_7C] ; EAX=VAR_88ARRAY
.text:004055D4 shl ebx, 4 ; EBX=VAR_24
.text:004055D7 add ebx, eax ; EBX=VAR_88ARRY(VAR_24)
.text:004055D9 push ebx
.text:004055DA call ds:__vbaVarTstNe ; VAR_5CARRY(VAR_134)=VAR88ARRY(VAR_24)?
.text:004055E0 test ax, ax
.text:004055E3 jnz loc_405673
.text:004055E9 mov ebx, ds:__vbaVarAdd
.text:004055EF lea edx, [ebp+var_24]
.text:004055F2 lea eax, [ebp+var_104]
.text:004055F8 push edx
.text:004055F9 lea ecx, [ebp+var_E4]
.text:004055FF push eax
.text:00405600 push ecx
.text:00405601 mov [ebp+var_FC], 1
.text:0040560B mov [ebp+var_104], edi ; VAR_104=1
.text:00405611 call ebx ; __vbaVarAdd ; VAR_E4=VAR_24 ADD VAR_104
.text:00405613 mov edx, eax
.text:00405615 lea ecx, [ebp+var_24]
.text:00405618 call esi ; __vbaVarMove ; VAR_24=VAR_E4
.text:0040561A lea edx, [ebp+var_70]
.text:0040561D lea eax, [ebp+var_104]
.text:00405623 push edx
.text:00405624 lea ecx, [ebp+var_E4]
.text:0040562A push eax
.text:0040562B push ecx
.text:0040562C mov [ebp+var_FC], 1 ; VAR_104=1
.text:00405636 mov [ebp+var_104], edi
.text:0040563C call ebx ; __vbaVarAdd ; VAR_E4=VAR_70 + VAR_104
.text:0040563E mov edx, eax
.text:00405640 lea ecx, [ebp+var_70]
.text:00405643 call esi ; __vbaVarMove ; VAR_70=VAR_E4
.text:00405645 lea edx, [ebp+var_24]
.text:00405648 lea eax, [ebp+var_104]
.text:0040564E push edx
.text:0040564F push eax
.text:00405650 mov [ebp+var_FC], 8
.text:0040565A mov [ebp+var_104], 8002h ; VAR_104=8
.text:00405664 call ds:__vbaVarTstGt ; VAR_104>VAR_24
.text:0040566A test ax, ax
.text:0040566D jz loc_405592
.text:00405673
.text:00405673 loc_405673: ; CODE XREF: Form1_Command1_Click_2+823 j
.text:00405673 lea ecx, [ebp+var_70]
.text:00405676 lea edx, [ebp+var_104]
.text:0040567C push ecx
.text:0040567D push edx
.text:0040567E mov [ebp+var_FC], 8
.text:00405688 mov [ebp+var_104], 8002h
.text:00405692 call ds:__vbaVarTstEq
.text:00405698 test ax, ax
.text:0040569B mov eax, [ebp+arg_0]
.text:0040569E jz short loc_4056D9
.text:004056A0 mov ecx, [eax]
.text:004056A2 push eax
.text:004056A3 call dword ptr [ecx+308h]
.text:004056A9 lea edx, [ebp+var_D4]
.text:004056AF push eax
.text:004056B0 push edx
.text:004056B1 call ds:__vbaObjSet
.text:004056B7 mov esi, eax
.text:004056B9 lea eax, [ebp+var_44] ; success msgbox
.text:004056BC lea ecx, [ebp+var_CC]
.text:004056C2 push eax
.text:004056C3 mov edi, [esi]
.text:004056C5 push ecx
.text:004056C6 call ds:__vbaStrVarVal
.text:004056CC push eax
.text:004056CD push esi
.text:004056CE call dword ptr [edi+54h]
整个程序对应的vb,不完全和原程序相同,只追求逻辑相同..
Dim str2 As String
str2 = "2"
Dim var5C(1 To 8) As Integer
Dim var88(1 To 8) As Integer
Dim varB4(1 To 8) As Integer
Dim i As Long
Dim int2 As Integer
int2 = Asc(str2)
var88(1) = &H71
var88(2) = &H18
var88(3) = &H59
var88(4) = &H1B
var88(5) = &H79
var88(6) = &H42
var88(7) = &H45
var88(8) = &H4C
For i = 1 To 8
var5C(i) = ps(i) ' Asc(Mid(strPs, i, 1))
var5C(i) = var5C(i) Xor int2
varB4(i) = var5C(i)
Next i
Dim j, k
For i = 1 To 4
j = (i - 1) * 2 + 1
k = (i - 1) * 2 + 2
var5C(i) = var5C(j) Xor var5C(k)
Next i
var5C(1) = var5C(1) Xor var5C(2)
var5C(2) = var5C(3) Xor var5C(4)
var5C(1) = var5C(1) Xor var5C(2)
Dim var70 As Integer
var70 = var5C(1)
For i = 1 To 8
var5C(i) = varB4(i) Xor var70
Next i
然后就是比较var5C和var88是不是完全相同,完全相同就成功…
写注册程序就…
假定注册码的8个位分别是abcdefgh.
我们知道,
a xor b=b xor a
a xor b xor c=c xor b xor a
a xor a=0
0 xor a=a
通过xor的特性,做下面的表格,表格是excel的,懒的输入xor了,用.代替xor…表格里面的数值都是hex

最后的等式是a.32=18.59.1b.79.42.45.4c,等式的右边少了&H71,就是var88(1)
最后,假设 temp= &H71 xor &H18 xor &H59 xor &H1B xor &H79 xor &H42 xor &H45 xor &H4C
那么就有:
int2=asc("2")
a = temp Xor var88(1) Xor int2
b = temp Xor var88(2) Xor int2
c = temp Xor var88(3) Xor int2
d = temp Xor var88(4) Xor int2
e = temp Xor var88(5) Xor int2
f = temp Xor var88(6) Xor int2
g = temp Xor var88(7) Xor int2
h = temp xor var88(8) Xor int2
这样注册码就算出来是Z3r0Ring
int2=asc("2")
var70 = 0: For j = 1 To 8: var70 = var70 Xor var88(j): Next j: Debug.Print Hex(var70)
For i = 1 To 8
ps(i) = var70 Xor var88(i) Xor int2
Next i
For i = 1 To 8
Debug.Print Chr(ps(i));
Next i