首页
社区
课程
招聘
[旧帖] [原创]破解一个小程序(申请邀请码) 0.00雪花
发表于: 2009-10-27 10:51 1883

[旧帖] [原创]破解一个小程序(申请邀请码) 0.00雪花

2009-10-27 10:51
1883
【文章标题】: 破解一个小程序
【文章作者】: 无名无姓
【作者QQ号】: 992017170
【软件名称】: qpt^J's  Crackme2
【软件大小】: 33k
【加壳方式】: 无
【保护方式】: 反调试
【编写语言】: MASM32 
【使用工具】: OLLYDBG 
【操作平台】: winXP
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
【详细过程】
反汇编后检查消息循环:

00401165  |.  6A 10         PUSH 10                                  ; |Message = WM_CLOSE
00401167  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
0040116A  |.  E8 17020000   CALL <JMP.&user32.SendMessageA>          ; \SendMessageA
0040116F  |.  E9 3E010000   JMP Crackme2.004012B2                    ;  结束
00401174  |>  3D EE030000   CMP EAX,3EE                              ;  =Check
00401179  |.  0F85 33010000 JNZ Crackme2.004012B2                    ;  结束
0040117F  |.  6A 32         PUSH 32                                  ; /Count = 32 (50.)
00401181  |.  68 48104000   PUSH Crackme2.00401048                   ; |Buffer = Crackme2.00401048
00401186  |.  68 E3050000   PUSH 5E3                                 ; |ControlID = 5E3 (1507.)
0040118B  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
0040118E  |.  E8 E1010000   CALL <JMP.&user32.GetDlgItemTextA>       ; \GetDlgItemTextA
00401193  |.  A3 AE104000   MOV DWORD PTR DS:[4010AE],EAX            ;  得到字符串长度
00401198  |.  BB 01000000   MOV EBX,1
0040119D  |.  E8 18010000   CALL Crackme2.004012BA                   ;  转到算法
004011A2  |.  3D C0F2FCFF   CMP EAX,FFFCF2C0


00401174  |>  3D EE030000   CMP EAX,3EE                              ;  =Check
此处为点击了  Check  控件

00401193  |.  A3 AE104000   MOV DWORD PTR DS:[4010AE],EAX            ;  得到字符串长度
00401198  |.  BB 01000000   MOV EBX,1
0040119D  |.  E8 18010000   CALL Crackme2.004012BA                   ;  转到算法
004011A2  |.  3D C0F2FCFF   CMP EAX,FFFCF2C0

此处对字符串长度进行检查  (为18位)

004011C2  |> \803D 4B104000>CMP BYTE PTR DS:[40104B],2D ;检测第四位为'-'
004011C9  |.^ 75 DE         JNZ SHORT Crackme2.004011A9
004011CB  |.  C605 4B104000>MOV BYTE PTR DS:[40104B],0     ;将第四位变为0
004011D2  |.  803D 51104000>CMP BYTE PTR DS:[401051],2D   ;检测第十位为'-'
004011D9  |.^ 75 CE         JNZ SHORT Crackme2.004011A9
004011DB  |.  C605 51104000>MOV BYTE PTR DS:[401051],0     ;将第十位变为0

由上可得注册码格式为:000-00000-00000000

004011E2  |.  68 48104000   PUSH Crackme2.00401048                   ; /String = ""
004011E7  |.  E8 B2010000   CALL <JMP.&shlwapi.StrToIntA>            ; \StrToIntA
004011EC  |.  BB C4010000   MOV EBX,1C4
004011F1  |.  E8 C4000000   CALL Crackme2.004012BA
004011F6  |.  3D 4FE4F933   CMP EAX,33F9E44F

此处对注册码  第一个'-'  以前的数字进行检测


