-
-
OCN的CRACKME算法分析
-
发表于:
2006-2-22 11:56
6240
-
【破文标题】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相比教,相等就成功。
数学好的朋友可以试着推出一组注册码
----------------------------------------------------------------------
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!