【破文标题】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平台漏洞挖掘!
上传的附件: