【文章标题】: 一个入门的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