【破文标题】Salazan's KeyGenMe! # 0001算法分析
【破文作者】逍遥风
【破解工具】OD
【破解平台】WINXP
【软件简介】Difficulty: 2 - Needs a little brain (or luck)
Platform: Windows
Language: Borland Delphi
----------------------------------------------------------------------
00456186 |. 55 push ebp ; 在这里下断点
00456187 |. 68 42624500 push 00456242
0045618C |. 64:FF30 push dword ptr fs:[eax]
0045618F |. 64:8920 mov fs:[eax], esp
00456192 |. 8D55 FC lea edx, [ebp-4]
00456195 |. 8B83 F8020000 mov eax, [ebx+2F8]
0045619B |. E8 90CDFDFF call 00432F30 ; 取注册名
004561A0 |. 8B45 FC mov eax, [ebp-4] ; 使EAX等于注册名
004561A3 |. E8 58E3FAFF call 00404500 ; 取注册名位数
004561A8 |. 83F8 03 cmp eax, 3 ; 注册名位数与3比较
004561AB |. 7C 1B jl short 004561C8 ; 注册名小于3位就跳出错误提示
004561AD |. 8D55 F8 lea edx, [ebp-8]
004561B0 |. 8B83 FC020000 mov eax, [ebx+2FC]
004561B6 |. E8 75CDFDFF call 00432F30 ; 取输入的注册码
004561BB |. 8B45 F8 mov eax, [ebp-8] ; 使EAX等于输入的注册码
004561BE |. E8 3DE3FAFF call 00404500 ; 取注册码位数
004561C3 |. 83F8 03 cmp eax, 3 ; 注册码位数与3比较
004561C6 |. 7D 0C jge short 004561D4 ; 小于3位就出错
004561C8 |> B8 58624500 mov eax, 00456258 ; min. 3 char in name/serial!
004561CD |. E8 3E6BFDFF call 0042CD10
004561D2 |. EB 53 jmp short 00456227
004561D4 |> 8D55 F4 lea edx, [ebp-C]
004561D7 |. 8B83 FC020000 mov eax, [ebx+2FC]
004561DD |. E8 4ECDFDFF call 00432F30 ; 取注册码
004561E2 |. 8B45 F4 mov eax, [ebp-C] ; 使EAX等于注册码位数
004561E5 |. E8 2EFBFFFF call 00455D18 ; 算法CALL跟进
004561EA |. 84C0 test al, al
004561EC |. 74 1F je short 0045620D
004561EE |. 8B83 00030000 mov eax, [ebx+300]
004561F4 |. 8B80 08020000 mov eax, [eax+208]
004561FA |. 33D2 xor edx, edx
004561FC |. E8 73EDFFFF call 00454F74
00456201 |. BA 7C624500 mov edx, 0045627C ; congr! you are real cracker!
跟进算法CALL
----------------------------------------------------------------------00455D18 /$ 55 push ebp ; 来到这里
00455D19 |. 8BEC mov ebp, esp
省略一些代码。。。。。。
00455D48 |. 8B45 FC mov eax, [ebp-4]
00455D4B |. E8 B0E7FAFF call 00404500 ; 取注册码位数
00455D50 |. 83F8 1D cmp eax, 1D ; 注册码位数与0x1D比较(即注册码是否等于29位)
00455D53 |. 0F85 64010000 jnz 00455EBD ; 不相等就OVER
由此可知:注册码必须是29位
00455D59 |. 8D45 F4 lea eax, [ebp-C]
00455D5C |. 50 push eax
00455D5D |. B9 05000000 mov ecx, 5 ; 使ECX等于5
00455D62 |. 33D2 xor edx, edx ; EDX清零
00455D64 |. 8B45 FC mov eax, [ebp-4] ; 使EAX等于注册码
省略一些代码。。。。。。
00455DD0 |. 40 inc eax
00455DD1 |. 33D2 xor edx, edx
00455DD3 |> 8B4D F4 /mov ecx, [ebp-C] ; 使EAX等于注册码的前5位
00455DD6 |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 取注册码第一部分每一位的ASCII码
00455DDB |. 03D9 |add ebx, ecx ; 累加每一位的ASCII码(结果设为A)
00455DDD |. 42 |inc edx ; 每计算一次EDX值加1
00455DDE |. 48 |dec eax ; 每计算一次EAX值减1
00455DDF |.^ 75 F2 \jnz short 00455DD3
00455DE1 |> 81FB 8D010000 cmp ebx, 18D ; 累加的结果与0x18D相比较
00455DE7 |. 75 04 jnz short 00455DED
00455DE9 |. C645 E3 01 mov byte ptr [ebp-1D], 1 ; 相等就使[EBP-1D]=1,标志位
00455DED |> 33DB xor ebx, ebx
00455DEF |. 8B45 F0 mov eax, [ebp-10] ; 使EAX等于注册码的第二部分
00455DF2 |. E8 09E7FAFF call 00404500
00455DF7 |. 85C0 test eax, eax
00455DF9 |. 7C 11 jl short 00455E0C
00455DFB |. 40 inc eax
00455DFC |. 33D2 xor edx, edx
00455DFE |> 8B4D F0 /mov ecx, [ebp-10] ; 使ECX等于注册码的第二部分
00455E01 |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 取注册码第二部分每一位的ASCII码
00455E06 |. 03D9 |add ebx, ecx ; 累加每一位的ASCII码(结果设为B)
00455E08 |. 42 |inc edx ; 每计算一次EDX值加1
00455E09 |. 48 |dec eax ; 每计算一次EAX值减1
00455E0A |.^ 75 F2 \jnz short 00455DFE
00455E0C |> 81FB 8C010000 cmp ebx, 18C ; 累加的结果与0x18C相比较
00455E12 |. 75 04 jnz short 00455E18
00455E14 |. C645 E2 01 mov byte ptr [ebp-1E], 1 ; 如果相等就使[EBP-1E]=1,标志位
00455E18 |> 33DB xor ebx, ebx
00455E1A |. 8B45 EC mov eax, [ebp-14] ; 使EAX等于注册码的第三部分
00455E1D |. E8 DEE6FAFF call 00404500
00455E22 |. 85C0 test eax, eax
00455E24 |. 7C 11 jl short 00455E37
00455E26 |. 40 inc eax
00455E27 |. 33D2 xor edx, edx
00455E29 |> 8B4D EC /mov ecx, [ebp-14] ; 使ECX等于注册码第三部分
00455E2C |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 取注册码第三部分每一位的ASCII码
00455E31 |. 03D9 |add ebx, ecx ; 累加每一位的ASCII码(结果设为C)
00455E33 |. 42 |inc edx ; 每计算一次EDX加1
00455E34 |. 48 |dec eax ; 每计算一次EAX减1
00455E35 |.^ 75 F2 \jnz short 00455E29
00455E37 |> 81FB 90010000 cmp ebx, 190 ; 累加的结果与0x190相比较
00455E3D |. 75 04 jnz short 00455E43
00455E3F |. C645 E1 01 mov byte ptr [ebp-1F], 1 ; 相等就使[EBP-1F]=1,标志位
00455E43 |> 33DB xor ebx, ebx
00455E45 |. 8B45 E8 mov eax, [ebp-18] ; 使EAX等于注册码第四部分
00455E48 |. E8 B3E6FAFF call 00404500
00455E4D |. 85C0 test eax, eax
00455E4F |. 7C 11 jl short 00455E62
00455E51 |. 40 inc eax
00455E52 |. 33D2 xor edx, edx
00455E54 |> 8B4D E8 /mov ecx, [ebp-18] ; 使ECX等于注册码第四部分
00455E57 |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 取注册码第四部分每一位的ASCII码
00455E5C |. 03D9 |add ebx, ecx ; 累加每一位的ASCII码(结果设为D)
00455E5E |. 42 |inc edx ; 每计算一次EDX加1
00455E5F |. 48 |dec eax ; 每计算一次EAX减1
00455E60 |.^ 75 F2 \jnz short 00455E54
00455E62 |> 81FB 88010000 cmp ebx, 188 ; 累加的结果与0x188相比较
00455E68 |. 75 04 jnz short 00455E6E
00455E6A |. C645 E0 01 mov byte ptr [ebp-20], 1 ; 相等就使[EBP-20]=1,标志位
00455E6E |> 33DB xor ebx, ebx
00455E70 |. 8B45 E4 mov eax, [ebp-1C] ; 使EAX等于注册码第五部分
00455E73 |. E8 88E6FAFF call 00404500
00455E78 |. 85C0 test eax, eax
00455E7A |. 7C 11 jl short 00455E8D
00455E7C |. 40 inc eax
00455E7D |. 33D2 xor edx, edx
00455E7F |> 8B4D E4 /mov ecx, [ebp-1C] ; 使ECX等于注册码第五部分
00455E82 |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 取注册码第五部分每一位的ASCII码
00455E87 |. 03D9 |add ebx, ecx ; 累加每一位的ASCII码(结果设为E)
00455E89 |. 42 |inc edx ; 每计算一次EDX加1
00455E8A |. 48 |dec eax ; 每计算一次EAX减1
00455E8B |.^ 75 F2 \jnz short 00455E7F
00455E8D |> 81FB 86010000 cmp ebx, 186 ; 累加的结果与0x186相比较
00455E93 |. 75 04 jnz short 00455E99
00455E95 |. C645 DF 01 mov byte ptr [ebp-21], 1 ; 相等就使[EBP-21]=1,标志位
计算的过程是这样的
1)将注册码以5位为一组分成5组:
具体的分法是:1~5位第一部分,7~11位第二部分,13~17位第三部分,19~23位第四部分,25~29位第五部分。
2)将每一部分的注册码的ASCII码累加:
具体要求是:第一部分累加的和必须是0x18D
第二部分累加的和必须是0x18C
第三部分累加的和必须是0x190
第四部分累加的和必须是0x188
第五部分累加的和必须是0x186
3)注意29位注册码中第6,12,18,24位可以为任意字符
对每一部分计算完毕后都有一个对标志位进行赋值的操作。
例:mov byte ptr [ebp-21], 1 。它表示如果相应部分注册码的累加值与定值相等,就会对标志位赋值1
计算完后,开始检验标志位的情况
00455E99 |> \8A45 E3 mov al, [ebp-1D]
00455E9C |. 2245 E2 and al, [ebp-1E]
00455E9F |. 74 18 je short 00455EB9
00455EA1 |. 807D E1 00 cmp byte ptr [ebp-1F], 0
00455EA5 |. 74 12 je short 00455EB9
00455EA7 |. 807D E0 00 cmp byte ptr [ebp-20], 0
00455EAB |. 74 0C je short 00455EB9
00455EAD |. 807D DF 00 cmp byte ptr [ebp-21], 0
00455EB1 |. 74 06 je short 00455EB9
即:注册码的5个部分中任意1个部分的累加值与定值不相等,就会跳向失败。
例
Z7eHO-9T0Wx-ci7U8-6RoZ7-9IRGk
----------------------------------------------------------------------
需要注意的两点
1)注册名只要求大于3位并不参与注册码的计算。
2)29位注册码中第6,12,18,24位可以为任意字符。
----------------------------------------------------------------------
【版权声明】本文只为交流,转载请保留作者及文章完整性
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)