首页
社区
课程
招聘
CRACKME分析(算法21)
发表于: 2006-4-11 19:34 6397

CRACKME分析(算法21)

2006-4-11 19:34
6397

【破文标题】CRACKME分析
【破文作者】逍遥风
【破解工具】OD peid
【破解平台】WINXP
【破解声明】算法练习,简单的累加及进制转换。
----------------------------------------------------------------------
1)PEID检查,VC的程序。没有加壳
2)OD载入程序,用字符串查找很容易找到关键处。
来到这里
00401223   .  68 FF000000   PUSH 0FF                                 ; /Count = FF (255.)
00401228   .  68 30694000   PUSH vcrkme01.00406930                   ; |Buffer = vcrkme01.00406930
0040122D   .  68 E8030000   PUSH 3E8                                 ; |ControlID = 3E8 (1000.)
00401232   .  50            PUSH EAX                                 ; |hWnd => 001C0600 ('[v0!d] Crackme - v0.01',class='#32770')
00401233   .  FFD6          CALL ESI                                 ; \GetDlgItemTextA
00401235   .  8B0D 28694000 MOV ECX,DWORD PTR DS:[406928]            ;  取注册名位数
0040123B   .  68 FF000000   PUSH 0FF                                 ; /Count = FF (255.)
00401240   .  68 306A4000   PUSH vcrkme01.00406A30                   ; |Buffer = vcrkme01.00406A30
00401245   .  68 EA030000   PUSH 3EA                                 ; |ControlID = 3EA (1002.)
0040124A   .  51            PUSH ECX                                 ; |hWnd => 001C0600 ('[v0!d] Crackme - v0.01',class='#32770')
0040124B   .  FFD6          CALL ESI                                 ; \GetDlgItemTextA
0040124D   .  68 306A4000   PUSH vcrkme01.00406A30                   ;  取注册码位数
00401252   .  68 30694000   PUSH vcrkme01.00406930
00401257   .  E8 A4FDFFFF   CALL vcrkme01.00401000                   ;  算法CALL,进
0040125C   .  83C4 08       ADD ESP,8
0040125F   .  83F8 01       CMP EAX,1
00401262   .  A3 646C4000   MOV DWORD PTR DS:[406C64],EAX
00401267   .  75 65         JNZ SHORT vcrkme01.004012CE              ;  不相等就跳向失败
00401269   .  8B15 28694000 MOV EDX,DWORD PTR DS:[406928]
0040126F   .  6A 40         PUSH 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401271   .  68 80604000   PUSH vcrkme01.00406080                   ; |good job! - cracked!
00401276   .  68 50604000   PUSH vcrkme01.00406050                   ; |send your solution to : v0id2k1@hotmail.com
0040127B   .  52            PUSH EDX                                 ; |hOwner => 001C0600 ('[v0!d] Crackme - v0.01',class='#32770')
0040127C   .  FF15 C4504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
经典的比较过程
----------------------------------------------------------------------
进入算法CALL
00401000  /$  53            PUSH EBX
00401001  |.  8B5C24 0C     MOV EBX,DWORD PTR SS:[ESP+C]             ;  取出注册码
00401005  |.  55            PUSH EBP
00401006  |.  56            PUSH ESI
00401007  |.  8B7424 10     MOV ESI,DWORD PTR SS:[ESP+10]            ;  取出注册名
0040100B  |.  8A0B          MOV CL,BYTE PTR DS:[EBX]                 ;  取注册码第一位的ASCII码放进CL
0040100D  |.  33ED          XOR EBP,EBP
0040100F  |.  57            PUSH EDI
00401010  |.  8A06          MOV AL,BYTE PTR DS:[ESI]                 ;  取注册名第一位的ASCII码放进AL
00401012  |.  3AC1          CMP AL,CL                                ;  比较注册码的第一位与注册名第一位是否相等
00401014  |.  0F85 69010000 JNZ vcrkme01.00401183                    ;  不相等就跳向失败
0040101A  |.  8BFE          MOV EDI,ESI
0040101C  |.  83C9 FF       OR ECX,FFFFFFFF
0040101F  |.  33C0          XOR EAX,EAX                              ;  EAX清零
00401021  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00401023  |.  F7D1          NOT ECX
00401025  |.  49            DEC ECX
00401026  |.  83F9 05       CMP ECX,5                                ;  注册名大于5位吗?
00401029  |.  0F82 54010000 JB vcrkme01.00401183                     ;  小于就跳向失败
0040102F  |.  807B 01 2D    CMP BYTE PTR DS:[EBX+1],2D               ;  注册码的第2位是‘-’吗?
00401033  |.  0F85 4A010000 JNZ vcrkme01.00401183                    ;  不是就跳向失败
通过初步检验,来到这里继续开始计算
00401039  |.  8BFE          MOV EDI,ESI
0040103B  |.  83C9 FF       OR ECX,FFFFFFFF
0040103E  |.  33C0          XOR EAX,EAX                              ;  EAX清零
00401040  |.  33D2          XOR EDX,EDX                              ;  EDX清零
00401042  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00401044  |.  F7D1          NOT ECX
00401046  |.  49            DEC ECX
00401047  |.  74 17         JE SHORT vcrkme01.00401060               ;  开始计算
00401049  |> /0FBE0C32      /MOVSX ECX,BYTE PTR DS:[EDX+ESI]         ;  取注册名每一位的ASCII值
0040104D  |. |03E9          |ADD EBP,ECX                             ;  与前一位的ASCII值相加
0040104F  |. |8BFE          |MOV EDI,ESI
00401051  |. |83C9 FF       |OR ECX,FFFFFFFF
00401054  |. |33C0          |XOR EAX,EAX                             ;  EAX清零
00401056  |. |42            |INC EDX                                 ;  每计算一次EDX+1
00401057  |. |F2:AE         |REPNE SCAS BYTE PTR ES:[EDI]
00401059  |. |F7D1          |NOT ECX
0040105B  |. |49            |DEC ECX                                 ;  每计算一次ECX-1
0040105C  |. |3BD1          |CMP EDX,ECX                             ;  计算完了吗
0040105E  |.^\72 E9         \JB SHORT vcrkme01.00401049              ;  没有就继续计算
这个循环的作用是将注册名每一位的ASCII码累加
循环计算完毕后来到这里
00401060  |> \81C5 64600000 ADD EBP,6064                             ;  累加的结果加0x6064,得到一个值A
00401066  |.  55            PUSH EBP
00401067  |.  68 34604000   PUSH vcrkme01.00406034                   ;  %lu
0040106C  |.  68 306B4000   PUSH vcrkme01.00406B30
00401071  |.  E8 B6030000   CALL vcrkme01.0040142C                   ;  将A转换成对应的十进制
00401076  |.  8A16          MOV DL,BYTE PTR DS:[ESI]
00401078  |.  8BFE          MOV EDI,ESI
0040107A  |.  83C9 FF       OR ECX,FFFFFFFF
0040107D  |.  33C0          XOR EAX,EAX
0040107F  |.  8815 446B4000 MOV BYTE PTR DS:[406B44],DL
00401085  |.  C605 456B4000>MOV BYTE PTR DS:[406B45],2D
0040108C  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040108E  |.  F7D1          NOT ECX
00401090  |.  49            DEC ECX
00401091  |.  0FBE4431 FF   MOVSX EAX,BYTE PTR DS:[ECX+ESI-1]        ;  取注册名最后一位的ASCII码
00401096  |.  50            PUSH EAX
00401097  |.  E8 C4020000   CALL vcrkme01.00401360                   ;  将注册名最后一位转换成对应的大写字母
0040109C  |.  A2 466B4000   MOV BYTE PTR DS:[406B46],AL

