首页
社区
课程
招聘
[原创]Salazan's KeyGenMe! # 0001算法分析
发表于: 2006-7-27 19:03 5697

[原创]Salazan's KeyGenMe! # 0001算法分析

2006-7-27 19:03
5697

【破文标题】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期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
2
还来?



PFPF

希望出更多精品!
2006-7-27 20:39
0
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
3
很不错,学习了.
2006-7-27 23:04
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
向强人学习!!
2006-7-27 23:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
期待逍遥风兄出更多适合新手的学习教材,支持!
2006-7-28 10:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不管输入什么,都没反应,我是新学的,怎么知道下断点呢,搞不懂,
2006-7-29 15:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很不错,学习了,期待逍遥风兄出更多适合新手的学习教材,支持!
2006-7-31 22:04
0
游客
登录 | 注册 方可回帖
返回
//