象棋桥V2.1算法分析!
软件名称:象棋桥V2.1作者:brightsm
使用工具:OD,PEID
操作系统:win2k
l软件下载地址:http://xibuden.vicp.net/pyg.rar
下断点:
用OD载入CCbriage主程序。
在主线程窗口下按CTRL+N,可以看到些程序用了USER32.messageboxa这个系统API来弹出错误信息。
按ALT+E切到模块窗口,选中user32.dll这个模块,双击,查看此模块,再按CTRL+N,弹出此模块的函数表,输入MESSAGEBOXA,光标跑到这个函数的上面,双击此函数,按F2下断点!
按F9运行这个程序,在主窗口中有个“注册”的按扭,点此按扭,会出现注册的窗口,在用户名中填入“brightsm”,注册码中填入“CCB21R-80671”,程序到弹出错误信息时被断下!
按CTRL+F9(功能是运行到一个子程序的最后一行,中间有断点则会停在断点处,再按一下F8,程序就会执行一行代码,返回到上级调用的程序里面,这个用的很多,希望兄弟们要牢记),F8回到CCbriage的程序空间,可以看到,上一行就是弹出错误消息的地方,在上一行按F2下断,并清除在user32.dll中下的断点。
按上一下F8,使程序运行一行,按两下CTRL+F9,再按一下F8,光标会跑到调用这个错误信息的上一个程序区域里面!向上看一行,就是调用出错信息的CALL。
0051E5D5 .8B0D A4655300 mov ecx,dword ptr ds: ;CCBridge.00546B7C
0051E5DB .8B89 58050000 mov ecx,dword ptr ds:
0051E5E1 .8D45 DC lea eax,dword ptr ss:
0051E5E4 .BA 10E75100 mov edx,CCBridge.0051E710 ;ASCII "mailto:[email protected]?subject="
0051E5E9 .E8 2E59EEFF call CCBridge.00403F1C
0051E5EE .8B45 DC mov eax,dword ptr ss:
0051E5F1 .E8 9256F6FF call CCBridge.00483C88
0051E5F6 .EB 22 jmp short CCBridge.0051E61A
0051E5F8 >6A 10 push 10
0051E5FA .8B0D A4655300 mov ecx,dword ptr ds: ;CCBridge.00546B7C
0051E600 .8B89 4C020000 mov ecx,dword ptr ds:
0051E606 .8B15 A4655300 mov edx,dword ptr ds: ;CCBridge.00546B7C
0051E60C .8B92 48020000 mov edx,dword ptr ds:
0051E612 .8B45 FC mov eax,dword ptr ss:
0051E615 .E8 6232FEFF call CCBridge.0050187C 光标跑到这儿,这就是调用出错子程序的CALL,向上看就是程序注册的区域了!
使用用户名:brightsm
注册码:CCB21R-80671 进行注册
向上看:
0051E39A .E8 7D5CF1FF call CCBridge.0043401C
0051E39F .8B45 E8 mov eax,dword ptr ss: ;取得用户名!
0051E3A2 .8D55 F4 lea edx,dword ptr ss:
0051E3A5 .E8 42A5EEFF call CCBridge.004088EC
0051E3AA .B3 01 mov bl,1
0051E3AC .8B45 F4 mov eax,dword ptr ss:
0051E3AF .E8 1C5BEEFF call CCBridge.00403ED0 ;取用户名的长度!
0051E3B4 .83F8 0C cmp eax,0C
0051E3B7 .75 60 jnz short CCBridge.0051E419
0051E3B9 .8D45 F0 lea eax,dword ptr ss:
0051E3BC .8B55 F4 mov edx,dword ptr ss:
0051E3BF .E8 2459EEFF call CCBridge.00403CE8 ;取最后5位
0051E3C4 .8D45 F0 lea eax,dword ptr ss:
0051E3C7 .B9 07000000 mov ecx,7
0051E3CC .BA 01000000 mov edx,1
0051E3D1 .E8 425DEEFF call CCBridge.00404118 ;取最后5位
0051E3D6 .8D45 F4 lea eax,dword ptr ss:
0051E3D9 .B9 05000000 mov ecx,5
0051E3DE .BA 08000000 mov edx,8
0051E3E3 .E8 305DEEFF call CCBridge.00404118 ;取前7位
0051E3E8 .8B45 F4 mov eax,dword ptr ss:
0051E3EB .BA 70E65100 mov edx,CCBridge.0051E670 ;ASCII "CCB21R-"
0051E3F0 .E8 EB5BEEFF call CCBridge.00403FE0 ;前7位是否是ccb21r-?
0051E3F5 .75 1E jnz short CCBridge.0051E415 如果不是则进行下一步判断。
0051E3F7 .8D55 E4 lea edx,dword ptr ss:
0051E3FA .8B45 FC mov eax,dword ptr ss:
0051E3FD .8B80 70090000 mov eax,dword ptr ds: ;输入参数“用户名”,用于计算最后五位注册码!
0051E403 .E8 5462F6FF call CCBridge.0048465C ;计算注册码,最后五位注册码计算的关键CALL
0051E408 .8B55 E4 mov edx,dword ptr ss:
0051E40B .8B45 F0 mov eax,dword ptr ss:
0051E40E .E8 CD5BEEFF call CCBridge.00403FE0 ;最后的5位是否是80672?
0051E413 .74 06 je short CCBridge.0051E41B
0051E415 > |33DB xor ebx,ebx
0051E417 . |EB 02 jmp short CCBridge.0051E41B
0051E419 > |33DB xor ebx,ebx
0051E41B > \84DB test bl,bl
0051E41D 0F84 11010000 je CCBridge.0051E534
0051E423 .8B45 FC mov eax,dword ptr ss:
0051E426 .C680 84090000 01 mov byte ptr ds:,1
0051E42D .8B45 FC mov eax,dword ptr ss:
0051E430 .C680 85090000 00 mov byte ptr ds:,0
0051E437 .8B45 FC mov eax,dword ptr ss:
0051E43A .8B80 40090000 mov eax,dword ptr ds:
0051E440 .33D2 xor edx,edx
0051E442 .E8 7597F3FF call CCBridge.00457BBC
0051E447 .8B45 FC mov eax,dword ptr ss:
0051E44A .8B80 B0050000 mov eax,dword ptr ds:
0051E450 .33D2 xor edx,edx
0051E452 .E8 DD5AF1FF call CCBridge.00433F34
0051E457 .8B15 A4655300 mov edx,dword ptr ds: ;CCBridge.00546B7C
0051E45D .8B92 3C020000 mov edx,dword ptr ds:
0051E463 .8B45 FC mov eax,dword ptr ss:
0051E466 .E8 E15BF1FF call CCBridge.0043404C
0051E46B .8B45 FC mov eax,dword ptr ss:
0051E46E .8B80 A0050000 mov eax,dword ptr ds:
0051E474 .33D2 xor edx,edx
0051E476 .E8 B963F2FF call CCBridge.00444834
0051E47B .8B45 FC mov eax,dword ptr ss:
0051E47E .8B80 A4050000 mov eax,dword ptr ds:
0051E484 .33D2 xor edx,edx
0051E486 .E8 A963F2FF call CCBridge.00444834
0051E48B .B2 01 mov dl,1
0051E48D .A1 40434500 mov eax,dword ptr ds:
0051E492 .E8 A95FF3FF call CCBridge.00454440
0051E497 .8945 F8 mov dword ptr ss:,eax
0051E49A .BA 01000080 mov edx,80000001
0051E49F .8B45 F8 mov eax,dword ptr ss:
0051E4A2 .E8 3960F3FF call CCBridge.004544E0
0051E4A7 .33C0 xor eax,eax
0051E4A9 .55 push ebp
0051E4AA .68 F3E45100 push CCBridge.0051E4F3
0051E4AF .64:FF30 push dword ptr fs:
0051E4B2 .64:8920 mov dword ptr fs:,esp
0051E4B5 .B1 01 mov cl,1
0051E4B7 .BA 80E65100 mov edx,CCBridge.0051E680 ;ASCII "Software\ShengYu\CCBridge"
0051E4BC .8B45 F8 mov eax,dword ptr ss:
0051E4BF .E8 8060F3FF call CCBridge.00454544
0051E4C4 .8B45 FC mov eax,dword ptr ss:
0051E4C7 .8B88 70090000 mov ecx,dword ptr ds:
0051E4CD .BA A4E65100 mov edx,CCBridge.0051E6A4 ;ASCII "RegistryName"
0051E4D2 .8B45 F8 mov eax,dword ptr ss:
0051E4D5 .E8 0662F3FF call CCBridge.004546E0
0051E4DA .B1 01 mov cl,1
0051E4DC .BA BCE65100 mov edx,CCBridge.0051E6BC ;ASCII "Reg21OK"
0051E4E1 .8B45 F8 mov eax,dword ptr ss:
0051E4E4 .E8 DF62F3FF call CCBridge.004547C8
0051E4E9 .33C0 xor eax,eax
0051E4EB .5A pop edx
0051E4EC .59 pop ecx
0051E4ED .59 pop ecx
0051E4EE .64:8910 mov dword ptr fs:,edx
0051E4F1 .EB 0A jmp short CCBridge.0051E4FD
0051E4F3 .^ E9 3C4FEEFF jmp CCBridge.00403434
0051E4F8 .E8 9352EEFF call CCBridge.00403790
0051E4FD >8B45 F8 mov eax,dword ptr ss:
0051E500 .E8 AB5FF3FF call CCBridge.004544B0
0051E505 .8B45 F8 mov eax,dword ptr ss:
0051E508 .E8 7B4AEEFF call CCBridge.00402F88
0051E50D .6A 40 push 40
0051E50F .8B0D A4655300 mov ecx,dword ptr ds: ;CCBridge.00546B7C
0051E515 .8B89 44020000 mov ecx,dword ptr ds:
0051E51B .8B15 A4655300 mov edx,dword ptr ds: ;CCBridge.00546B7C
0051E521 .8B92 40020000 mov edx,dword ptr ds:
0051E527 .8B45 FC mov eax,dword ptr ss:
0051E52A .E8 4D33FEFF call CCBridge.0050187C
0051E52F .E9 E6000000 jmp CCBridge.0051E61A
0051E534 >8D55 E0 lea edx,dword ptr ss:
0051E537 .A1 3C915400 mov eax,dword ptr ds:
0051E53C .8B80 E0020000 mov eax,dword ptr ds:
0051E542 .E8 D55AF1FF call CCBridge.0043401C
0051E547 .8B45 E0 mov eax,dword ptr ss:
0051E54A .8D55 F4 lea edx,dword ptr ss:
0051E54D .E8 9AA3EEFF call CCBridge.004088EC
0051E552 .B3 01 mov bl,1
0051E554 .8B45 F4 mov eax,dword ptr ss:
0051E557 .E8 7459EEFF call CCBridge.00403ED0
0051E55C .83F8 0E cmp eax,0E
0051E55F .75 47 jnz short CCBridge.0051E5A8
0051E561 .8B45 F4 mov eax,dword ptr ss:
0051E564 .BA CCE65100 mov edx,CCBridge.0051E6CC ;ASCII "CCB2000R-SHARE"注册码判断是否为CCB2000R-SHARE,是则不能注册!试用的注册码!
0051E569 .E8 725AEEFF call CCBridge.00403FE0
0051E56E .75 02 jnz short CCBridge.0051E572
0051E570 .33DB xor ebx,ebx
0051E572 >8B45 F4 mov eax,dword ptr ss:
0051E575 .BA E4E65100 mov edx,CCBridge.0051E6E4 ;
0051E57A .E8 615AEEFF call CCBridge.00403FE0 ASCII "CCB2000R-12345"注册码判断是否为CCB2000R-12345,是则不能注册!
0051E57F .75 02 jnz short CCBridge.0051E583 不是则跳出“到用主页上获得升级码!”的提示信息!
0051E581 .33DB xor ebx,ebx
0051E583 >8D45 F4 lea eax,dword ptr ss:
0051E586 .B9 05000000 mov ecx,5
0051E58B .BA 0A000000 mov edx,0A
0051E590 .E8 835BEEFF call CCBridge.00404118
0051E595 .8B45 F4 mov eax,dword ptr ss:
0051E598 .BA FCE65100 mov edx,CCBridge.0051E6FC ;ASCII "CCB2000R-"
0051E59D .E8 3E5AEEFF call CCBridge.00403FE0
0051E5A2 74 06 je short CCBridge.0051E5AA
0051E5A4 .33DB xor ebx,ebx
0051E5A6 .EB 02 jmp short CCBridge.0051E5AA
0051E5A8 >33DB xor ebx,ebx
0051E5AA >84DB test bl,bl
0051E5AC 74 4A je short CCBridge.0051E5F8
0051E5AE .6A 34 push 34
0051E5B0 .8B0D A4655300 mov ecx,dword ptr ds: ;CCBridge.00546B7C
0051E5B6 .8B89 54050000 mov ecx,dword ptr ds:
0051E5BC .8B15 A4655300 mov edx,dword ptr ds: ;CCBridge.00546B7C
0051E5C2 .8B92 50050000 mov edx,dword ptr ds:
0051E5C8 .8B45 FC mov eax,dword ptr ss:
0051E5CB .E8 AC32FEFF call CCBridge.0050187C ;
0051E5D0 .83F8 06 cmp eax,6
0051E5D3 75 45 jnz short CCBridge.0051E61A
0051E5D5 .8B0D A4655300 mov ecx,dword ptr ds: ;CCBridge.00546B7C
0051E5DB .8B89 58050000 mov ecx,dword ptr ds:
0051E5E1 .8D45 DC lea eax,dword ptr ss:
0051E5E4 .BA 10E75100 mov edx,CCBridge.0051E710 ;ASCII "mailto:[email protected]?subject="
0051E5E9 .E8 2E59EEFF call CCBridge.00403F1C
0051E5EE .8B45 DC mov eax,dword ptr ss:
0051E5F1 .E8 9256F6FF call CCBridge.00483C88
0051E5F6 .EB 22 jmp short CCBridge.0051E61A
0051E5F8 >6A 10 push 10
0051E5FA .8B0D A4655300 mov ecx,dword ptr ds: ;CCBridge.00546B7C
0051E600 .8B89 4C020000 mov ecx,dword ptr ds:
0051E606 .8B15 A4655300 mov edx,dword ptr ds: ;CCBridge.00546B7C
0051E60C .8B92 48020000 mov edx,dword ptr ds:
0051E612 .8B45 FC mov eax,dword ptr ss:
0051E615 .E8 6232FEFF call CCBridge.0050187C 调用出错信息对话框。
0051E61A >33C0 xor eax,eax
0051E61C .5A pop edx
0051E61D .59 pop ecx
0051E61E .59 pop ecx
0051E61F .64:8910 mov dword ptr fs:,edx
0051E622 .68 61E65100 push CCBridge.0051E661
0051E627 >8D45 DC lea eax,dword ptr ss:
0051E62A .E8 2156EEFF call CCBridge.00403C50
0051E62F .8D45 E0 lea eax,dword ptr ss:
0051E632 .E8 1956EEFF call CCBridge.00403C50
0051E637 .8D45 E4 lea eax,dword ptr ss:
0051E63A .E8 1156EEFF call CCBridge.00403C50
0051E63F .8D45 E8 lea eax,dword ptr ss:
0051E642 .BA 02000000 mov edx,2
0051E647 .E8 2856EEFF call CCBridge.00403C74
0051E64C .8D45 F0 lea eax,dword ptr ss:
0051E64F .BA 02000000 mov edx,2
0051E654 .E8 1B56EEFF call CCBridge.00403C74
0051E659 .C3 retn
0051E65A .^ E9 8950EEFF jmp CCBridge.004036E8
0051E65F .^ EB C6 jmp short CCBridge.0051E627
0051E661 .5F pop edi
0051E662 .5E pop esi
0051E663 .5B pop ebx
0051E664 .8BE5 mov esp,ebp
0051E666 .5D pop ebp
0051E667 .C3 retn
最后五位注册码计算的关键CALL
0048465C/$55 push ebp
0048465D|.8BEC mov ebp,esp
0048465F|.83C4 F0 add esp,-10
00484662|.53 push ebx
00484663|.56 push esi
00484664|.57 push edi
00484665|.33C9 xor ecx,ecx
00484667|.894D F4 mov dword ptr ss:,ecx
0048466A|.8955 F8 mov dword ptr ss:,edx
0048466D|.8945 FC mov dword ptr ss:,eax
00484670|.8B45 FC mov eax,dword ptr ss:
00484673|.E8 0CFAF7FF call CCBridge.00404084
00484678|.33C0 xor eax,eax
0048467A|.55 push ebp
0048467B|.68 48474800 push CCBridge.00484748
00484680|.64:FF30 push dword ptr fs:
00484683|.64:8920 mov dword ptr fs:,esp
00484686|.8D45 F4 lea eax,dword ptr ss:
00484689|.8B55 FC mov edx,dword ptr ss:
0048468C|.E8 57F6F7FF call CCBridge.00403CE8
00484691|.8B45 F4 mov eax,dword ptr ss:
00484694|.E8 37F8F7FF call CCBridge.00403ED0 ;取用户名的长度
00484699|.40 inc eax
0048469A|.8BD8 mov ebx,eax
0048469C|.83FB 05 cmp ebx,5
0048469F|.7F 13 jg short CCBridge.004846B4 ;长度大于5则进行用户名剪切
004846A1|>8D45 F4 /lea eax,dword ptr ss:
004846A4|.BA 60474800 |mov edx,CCBridge.00484760
004846A9|.E8 2AF8F7FF |call CCBridge.00403ED8 ;长度小于5则进行用户名后两位填充空格
004846AE|.43 |inc ebx
004846AF|.83FB 06 |cmp ebx,6
004846B2|.^ 75 ED \jnz short CCBridge.004846A1
004846B4|>8B45 F4 mov eax,dword ptr ss: ;开始剪切,字符串的首对地址进入EAX
004846B7|.33C9 xor ecx,ecx ;cx=0
004846B9|.8A08 mov cl,byte ptr ds: ;"b"->cl
004846BB|.8B45 F4 mov eax,dword ptr ss: ;用户名字符串的首对地址进入EAX
004846BE|.33DB xor ebx,ebx ;bx=0
004846C0|.8A58 01 mov bl,byte ptr ds: ;"r"->bl
004846C3|.8B45 F4 mov eax,dword ptr ss: ;字符串的首对地址进入EAX
004846C6|.0FB670 02 movzx esi,byte ptr ds: ;"i"->esi
004846CA|.8B45 F4 mov eax,dword ptr ss: ;字符串的首对地址进入EAX
004846CD|.0FB678 03 movzx edi,byte ptr ds: ;"g"->edi
004846D1|.8B45 F4 mov eax,dword ptr ss: ;字符串的首对地址进入EAX
004846D4|.0FB640 04 movzx eax,byte ptr ds: ;"h"->eax
004846D8|.8945 F0 mov dword ptr ss:,eax
004846DB|.8D040B lea eax,dword ptr ds: ;eax=ASC("b")+ASC("r") 用户名第一位的ASC值与第二位的ASC值进行相加
004846DE|.03FE add edi,esi ;EDI=asc("i")+asc("g") 用户名第三位的ASC值与第四位的ASC值进行相加
004846E0|.F7EF imul edi ;EAX=EAX*EDI 前两个结果相乘
004846E2|.F76D F0 imul dword ptr ss: ;EAX=EAX*ASC("h") 再与用户名的第五位ASC值相乘
004846E5|.B9 A0860100 mov ecx,186A0 ;ECX=100000D 常数100000D
004846EA|.99 cdq ;将EAX转成无符号数
004846EB|.F7F9 idiv ecx ;EAX=EAX/ECXEDX为余数,而且是注册码向上数三行的结果除以常数取余数就是注册码的最后五位
004846ED|.8BDA mov ebx,edx
004846EF|.8D55 F4 lea edx,dword ptr ss:
004846F2|.8BC3 mov eax,ebx
004846F4|.E8 B745F8FF call CCBridge.00408CB0 ;注册码已生成
004846F9|.8B45 F4 mov eax,dword ptr ss:
004846FC|.E8 CFF7F7FF call CCBridge.00403ED0 ;取生成的注册码长度,
00484701|.40 inc eax
00484702|.8BD8 mov ebx,eax
00484704|.83FB 05 cmp ebx,5
00484707 7F 16 jg short CCBridge.0048471F ;若大于5,则进行剪切!
00484709|>8D45 F4 /lea eax,dword ptr ss:
0048470C|.8B4D F4 |mov ecx,dword ptr ss:
0048470F|.BA 6C474800 |mov edx,CCBridge.0048476C
00484714|.E8 03F8F7FF |call CCBridge.00403F1C
00484719|.43 |inc ebx
0048471A|.83FB 06 |cmp ebx,6
0048471D|.^ 75 EA \jnz short CCBridge.00484709
0048471F|>8B45 F8 mov eax,dword ptr ss:
00484722|.8B55 F4 mov edx,dword ptr ss:
00484725|.E8 7AF5F7FF call CCBridge.00403CA4
0048472A|.33C0 xor eax,eax
0048472C|.5A pop edx
0048472D|.59 pop ecx
0048472E|.59 pop ecx
0048472F|.64:8910 mov dword ptr fs:,edx
00484732|.68 4F474800 push CCBridge.0048474F
00484737|>8D45 F4 lea eax,dword ptr ss:
0048473A|.E8 11F5F7FF call CCBridge.00403C50
0048473F|.8D45 FC lea eax,dword ptr ss:
00484742|.E8 09F5F7FF call CCBridge.00403C50
00484747\.C3 retn
00484748 .^ E9 9BEFF7FF jmp CCBridge.004036E8
0048474D .^ EB E8 jmp short CCBridge.00484737
0048474F .5F pop edi
00484750 .5E pop esi
00484751 .5B pop ebx
00484752 .8BE5 mov esp,ebp
00484754 .5D pop ebp
00484755 .C3 retn
注册机原码:
Private Sub Command1_Click()
Dim na1 As Long
Dim na2 As Long
Dim na3 As Long
Dim na4 As Long
Dim na5 As Long
Dim z1 As Long
Dim z2 As Long
Dim z3 As Long
Dim key As Long
Dim cs As Long
cs = 100000
jkg:If Len(username.Text) < 5 Then
MsgBox "用户名不足5位,系统将用空格帮助你补齐5位!"
username.Text = username.Text + Chr(32)
GoTo jkg
End If
On Error GoTo exitsub
na1 = Asc(Mid(username.Text, 1))
na2 = Asc(Mid(username.Text, 2))
na3 = Asc(Mid(username.Text, 3))
na4 = Asc(Mid(username.Text, 4))
na5 = Asc(Mid(username.Text, 5))
z1 = na1 + na2
z2 = na3 + na4
z3 = z1 * z2 * na5
key = Int(z3 / cs)
key = z3 - key * cs
code.Text = "CCB21R-" + Str(key)
Exit Sub
exitsub:
MsgBox "运行出错!请重新输入用户名!"
End Sub
[ Last edited by brightsm on 2005-7-8 at 10:57 AM ] 不错~ 思路清晰~ 加精了!
建议优化一下注册机源码~ 好文!支持的说。 大家可以优化一下,主要是让刚入门的兄弟看的更清楚一点! 不错的说,特别是下断点的部分,写的很清楚。好文~ 分析的好! 高手啊~!!!!!!分析的好!
页:
[1]