-
-
CRACKME算法分析(逐位比较型)
-
发表于:
2006-3-11 19:41
6966
-
【破文标题】crackme算法分析
【破文作者】逍遥风
【破解工具】OD PEID
【破解平台】WINXP
【破解声明】此CRACKME注册方式是逐位比较。就是计算出一位就比较一位。
----------------------------------------------------------------------
1)PEID检查:Microsoft Visual C++ 6.0
2)试运行发现没有错误提示,还是先用OD,发现了注册成功的提示。以此为突破口,很容易来到以下代码处:
00401580 . 6A FF PUSH -1
00401582 . 68 B81B4000 PUSH Rith_Cra.00401BB8 ; SE 处理程序安装
00401587 . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0040158D . 50 PUSH EAX
0040158E . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00401595 . 83EC 0C SUB ESP,0C
00401598 . 53 PUSH EBX
00401599 . 55 PUSH EBP
0040159A . 56 PUSH ESI
0040159B . 8BF1 MOV ESI,ECX
0040159D . 57 PUSH EDI
0040159E . 68 48304000 PUSH Rith_Cra.00403048 ; 31415926535897932384
004015A3 . 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
004015A7 . 897424 1C MOV DWORD PTR SS:[ESP+1C],ESI
004015AB . E8 FA020000 CALL <JMP.&MFC42.#537_??0CString@@QAE@PB>
004015B0 . 6A 01 PUSH 1
004015B2 . 8BCE MOV ECX,ESI
004015B4 . C74424 28 000>MOV DWORD PTR SS:[ESP+28],0
004015BC . E8 E3020000 CALL <JMP.&MFC42.#6334_?UpdateData@CWnd@>; 取注册名位数
004015C1 . 8B7E 60 MOV EDI,DWORD PTR DS:[ESI+60]
004015C4 . 8B5F F8 MOV EBX,DWORD PTR DS:[EDI-8]
004015C7 . 83FB 05 CMP EBX,5 ; 注册名位数与5比较
004015CA . 7C 7E JL SHORT Rith_Cra.0040164A ; 小于5位就跳向失败
004015CC . 8B46 64 MOV EAX,DWORD PTR DS:[ESI+64]
004015CF . 894424 14 MOV DWORD PTR SS:[ESP+14],EAX
004015D3 . 3958 F8 CMP DWORD PTR DS:[EAX-8],EBX ; 比较注册名位数与注册码位数
004015D6 . 75 72 JNZ SHORT Rith_Cra.0040164A ; 位数不相等就跳向失败
004015D8 . 83FB 14 CMP EBX,14 ; 注册名位数与20(十进制)比较
004015DB . 7F 6D JG SHORT Rith_Cra.0040164A ; 大于20位就跳向失败
004015DD . 33C9 XOR ECX,ECX
004015DF . 85DB TEST EBX,EBX
004015E1 . 7E 54 JLE SHORT Rith_Cra.00401637
004015E3 . 8B7424 10 MOV ESI,DWORD PTR SS:[ESP+10] ; 读表
004015E7 > 8A040F MOV AL,BYTE PTR DS:[EDI+ECX] ; 取注册名的每一位
004015EA . 0FBE2C31 MOVSX EBP,BYTE PTR DS:[ECX+ESI] ; 取表中相应位置的数字的HEX值,设为A
004015EE . 0FBEC0 MOVSX EAX,AL ; 取注册名每一位的HEX值,设为B
004015F1 . 99 CDQ
004015F2 . F7FD IDIV EBP ; B除以A,商进EAX,余数进EDX
004015F4 . 8BC2 MOV EAX,EDX ; 余数给EAX
004015F6 . D1E0 SHL EAX,1 ; 余数乘以2的一次方,设为C
004015F8 . 83F8 7B CMP EAX,7B ; 与7B比较
004015FB . 7E 03 JLE SHORT Rith_Cra.00401600 ; 小于就与41比较
004015FD . 83E8 1A SUB EAX,1A
00401600 > 83F8 41 CMP EAX,41 ; 与41比较
00401603 . 7D 09 JGE SHORT Rith_Cra.0040160E ; 大于就跳走
00401605 . BA 82000000 MOV EDX,82
0040160A . 2BD0 SUB EDX,EAX ; EDX=82-C
0040160C . 8BC2 MOV EAX,EDX
0040160E > 83F8 5B CMP EAX,5B ; 结果与5B相比较
00401611 . 7E 12 JLE SHORT Rith_Cra.00401625 ; 小于就与61比较
00401613 . 83F8 61 CMP EAX,61
00401616 . 7D 0D JGE SHORT Rith_Cra.00401625 ; 大于就跳走
00401618 . 99 CDQ
00401619 . BD 0A000000 MOV EBP,0A
0040161E . F7FD IDIV EBP
00401620 . 83C2 30 ADD EDX,30
00401623 . 8BC2 MOV EAX,EDX
00401625 > 8B5424 14 MOV EDX,DWORD PTR SS:[ESP+14]
00401629 . 38040A CMP BYTE PTR DS:[EDX+ECX],AL ; 结果的ASCII值与假码第一位的HEX值相比较
0040162C . 75 1C JNZ SHORT Rith_Cra.0040164A ; 不相等就跳向失败
0040162E . 41 INC ECX ; 每计算一次ECX+1
0040162F . 3BCB CMP ECX,EBX ; 计算完了吗?
00401631 .^ 7C B4 JL SHORT Rith_Cra.004015E7 ; 没有就继续计算
00401633 . 8B7424 18 MOV ESI,DWORD PTR SS:[ESP+18]
00401637 > 6A 00 PUSH 0
00401639 . 68 34304000 PUSH Rith_Cra.00403034 ; congratulations!
0040163E . 68 20304000 PUSH Rith_Cra.00403020 ; well done cracker!
------------------------------------------------------------------------
算法总结:
需要一张表: 31415926535897932384(呵呵。圆周率?)
1)注册名与注册码都必须大于5位且位数必须相等。
2)按次在取注册名每一位的HEX值B,以及表中相对应位置数字的HEX值A
3)A除以B所得余数乘以2。
4)在对得到的结果进行分情况处理(比较麻烦偷下懒。。。不叙述了)。
5)每一位计算的最终结果与输入的注册码相应位数进行比较。
得到一组注册信息:
注册名:lovetc
注册码:vhf|nT
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课