网络黑白棋(翻转棋)2.0注册算法分析
网络黑白棋(翻转棋)2.0注册算法分析网络黑白棋是广泛流行的益智类游戏,又名翻转棋、反棋、奥赛罗棋、苹果棋。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
主要特点:
1、可以进行人机对战,即玩家和电脑对战,您可以和电脑比比智力,可选择电脑的水平等级。
2、可以进行两人游戏,即两个玩家通过网络进行较量,网络对战支持聊天功能。
3、支持悔棋功能,悔棋步数不限;两人通过网络进行对战时,一方要悔棋时需得到对方的回应(即同意)才能悔棋。
4、软件界面极酷,游戏信息和提示显示齐全,操作简单,交互友好。
5、可以随时更换棋盘和棋子的样式。
软件在未注册的状态下,每次退出时会弹出一个NAG提示对话框;先打开注册窗口,输入注册名:aCaFeeL,输入注册码:12345678,点击[完成注册]按钮,程序提示注册失败;确定软件为VB编写并用了tElock 0.98b1 -> tE!加壳,将其脱壳之后,用od载入,按F9键运行程序后,再打开注册窗口,再次输入上面的测试注册名和测试注册码后,下断点: BPx rtcMsgBox,然后点击[完成注册]按钮,此时程序被中断下来,顺着被中断的地方向上查看,发现错误信息是从 0046EDA7 处跳转过来的,于是来到这里后,发现如下的代码:
》》》》》》
(省略...)
0046ED60 .50 push eax
0046ED61 .E8 4AE2FFFF call a.0046CFB0 ;决定了ax的结果,F7进入
0046ED66 .33C9 xor ecx, ecx ;ecx 清零
0046ED68 .66:3D FFFF cmp ax, 0FFFF ;ax 与 0FFFF 比较
0046ED6C .0F94C1 sete cl ;设置cl结果
0046ED6F .F7D9 neg ecx ;对ecx进行取补
0046ED71 .66:898D 38FFFFFF mov word ptr , cx ;-> 中
0046ED78 .8D4D D8 lea ecx, dword ptr
0046ED7B .FF15 A0124000 call dword ptr [<&MSVBVM60.__vbaFreeStr>] ;MSVBVM60.__vbaFreeStr
0046ED81 .8D4D D0 lea ecx, dword ptr
0046ED84 .FF15 9C124000 call dword ptr [<&MSVBVM60.__vbaFreeObj>] ;MSVBVM60.__vbaFreeObj
0046ED8A .66:399D 38FFFFFF cmp word ptr , bx
0046ED91 .B9 04000280 mov ecx, 80020004
0046ED96 .B8 0A000000 mov eax, 0A
0046ED9B .894D 94 mov dword ptr , ecx
0046ED9E .8945 8C mov dword ptr , eax
0046EDA1 .894D A4 mov dword ptr , ecx
0046EDA4 .8945 9C mov dword ptr , eax
0046EDA7 0F84 47050000 je a.0046F2F4 ;这里便是跳向错误的跳转
0046EDAD .8D95 7CFFFFFF lea edx, dword ptr
(省略...)
》》》》》》
从上面可知道,要分析算法,需要进入 0046ED61 地址的:
0046ED61 .E8 4AE2FFFF call a.0046CFB0
在这里再用F2键下断,用OD重新载入程序后,F9键运行,再次重复上面的步骤,便断在了这里,按F7建进入该子程序后:
》》》》》》
0046CFB0 $55 push ebp ;注册算法开始
0046CFB1 .8BEC mov ebp, esp
0046CFB3 .83EC 08 sub esp, 8
0046CFB6 .68 C61F4000 push <a.__vbaExceptHandler>
0046CFBB .64:A1 00000000 mov eax, dword ptr fs:
0046CFC1 .50 push eax
0046CFC2 .64:8925 00000000 mov dword ptr fs:, esp
0046CFC9 .81EC A0000000 sub esp, 0A0
0046CFCF .53 push ebx
0046CFD0 .56 push esi
0046CFD1 .57 push edi
0046CFD2 .8965 F8 mov dword ptr , esp
0046CFD5 .C745 FC 681A4000 mov dword ptr , a.00401A68
0046CFDC .8B75 08 mov esi, dword ptr
0046CFDF .33FF xor edi, edi
0046CFE1 .897D E8 mov dword ptr , edi
0046CFE4 .897D E4 mov dword ptr , edi
0046CFE7 .8B06 mov eax, dword ptr
0046CFE9 .897D D4 mov dword ptr , edi
0046CFEC .50 push eax
0046CFED .897D C4 mov dword ptr , edi
0046CFF0 .897D B4 mov dword ptr , edi
0046CFF3 .897D A4 mov dword ptr , edi
0046CFF6 .897D 94 mov dword ptr , edi
0046CFF9 .897D 84 mov dword ptr , edi
0046CFFC .89BD 74FFFFFF mov dword ptr , edi
0046D002 .FF15 38104000 call dword ptr [<&MSVBVM60.__vbaLenBstr>] ;得到注册码的长度 -> eax
0046D008 .33C9 xor ecx, ecx
0046D00A .83F8 10 cmp eax, 10 ;eax是否为16位
0046D00D .0F94C1 sete cl ;相等,cl设置1
0046D010 .8D55 94 lea edx, dword ptr
0046D013 .6A 06 push 6
0046D015 .8D45 D4 lea eax, dword ptr
0046D018 .52 push edx
0046D019 .F7D9 neg ecx
0046D01B .50 push eax
0046D01C .66:898D 7CFFFFFF mov word ptr , cx
0046D023 .C785 74FFFFFF 0B000000mov dword ptr , 0B ;长度为12(因为是UNICODE)
0046D02D .8975 9C mov dword ptr , esi
0046D030 .C745 94 08400000 mov dword ptr , 4008
0046D037 .FF15 54124000 call dword ptr [<&MSVBVM60.rtcLeftCharVar>];取注册码左边的12/2=6个字符
0046D03D .8D8D 74FFFFFF lea ecx, dword ptr
0046D043 .8D55 D4 lea edx, dword ptr
0046D046 .51 push ecx
0046D047 .8D45 84 lea eax, dword ptr
0046D04A .52 push edx
0046D04B .8D4D C4 lea ecx, dword ptr
0046D04E .50 push eax
0046D04F .51 push ecx
0046D050 .C745 8C 84BF4000 mov dword ptr , a.0040BF84 ;注意a.0040BF84的'BWCV20'
0046D057 .C745 84 08800000 mov dword ptr , 8008
0046D05E .FF15 2C124000 call dword ptr [<&MSVBVM60.__vbaVarCmpEq>] ;注册码左边6位字符是否为'BWCV20'
0046D064 .8D55 B4 lea edx, dword ptr
0046D067 .50 push eax
0046D068 .52 push edx
0046D069 .FF15 54114000 call dword ptr [<&MSVBVM60.__vbaVarAnd>] ;MSVBVM60.__vbaVarAnd
0046D06F .50 push eax
0046D070 .FF15 D8104000 call dword ptr [<&MSVBVM60.__vbaBoolVarNull>>;MSVBVM60.__vbaBoolVarNull
0046D076 .8BD8 mov ebx, eax
0046D078 .8D85 74FFFFFF lea eax, dword ptr
0046D07E .8D4D D4 lea ecx, dword ptr
0046D081 .50 push eax
0046D082 .51 push ecx
0046D083 .6A 02 push 2
0046D085 .FF15 44104000 call dword ptr [<&MSVBVM60.__vbaFreeVarList>>;MSVBVM60.__vbaFreeVarList
0046D08B .83C4 0C add esp, 0C
0046D08E .66:3BDF cmp bx, di
0046D091 0F84 90030000 je a.0046D427 ;没有'BWCV20',则跳走
0046D097 .8B3D E4104000 mov edi, dword ptr [<&MSVBVM60.rtcMidCharVa>;MSVBVM60.rtcMidCharVar
0046D09D .8D55 D4 lea edx, dword ptr
0046D0A0 .52 push edx
0046D0A1 .8D45 94 lea eax, dword ptr
0046D0A4 .6A 07 push 7
0046D0A6 .8D4D C4 lea ecx, dword ptr
0046D0A9 .50 push eax
0046D0AA .51 push ecx
0046D0AB .C745 DC 01000000 mov dword ptr , 1
0046D0B2 .C745 D4 02000000 mov dword ptr , 2 ;长度为2(因为是UNICODE)
0046D0B9 .8975 9C mov dword ptr , esi
0046D0BC .C745 94 08400000 mov dword ptr , 4008
0046D0C3 .FFD7 call edi ;取注册码的2/2=1个字符
0046D0C5 .8B1D AC114000 mov ebx, dword ptr [<&MSVBVM60.__vbaStrVarV>;MSVBVM60.__vbaStrVarVal
0046D0CB .8D55 C4 lea edx, dword ptr
0046D0CE .8D45 E8 lea eax, dword ptr
0046D0D1 .52 push edx
0046D0D2 .50 push eax
0046D0D3 .FFD3 call ebx ;<&MSVBVM60.__vbaStrVarVal>
0046D0D5 .50 push eax ;eax 所指的字符
0046D0D6 .FF15 A4124000 call dword ptr [<&MSVBVM60.rtcR8ValFromBstr>>;第7位字符->实数(ST0)
0046D0DC .DC05 601A4000 fadd qword ptr ;ST0 + 2.000000000000000;
0046D0E2 .DFE0 fstsw ax ;FST -> ax
0046D0E4 .A8 0D test al, 0D ;= OD?
0046D0E6 .0F85 95030000 jnz a.0046D481
0046D0EC .FF15 D4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ;MSVBVM60.__vbaFpR8
0046D0F2 .DC1D 70194000 fcomp qword ptr ;ST0 比较 3.000000000000000;
0046D0F8 .C785 58FFFFFF 01000000mov dword ptr , 1
0046D102 .DFE0 fstsw ax ;FST -> ax
0046D104 .F6C4 40 test ah, 40
0046D107 75 0A jnz short a.0046D113 ;跳
0046D109 .C785 58FFFFFF 00000000mov dword ptr , 0
0046D113 >8D4D B4 lea ecx, dword ptr
0046D116 .8D95 74FFFFFF lea edx, dword ptr
0046D11C .51 push ecx
0046D11D .6A 07 push 7
0046D11F .8D45 A4 lea eax, dword ptr
0046D122 .52 push edx
0046D123 .50 push eax
0046D124 .C745 BC 01000000 mov dword ptr , 1
0046D12B .C745 B4 02000000 mov dword ptr , 2 ;长度为2(因为是UNICODE)
0046D132 .89B5 7CFFFFFF mov dword ptr , esi
0046D138 .C785 74FFFFFF 08400000mov dword ptr , 4008
0046D142 .FFD7 call edi ;取注册码的2/2=1个字符
0046D144 .8D4D A4 lea ecx, dword ptr
0046D147 .8D55 E4 lea edx, dword ptr
0046D14A .51 push ecx
0046D14B .52 push edx
0046D14C .FFD3 call ebx
0046D14E .50 push eax ;eax 所指的字符
0046D14F .FF15 A4124000 call dword ptr [<&MSVBVM60.rtcR8ValFromBstr>>;第7位数值->实数(ST0)
0046D155 .DC25 601A4000 fsub qword ptr ;ST0 - 2.000000000000000;
0046D15B .DFE0 fstsw ax ;FST -> ax
0046D15D .A8 0D test al, 0D
0046D15F .0F85 1C030000 jnz a.0046D481
0046D165 .FF15 D4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ;MSVBVM60.__vbaFpR8
0046D16B .DC1D 70194000 fcomp qword ptr ;ST0 比较 3.000000000000000;
0046D171 .DFE0 fstsw ax
0046D173 .F6C4 40 test ah, 40
0046D176 74 07 je short a.0046D17F
0046D178 .B8 01000000 mov eax, 1
0046D17D .EB 02 jmp short a.0046D181
0046D17F >33C0 xor eax, eax
0046D181 >8B8D 58FFFFFF mov ecx, dword ptr
0046D187 .F7D8 neg eax
0046D189 .F7D9 neg ecx
0046D18B .0BC1 or eax, ecx
0046D18D .8D4D E8 lea ecx, dword ptr
0046D190 .8985 60FFFFFF mov dword ptr , eax
0046D196 .8D45 E4 lea eax, dword ptr
0046D199 .50 push eax
0046D19A .51 push ecx
0046D19B .6A 02 push 2
0046D19D .FF15 08124000 call dword ptr [<&MSVBVM60.__vbaFreeStrList>>;MSVBVM60.__vbaFreeStrList
0046D1A3 .8D55 A4 lea edx, dword ptr
0046D1A6 .8D45 B4 lea eax, dword ptr
0046D1A9 .52 push edx
0046D1AA .8D4D C4 lea ecx, dword ptr
0046D1AD .50 push eax
0046D1AE .8D55 D4 lea edx, dword ptr
0046D1B1 .51 push ecx
0046D1B2 .52 push edx
0046D1B3 .6A 04 push 4
0046D1B5 .FF15 44104000 call dword ptr [<&MSVBVM60.__vbaFreeVarList>>;MSVBVM60.__vbaFreeVarList
0046D1BB .83C4 20 add esp, 20
0046D1BE .66:83BD 60FFFFFF 00 cmp word ptr , 0
0046D1C6 .0F84 5B020000 je a.0046D427
0046D1CC .8D45 D4 lea eax, dword ptr
0046D1CF .8D4D 94 lea ecx, dword ptr
0046D1D2 .50 push eax
0046D1D3 .6A 0A push 0A
0046D1D5 .8D55 C4 lea edx, dword ptr
0046D1D8 .51 push ecx
0046D1D9 .52 push edx
0046D1DA .C745 DC 01000000 mov dword ptr , 1
0046D1E1 .C745 D4 02000000 mov dword ptr , 2 ;长度为2(因为是UNICODE)
0046D1E8 .8975 9C mov dword ptr , esi
0046D1EB .C745 94 08400000 mov dword ptr , 4008
0046D1F2 .FFD7 call edi ;取注册码的2/2=1个字符
0046D1F4 .8D45 C4 lea eax, dword ptr
0046D1F7 .8D4D E8 lea ecx, dword ptr
0046D1FA .50 push eax
0046D1FB .51 push ecx
0046D1FC .FFD3 call ebx
0046D1FE .50 push eax ;eax 所指的字符
0046D1FF .FF15 A4124000 call dword ptr [<&MSVBVM60.rtcR8ValFromBstr>>;第10位数值->实数(ST0)
0046D205 .DC05 601A4000 fadd qword ptr ;ST0 + 2.000000000000000;
0046D20B .DFE0 fstsw ax
0046D20D .A8 0D test al, 0D
0046D20F .0F85 6C020000 jnz a.0046D481
0046D215 .FF15 D4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ;MSVBVM60.__vbaFpR8
0046D21B .DC1D 581A4000 fcomp qword ptr ;ST0 比较 7.000000000000000;
0046D221 .C785 54FFFFFF 01000000mov dword ptr , 1
0046D22B .DFE0 fstsw ax ;FST -> ax
0046D22D .F6C4 40 test ah, 40
0046D230 75 0A jnz short a.0046D23C ;跳
0046D232 .C785 54FFFFFF 00000000mov dword ptr , 0
0046D23C >8D55 B4 lea edx, dword ptr
0046D23F .8D85 74FFFFFF lea eax, dword ptr
0046D245 .52 push edx
0046D246 .6A 0A push 0A
0046D248 .8D4D A4 lea ecx, dword ptr
0046D24B .50 push eax
0046D24C .51 push ecx
0046D24D .C745 BC 01000000 mov dword ptr , 1
0046D254 .C745 B4 02000000 mov dword ptr , 2 ;长度为2(因为是UNICODE)
0046D25B .89B5 7CFFFFFF mov dword ptr , esi
0046D261 .C785 74FFFFFF 08400000mov dword ptr , 4008
0046D26B .FFD7 call edi ;取注册码的2/2=1个字符
0046D26D .8D55 A4 lea edx, dword ptr
0046D270 .8D45 E4 lea eax, dword ptr
0046D273 .52 push edx
0046D274 .50 push eax
0046D275 .FFD3 call ebx
0046D277 .50 push eax ;eax 所指的字符
0046D278 .FF15 A4124000 call dword ptr [<&MSVBVM60.rtcR8ValFromBstr>>;第10位数值->实数(ST0)
0046D27E .DC25 601A4000 fsub qword ptr ;ST0 - 2.000000000000000;
0046D284 .DFE0 fstsw ax ;FST -> ax
0046D286 .A8 0D test al, 0D
0046D288 .0F85 F3010000 jnz a.0046D481
0046D28E .FF15 D4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ;MSVBVM60.__vbaFpR8
0046D294 .DC1D 581A4000 fcomp qword ptr ;ST0 比较 7.000000000000000;
0046D29A .DFE0 fstsw ax ;FST -> ax
0046D29C .F6C4 40 test ah, 40
0046D29F 74 07 je short a.0046D2A8
0046D2A1 .B8 01000000 mov eax, 1
0046D2A6 .EB 02 jmp short a.0046D2AA
0046D2A8 >33C0 xor eax, eax
0046D2AA >8B8D 54FFFFFF mov ecx, dword ptr
0046D2B0 .8D55 E8 lea edx, dword ptr
0046D2B3 .F7D8 neg eax
0046D2B5 .F7D9 neg ecx
0046D2B7 .0BC1 or eax, ecx
0046D2B9 .8D4D E4 lea ecx, dword ptr
0046D2BC .51 push ecx
0046D2BD .52 push edx
0046D2BE .6A 02 push 2
0046D2C0 .8985 60FFFFFF mov dword ptr , eax
0046D2C6 .FF15 08124000 call dword ptr [<&MSVBVM60.__vbaFreeStrList>>;MSVBVM60.__vbaFreeStrList
0046D2CC .8D45 A4 lea eax, dword ptr
0046D2CF .8D4D B4 lea ecx, dword ptr
0046D2D2 .50 push eax
0046D2D3 .8D55 C4 lea edx, dword ptr
0046D2D6 .51 push ecx
0046D2D7 .8D45 D4 lea eax, dword ptr
0046D2DA .52 push edx
0046D2DB .50 push eax
0046D2DC .6A 04 push 4
0046D2DE .FF15 44104000 call dword ptr [<&MSVBVM60.__vbaFreeVarList>>;MSVBVM60.__vbaFreeVarList
0046D2E4 .83C4 20 add esp, 20
0046D2E7 .66:83BD 60FFFFFF 00 cmp word ptr , 0
0046D2EF 0F84 32010000 je a.0046D427
0046D2F5 .8D4D D4 lea ecx, dword ptr
0046D2F8 .8D55 94 lea edx, dword ptr
0046D2FB .51 push ecx
0046D2FC .6A 0F push 0F
0046D2FE .8D45 C4 lea eax, dword ptr
0046D301 .52 push edx
0046D302 .50 push eax
0046D303 .C745 DC 01000000 mov dword ptr , 1
0046D30A .C745 D4 02000000 mov dword ptr , 2 ;长度为2(因为是UNICODE)
0046D311 .8975 9C mov dword ptr , esi
0046D314 .C745 94 08400000 mov dword ptr , 4008
0046D31B .FFD7 call edi ;取注册码的2/2=1个字符
0046D31D .8D4D C4 lea ecx, dword ptr
0046D320 .8D55 E8 lea edx, dword ptr
0046D323 .51 push ecx
0046D324 .52 push edx
0046D325 .FFD3 call ebx
0046D327 .50 push eax ;eax 所指的字符
0046D328 .FF15 A4124000 call dword ptr [<&MSVBVM60.rtcR8ValFromBstr>>;第15位数值->实数(ST0)
0046D32E .DC05 601A4000 fadd qword ptr ;ST0 + 2.000000000000000;
0046D334 .DFE0 fstsw ax ;FST -> ax
0046D336 .A8 0D test al, 0D
0046D338 .0F85 43010000 jnz a.0046D481
0046D33E .FF15 D4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ;MSVBVM60.__vbaFpR8
0046D344 .DC1D 601A4000 fcomp qword ptr ;ST0 与 2.000000000000000 比较
0046D34A .C785 50FFFFFF 01000000mov dword ptr , 1
0046D354 .DFE0 fstsw ax ;FST -> ax
0046D356 .F6C4 40 test ah, 40
0046D359 75 0A jnz short a.0046D365 ;跳
0046D35B .C785 50FFFFFF 00000000mov dword ptr , 0
0046D365 >8D45 B4 lea eax, dword ptr
0046D368 .8D8D 74FFFFFF lea ecx, dword ptr
0046D36E .50 push eax
0046D36F .6A 0F push 0F
0046D371 .8D55 A4 lea edx, dword ptr
0046D374 .51 push ecx
0046D375 .52 push edx
0046D376 .C745 BC 01000000 mov dword ptr , 1
0046D37D .C745 B4 02000000 mov dword ptr , 2 ;长度为2(因为是UNICODE)
0046D384 .89B5 7CFFFFFF mov dword ptr , esi
0046D38A .C785 74FFFFFF 08400000mov dword ptr , 4008
0046D394 .FFD7 call edi ;取注册码的2/2=1个字符
0046D396 .8D45 A4 lea eax, dword ptr
0046D399 .8D4D E4 lea ecx, dword ptr
0046D39C .50 push eax
0046D39D .51 push ecx
0046D39E .FFD3 call ebx
0046D3A0 .50 push eax ;eax 所指的字符
0046D3A1 .FF15 A4124000 call dword ptr [<&MSVBVM60.rtcR8ValFromBstr>>;第15位数值->实数(ST0)
0046D3A7 .DC25 601A4000 fsub qword ptr ;ST0 - 2.000000000000000;
0046D3AD .DFE0 fstsw ax ;FST -> ax
0046D3AF .A8 0D test al, 0D
0046D3B1 .0F85 CA000000 jnz a.0046D481
0046D3B7 .FF15 D4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ;MSVBVM60.__vbaFpR8
0046D3BD .DC1D 601A4000 fcomp qword ptr ;ST0 与 2.000000000000000 比较
0046D3C3 .DFE0 fstsw ax ;FST -> ax
0046D3C5 .F6C4 40 test ah, 40
0046D3C8 74 07 je short a.0046D3D1
0046D3CA .B8 01000000 mov eax, 1
0046D3CF .EB 02 jmp short a.0046D3D3
(省略...)
》》》》》》
通过上面的分析,我们知道了其注册算法的方式为:
注册码的长度是由16个字符组成的;
注册码的前6位字符固定为:BWCV20;
注册码的第 7位数字 + 2 或 -2 的后的结果必须为 3;故注册码的第 7位数字为:1或者5;
注册码的第10位数字 + 2 或 -2 的后的结果必须为 7;故注册码的第10位数字为:5或者9;
注册码的第15位数字 + 2 或 -2 的后的结果必须为 2;故注册码的第15位数字为:0或者4;
剩下的则必须为数字,便可以了。而注册名没有参与运算,呵呵。
放上一组可用的Key:
注册名:aCaFeeL
注册码:BWCV201005000000
好的,就到这里结束吧!最后不要忘了哈:BPD rtcMsgBox,嘿嘿!
页:
[1]