00401207  |.  50            PUSH EAX                                 ; /String => ""
00401208  |.  E8 91010000   CALL <JMP.&shlwapi.StrToIntA>            ; \StrToIntA
0040120D  |.  E8 0E010000   CALL Crackme2.00401320                   ;  函数two
00401212  |.  83C6 08       ADD ESI,8
00401215  |.  C606 00       MOV BYTE PTR DS:[ESI],0
00401218  |.  83EE 08       SUB ESI,8
0040121B  |.  56            PUSH ESI                                 ; /String
0040121C  |.  E8 7D010000   CALL <JMP.&shlwapi.StrToIntA>            ; \StrToIntA
00401221  |.  8BD8          MOV EBX,EAX
00401223  |.  83C6 09       ADD ESI,9
00401226  |.  56            PUSH ESI                                 ; /String
00401227  |.  E8 72010000   CALL <JMP.&shlwapi.StrToIntA>            ; \StrToIntA
0040122C  |.  33C3          XOR EAX,EBX
0040122E  |.  83F0 01       XOR EAX,1
00401231  |.  BB 3E1D0000   MOV EBX,1D3E
00401236  |.  E8 7F000000   CALL Crackme2.004012BA                   ;  调用算法
0040123B  |.  3D 6C5E3B0A   CMP EAX,0A3B5E6C

 此处对第二个'-'前的数字进行检测

00401246  |.  BE 52104000   MOV ESI,Crackme2.00401052                ;  第三段数字
0040124B  |.  56            PUSH ESI                                 ; /String => ""
0040124C  |.  E8 4D010000   CALL <JMP.&shlwapi.StrToIntA>            ; \StrToIntA
00401251  |.  BB 71139200   MOV EBX,921371
00401256  |.  E8 5F000000   CALL Crackme2.004012BA                   ;  调用算法
0040125B  |.  BE 17114000   MOV ESI,Crackme2.00401117                ;  字符last
00401260  |.  E8 BB000000   CALL Crackme2.00401320                   ;  two
00401265  |.  BF 25104000   MOV EDI,Crackme2.00401025                ;  ASCII "100011110001001111000010001001"
0040126A  |.  BB 1E000000   MOV EBX,1E
0040126F  |.  33C0          XOR EAX,EAX
00401271  |.  33C9          XOR ECX,ECX
00401273  |.  33D2          XOR EDX,EDX
00401275  |>  AC            /LODS BYTE PTR DS:[ESI]
00401276  |.  8A0F          |MOV CL,BYTE PTR DS:[EDI]
00401278  |.  33C1          |XOR EAX,ECX
0040127A  |.  03D0          |ADD EDX,EAX
0040127C  |.  47            |INC EDI
0040127D  |.  4B            |DEC EBX

此处对第三段数字进行检测  

对第三部分进行检测时  分两步进行:
1:将第三段数字经过两次变型得到一个char型数组
00401246  |.  BE 52104000   MOV ESI,Crackme2.00401052                ;  第三段数字
0040124B  |.  56            PUSH ESI                                 ; /String => ""
0040124C  |.  E8 4D010000   CALL <JMP.&shlwapi.StrToIntA>            ; \StrToIntA
00401251  |.  BB 71139200   MOV EBX,921371
00401256  |.  E8 5F000000   CALL Crackme2.004012BA                   ;  调用算法
0040125B  |.  BE 17114000   MOV ESI,Crackme2.00401117                ;  字符last
00401260  |.  E8 BB000000   CALL Crackme2.00401320                   ;  two

2:将得到的char型数组与"100011110001001111000010001001"进行比较 
00401275  |> /AC            /LODS BYTE PTR DS:[ESI]
00401276  |. |8A0F          |MOV CL,BYTE PTR DS:[EDI]
00401278  |. |33C1          |XOR EAX,ECX
0040127A  |. |03D0          |ADD EDX,EAX
0040127C  |. |47            |INC EDI
0040127D  |. |4B            |DEC EBX
0040127E  |.^\75 F5         \JNZ SHORT Crackme2.00401275


通过以上分析  :我写出了分别对三段数字进行检查,以得出正确数字的程序放在下面
破解后的码为:739-10268-10036942
说明:第三段数字很大  ,检测所需时间太长

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 505
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错的,支持楼主
2009-10-27 14:16
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
顶个~~~~
2009-10-27 15:24
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
进来学习下,谢谢了
2009-10-27 16:49
0
游客
登录 | 注册 方可回帖
返回