004010A1  |.  BF 306B4000   MOV EDI,vcrkme01.00406B30                ;  把A放进EDI
004010A6  |.  83C9 FF       OR ECX,FFFFFFFF
004010A9  |.  33C0          XOR EAX,EAX                              ;  EAX清零
004010AB  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
004010AD  |.  F7D1          NOT ECX
004010AF  |.  2BF9          SUB EDI,ECX
004010B1  |.  81C5 64600000 ADD EBP,6064                             ;  A加上0x6064,结果设为B
004010B7  |.  8BF7          MOV ESI,EDI
004010B9  |.  8BD1          MOV EDX,ECX
004010BB  |.  BF 446B4000   MOV EDI,vcrkme01.00406B44               
004010C0  |.  83C9 FF       OR ECX,FFFFFFFF
004010C3  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
004010C5  |.  8BCA          MOV ECX,EDX
004010C7  |.  4F            DEC EDI
004010C8  |.  C1E9 02       SHR ECX,2
004010CB  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
004010CD  |.  8BCA          MOV ECX,EDX
004010CF  |.  55            PUSH EBP
004010D0  |.  83E1 03       AND ECX,3
004010D3  |.  68 34604000   PUSH vcrkme01.00406034                   ;  %lu
004010D8  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>;  连接注册名第一位,注册名最后一位和A对应的十进制数。
004010DA  |.  BF 30604000   MOV EDI,vcrkme01.00406030                ;  -
004010DF  |.  83C9 FF       OR ECX,FFFFFFFF
省略一些代码。。。                 
00401108  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
0040110A  |.  E8 1D030000   CALL vcrkme01.0040142C                   ;  将结果B转换成对应的10进制数
0040110F  |.  BF 306B4000   MOV EDI,vcrkme01.00406B30               
00401114  |.  83C9 FF       OR ECX,FFFFFFFF
00401117  |.  33C0          XOR EAX,EAX
00401119  |.  83C4 1C       ADD ESP,1C
0040111C  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040111E  |.  F7D1          NOT ECX
00401120  |.  2BF9          SUB EDI,ECX
00401122  |.  8BF7          MOV ESI,EDI
00401124  |.  8BD1          MOV EDX,ECX
00401126  |.  BF 446B4000   MOV EDI,vcrkme01.00406B44               
0040112B  |.  83C9 FF       OR ECX,FFFFFFFF
0040112E  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00401130  |.  8BCA          MOV ECX,EDX
00401132  |.  4F            DEC EDI
00401133  |.  C1E9 02       SHR ECX,2
00401136  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>;  将计算所得的注册码3个部分连接
00401138  |.  8BCA          MOV ECX,EDX
0040113A  |.  8BC3          MOV EAX,EBX
0040113C  |.  83E1 03       AND ECX,3
0040113F  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
00401141  |.  BE 446B4000   MOV ESI,vcrkme01.00406B44               
算法结束,将结果输出。

