首页
社区
课程
招聘
OCN的CRACKME算法分析
发表于: 2006-2-22 11:56 6258

OCN的CRACKME算法分析

2006-2-22 11:56
6258

【破文标题】CRACKME算法分析
【破文作者】逍遥风[OCN][PYG]
【作者邮箱】lovewxt@sohu.com
【破解工具】PEID OD
【破解平台】win2K
----------------------------------------------------------------------
1)PEID检查  MASM32 / TASM32  无壳
2)试运行程序,任意输入注册信息后,有错误提示。
3)OD载入程序,命令行下断,bp  GetWindowTextA,任意输入注册信息确定后,程序中断。来到这里

00401112   .  6A 28         PUSH 28                                  ; /Count = 28 (40.)
00401114   .  8D45 BC       LEA EAX,DWORD PTR SS:[EBP-44]            ; |
00401117   .  50            PUSH EAX                                 ; |Buffer
00401118   .  FF35 04304000 PUSH DWORD PTR DS:[403004]               ; |hWnd = 000E0298 (class='Edit',parent=000300AE)
0040111E   .  E8 5B010000   CALL <JMP.&user32.GetWindowTextA>        ; \GetWindowTextA
00401123   .  8D75 BC       LEA ESI,DWORD PTR SS:[EBP-44]            ;  取注册名位数
00401126   .  AC            LODS BYTE PTR DS:[ESI]                   ;  取注册名第一位的ASCII值
00401127   .  3C 00         CMP AL,0                                 ;  注册名第一位的ASCII值与0比较
00401129   .  75 11         JNZ SHORT Crack.0040113C
0040112B   .  FF35 04304000 PUSH DWORD PTR DS:[403004]               ; /hWnd = 000E0298 (class='Edit',parent=000300AE)
00401131   .  E8 60010000   CALL <JMP.&user32.SetFocus>              ; \SetFocus
00401136   .  33C0          XOR EAX,EAX
00401138   .  C9            LEAVE
00401139   .  C2 1000       RETN 10
0040113C   >  8D45 BC       LEA EAX,DWORD PTR SS:[EBP-44]
0040113F   .  50            PUSH EAX
00401140   .  E8 6F010000   CALL Crack.004012B4
00401145   .  8D45 BC       LEA EAX,DWORD PTR SS:[EBP-44]
00401148   .  50            PUSH EAX                                 ; /String
00401149   .  E8 60010000   CALL <JMP.&kernel32.lstrlenA>            ; \lstrlenA
0040114E   .  8BF8          MOV EDI,EAX                              ;  取注册名位数
00401150   .  8BC8          MOV ECX,EAX                              ;  EAX=注册名位数,分别给EDI,ECX
00401152   .  BB 01000000   MOV EBX,1                                ;  使EBX=1
00401157   .  33D2          XOR EDX,EDX                              ;  EDX清零
00401159   .  EB 1C         JMP SHORT Crack.00401177
0040115B   >  4F            DEC EDI                                  ;  每计算一次EDI-1
0040115C   .  36:0FB6542F B>MOVZX EDX,BYTE PTR SS:[EDI+EBP-44]       ;  从右向左取注册名每一位的ASCII值
00401162   .  33D3          XOR EDX,EBX
00401164   .  0FAFD3        IMUL EDX,EBX
00401167   .  83C3 05       ADD EBX,5
0040116A   .  3115 24304000 XOR DWORD PTR DS:[403024],EDX
00401170   .  C105 24304000>ROL DWORD PTR DS:[403024],5
00401177   >  0BFF          OR EDI,EDI
00401179   .^ 75 E0         JNZ SHORT Crack.0040115B
0040117B   .  A1 24304000   MOV EAX,DWORD PTR DS:[403024]
00401180   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
00401183   .  33C0          XOR EAX,EAX
00401185   .  6A 28         PUSH 28                                  ; /Count = 28 (40.)
00401187   .  8D85 3CFFFFFF LEA EAX,DWORD PTR SS:[EBP-C4]            ; |
0040118D   .  50            PUSH EAX                                 ; |Buffer
0040118E   .  FF35 08304000 PUSH DWORD PTR DS:[403008]               ; |hWnd = 000C029A (class='Edit',parent=000300AE)
00401194   .  E8 E5000000   CALL <JMP.&user32.GetWindowTextA>        ; \GetWindowTextA
00401199   .  33C9          XOR ECX,ECX                              ;  取假码位数
0040119B   .  33DB          XOR EBX,EBX
0040119D   >  36:0FB69429 3>MOVZX EDX,BYTE PTR SS:[ECX+EBP-C4]
004011A6   .  03DA          ADD EBX,EDX
004011A8   .  6BDB 10       IMUL EBX,EBX,10
004011AB   .  41            INC ECX                                  ;  每计算一次ECX+1
004011AC   .  3BC8          CMP ECX,EAX                              ;  计算完了吗,没有就继续
004011AE   .^ 75 ED         JNZ SHORT Crack.0040119D
004011B0   .  3B5D FC       CMP EBX,DWORD PTR SS:[EBP-4]             ;  比较注册名与假码计算后的结果,相等就注册成功
004011B3   .  74 15         JE SHORT Crack.004011CA
004011B5   .  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004011B7   .  68 30304000   PUSH Crack.00403030                      ; |crackme v 0.11
004011BC   .  68 54304000   PUSH Crack.00403054                      ; |no,try again
004011C1   .  6A 00         PUSH 0                                   ; |hOwner = NULL
004011C3   .  E8 C2000000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
004011C8   .  EB 32         JMP SHORT Crack.004011FC
004011CA   >  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004011CC   .  68 30304000   PUSH Crack.00403030                      ; |crackme v 0.11
004011D1   .  68 3F304000   PUSH Crack.0040303F                      ; |register successful!
004011D6   .  6A 00         PUSH 0                                   ; |hOwner = NULL
004011D8   .  E8 AD000000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA

----------------------------------------------------------------------
算法总结:
1)注册名必须大于一位。
2)采用了F1(注册名)=F2(注册码)的验证方式。
对注册名的计算公式是:
[An  (xor)  Bn]  *  Bn  =  Cn
[Cn  (xor)  D(n-1)]   LSH   5  =   Dn        An=从右到左每一位注册名对应的ASCII值。
                                             Bn=B(n-1)+5    ...(B1=1)
                                             Dn就是最终的结果。n=注册名位数。
对注册码的计算公式是:
A1  *  10  =  B1                             An=每一位注册名对应的ASCII值
[An  +  B(n-1)]  *  10  =  Bn                Bn就是最终结果。n=注册名位数
**注意,两个公式中的An,Bn 等只是符号,没有联系。
3)将以上所得的Dn与Bn相比教,相等就成功。
数学好的朋友可以试着推出一组注册码
----------------------------------------------------------------------


[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢,学习中!希望大哥多发点!O正在学习中!
2006-2-22 12:39
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
3
数学不太好,没有找到一组有效的注册信息.遗憾
2006-2-22 15:55
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
讲道理这个应该是注册码的:cKcQFgk
然而因为无论怎么计算最后都要和0x10相乘,所以这个题没有注册码
2016-3-29 10:19
0
游客
登录 | 注册 方可回帖
返回
//