一个入门的CrackMe算法分析

【文章标题】: 一个入门的CrackMe算法分析
【文章作者】: 龙在天
【下载地址】: longzaitian.ys168.com
【加壳方式】: 无壳
【编写语言】: Borland Delphi 6.0
【使用工具】: OD,PEID
【软件介绍】: 一个菜鸟入门级别的CreakMe
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

【详细过程】
1.用PEID查壳得程序是用Borland Delphi 6.0编写,无壳

2.运行程序输入用户名zaitian,注册码123456后,点击Check,程序没有反应。接着就OD载入,用字符串查找的方式下好断点
我们查找字符串找到这处:
地址=00450161
反汇编=PUSH KeyGenMe.00450198
文本字串=Congratulations
双击进去后向上走一段,来到段头00450062处下断。

来看下面关键代码

00450062     55               PUSH EBP
00450063     68 8D014500     PUSH KeyGenMe.0045018D
00450068     64:FF30         PUSH DWORD PTR FS:[EAX]
0045006B     64:8920         MOV DWORD PTR FS:[EAX],ESP
0045006E     8D55 F8         LEA EDX,DWORD PTR SS:[EBP-8]
00450071     8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00450074     8B80 00030000   MOV EAX,DWORD PTR DS:[EAX+300]
0045007A     E8 D9F2FDFF     CALL KeyGenMe.0042F358
0045007F     8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]             ; eax=用户名
00450082     E8 4940FBFF     CALL KeyGenMe.004040D0
00450087     8945 F0         MOV DWORD PTR SS:[EBP-10],EAX
0045008A     837D F0 02       CMP DWORD PTR SS:[EBP-10],2               ; 用户名长度要>=2
0045008E     0F8C DE000000   JL KeyGenMe.00450172
00450094     8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
00450097     8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
0045009A     8B80 08030000   MOV EAX,DWORD PTR DS:[EAX+308]
004500A0     E8 B3F2FDFF     CALL KeyGenMe.0042F358
004500A5     8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
004500A8     E8 2340FBFF     CALL KeyGenMe.004040D0
004500AD     8945 EC         MOV DWORD PTR SS:[EBP-14],EAX
004500B0     837D EC 0A       CMP DWORD PTR SS:[EBP-14],0A             ; 注册码长度要等于10
004500B4     0F85 B8000000   JNZ KeyGenMe.00450172
004500BA     8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
004500BD     85C0             TEST EAX,EAX
004500BF     7E 34           JLE SHORT KeyGenMe.004500F5
004500C1     8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
004500C4     C745 E8 0100000>MOV DWORD PTR SS:[EBP-18],1
004500CB     8B45 F4         /MOV EAX,DWORD PTR SS:[EBP-C]             ; 这个循环判断注册码格式,注册码必须为数字
004500CE     8B55 E8         |MOV EDX,DWORD PTR SS:[EBP-18]
004500D1     807C10 FF 30     |CMP BYTE PTR DS:[EAX+EDX-1],30
004500D6     0F82 96000000   |JB KeyGenMe.00450172
004500DC     8B45 F4         |MOV EAX,DWORD PTR SS:[EBP-C]
004500DF     8B55 E8         |MOV EDX,DWORD PTR SS:[EBP-18]
004500E2     807C10 FF 39     |CMP BYTE PTR DS:[EAX+EDX-1],39
004500E7     0F87 85000000   |JA KeyGenMe.00450172
004500ED     FF45 E8         |INC DWORD PTR SS:[EBP-18]
004500F0     FF4D E4         |DEC DWORD PTR SS:[EBP-1C]
004500F3   ^ 75 D6           \JNZ SHORT KeyGenMe.004500CB
004500F5     8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
004500F8     0FB600           MOVZX EAX,BYTE PTR DS:[EAX]               ; eax取注册码首位
004500FB     8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
004500FE     0FB652 05       MOVZX EDX,BYTE PTR DS:[EDX+5]             ; edx取注册码第6位
00450102     03C2             ADD EAX,EDX                               ; 二者相加
00450104     83F8 6D         CMP EAX,6D                               ; 注册码首位和第六位相加要为0x6D
00450107     75 69           JNZ SHORT KeyGenMe.00450172
00450109     8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
0045010C     0FB640 01       MOVZX EAX,BYTE PTR DS:[EAX+1]             ; 取注册码第二位
00450110     8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
00450113     0FB652 06       MOVZX EDX,BYTE PTR DS:[EDX+6]             ; 取注册码第七位
00450117     03C2             ADD EAX,EDX
00450119     83F8 67         CMP EAX,67                               ; 相加要为0x67
0045011C     75 54           JNZ SHORT KeyGenMe.00450172
0045011E     8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
00450121     0FB640 02       MOVZX EAX,BYTE PTR DS:[EAX+2]             ; 取注册码第三位
00450125     8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
00450128     0FB652 07       MOVZX EDX,BYTE PTR DS:[EDX+7]             ; 取注册码第八位
0045012C     03C2             ADD EAX,EDX
0045012E     83F8 69         CMP EAX,69                               ; 相加要为0x69
00450131     75 3F           JNZ SHORT KeyGenMe.00450172
00450133     8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
00450136     0FB640 03       MOVZX EAX,BYTE PTR DS:[EAX+3]             ; 取注册码第四位
0045013A     8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
0045013D     0FB652 08       MOVZX EDX,BYTE PTR DS:[EDX+8]             ; 取注册码第九位
00450141     03C2             ADD EAX,EDX
00450143     83F8 70         CMP EAX,70                               ; 相加要为0x70
00450146     75 2A           JNZ SHORT KeyGenMe.00450172
00450148     8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
0045014B     0FB640 04       MOVZX EAX,BYTE PTR DS:[EAX+4]             ; 取注册码第五位
0045014F     8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
00450152     0FB652 09       MOVZX EDX,BYTE PTR DS:[EDX+9]             ; 取注册码第十位
00450156     F7EA             IMUL EDX                                 ; 第五位除以十位
00450158     3D 8C0A0000     CMP EAX,0A8C                             ; 相除结果要等于0x0A8C
0045015D     75 13           JNZ SHORT KeyGenMe.00450172               ;
0045015F     6A 40           PUSH 40
00450161     68 98014500     PUSH KeyGenMe.00450198                   ; Congratulations
00450166     68 A8014500     PUSH KeyGenMe.004501A8                   ; Good job,man!   //调用注册成功的对话框
0045016B     6A 00           PUSH 0
0045016D     E8 2E63FBFF     CALL <JMP.&user32.MessageBoxA>
00450172     33C0             XOR EAX,EAX
00450174     5A               POP EDX
00450175     59               POP ECX
00450176     59               POP ECX

【经验总结】

1.注册名长度必须大于等于2

2.注册码必须为十位数字

3.注册码的第1和第6位ASCII相加为十六进制的60,第2位和第7位相加为十六进制的67,第3位和第8位相加为十六进制的
69,第4位和第9位相加为十六进制的70,第5位的ASCII值除以第10位的ASCII值要等于十六进制的0A8C,注册名为任意

4.最终计算得出一个可用注册码:4127296796,用户名任意(长度>=2).

5.这个CreakMe的算法较为简单,适合菜鸟入门练习用

【版权声明】: 本文原创, 转载请注明作者并保持文章的完整, 谢谢!

2008年08月10日 19:31:07