----------------------------------------------------------------------
算法总结:
1)注册名必须大于5位。注册名与注册码的第一位必须相等。注册码第二位必须是‘-’
2)注册第一部分:注册名第一位,符号‘-’,注册名最后一位组成注册码第一部分。
3)注册名ASCII码累加的和再加上0x6064结果设为A,将A转换成对应的十进制数。作为注册码的第二部分。
4) A加上0x6064结果设为B,将B转换成对应的十进制数。作为注册码的第三部分。
例:
注册名:1ovetc         
            第一部分:1-C,第二部分:25270,第三部分:49946
注册码:1-C25270-49946

----------------------------------------------------------------------
【版权声明】本文只为交流,欢迎转载。请保留作者及文章完整性。


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
坐个沙发
2006-4-11 19:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你那篇keyfile写的很基本   我觉得
找个经典的用注册表的给我们这些新手发一下就全了 !
手头上缺这样的
2006-4-11 20:58
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好啊不错,可以下了
2006-4-11 23:41
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
5
注册码的第一部分应该是注册名第一位,加‘-’,加注册名最后一位的大写组成,替你写了个注册机:

Private Sub Command1_Click()
Dim yhm, a1, a2, a3 As String
yhm = Text1.Text
If Len(yhm) < 5 Then
    MsgBox "^0^ 不好意思,用户名不能小于5位. ^0^",  "提示"
Else
    a1 = Chr(Asc(Mid(yhm, 1, 1))) + "-" + Chr(Asc(UCase(Mid(yhm, Len(yhm), 1))))
For i = 1 To Len(yhm)
    a2 = a2 + (Asc(Mid(yhm, i, 1)))
Next i
    a3 = a2 + &H6064
    a4 = a3 + &H6064
Text2.Text = a1 & a3 & "-" & a4
End If
End Sub
上传的附件:
2006-4-12 08:25
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
6
谢谢,太强了。。。
2006-4-13 20:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
写的详细,不错!
2006-5-1 14:20
0
雪    币: 214
活跃值: (55)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
支持,楼主能否将所有的CRACKME做成一个CHM,以供学习。谢谢
2006-5-1 14:48
0
游客
登录 | 注册 方可回帖
返回
//