-
-
[旧帖]
[原创]破解一个小程序(申请邀请码)
0.00雪花
-
发表于:
2009-10-27 10:51
1883
-
[旧帖] [原创]破解一个小程序(申请邀请码)
0.00雪花
【文章标题】: 破解一个小程序
【文章作者】: 无名无姓
【作者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日开班!