-
-
对book2中GC Crackme #9算法分析
-
发表于: 2007-8-15 02:25 3701
-
【文章标题】: GC Crackme #9
【文章作者】: ggdd
【作者邮箱】: huangyi8088@163.com
【作者QQ号】: 194793
【软件名称】: GC Crackme #9
【下载地址】: 看雪的book2中
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这个算法难度算中上,主要是算法比较烦琐,不知道以前有人发过没。
废话不说了。
OD载入找出错字符串 Sorry Cracker, wrong
好象有自效验
004012BC 6A 00 PUSH 0 断在这里
004012BE FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
004012C4 E8 77040000 CALL <JMP.&USER32.SetWindowTextA>
004012C9 6A 00 PUSH 0
004012CB 68 B90B0000 PUSH 0BB9
004012D0 FF75 08 PUSH DWORD PTR SS:[EBP+8]
004012D3 E8 56040000 CALL <JMP.&USER32.SetDlgItemTextA>
004012D8 6A 40 PUSH 40
004012DA 68 30314000 PUSH czCrackM.00403130
004012DF E8 92040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
004012E4 6A 40 PUSH 40
004012E6 68 70314000 PUSH czCrackM.00403170
004012EB E8 86040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
004012F0 6A 40 PUSH 40
004012F2 68 F0304000 PUSH czCrackM.004030F0
004012F7 E8 7A040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
004012FC 6A 40 PUSH 40
004012FE 68 B0314000 PUSH czCrackM.004031B0
00401303 E8 6E040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
00401308 C705 E4304000>MOV DWORD PTR DS:[4030E4],0
00401312 C705 E8304000>MOV DWORD PTR DS:[4030E8],0
0040131C C705 EC304000>MOV DWORD PTR DS:[4030EC],0
00401326 FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
0040132C E8 03040000 CALL <JMP.&USER32.SetFocus>
00401331 E9 7E010000 JMP czCrackM.004014B4
00401336 66:83F8 65 CMP AX,65
0040133A 0F85 66010000 JNZ czCrackM.004014A6
00401340 6A 40 PUSH 40
00401342 68 30314000 PUSH czCrackM.00403130
00401347 FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
0040134D E8 A6030000 CALL <JMP.&USER32.GetWindowTextA>
00401352 83F8 04 CMP EAX,4
00401355 0F8E E9000000 JLE czCrackM.00401444
0040135B |. 6A 40 PUSH 40 ; /Count = 40 (64.)
0040135D |. 68 70314000 PUSH czCrackM.00403170 ; |Buffer = czCrackM.00403170
00401362 |. 68 B90B0000 PUSH 0BB9 ; |ControlID = BB9 (3001.)
00401367 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040136A |. E8 77030000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040136F |. 83F8 04 CMP EAX,4 //注册码和4比较 小于等于就卡擦
00401372 0F8E CC000000 JLE czCrackM.00401444
00401378 |. A3 BF304000 MOV DWORD PTR DS:[4030BF],EAX
0040137D |. FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
|. E8 AC030000 CALL <JMP.&USER32.SetFocus>
00401388 |. BF 30314000 MOV EDI,czCrackM.00403130
0040138D |. BE 30314000 MOV ESI,czCrackM.00403130
00401392 |> AC /LODS BYTE PTR DS:[ESI]
00401393 |. 0C 00 |OR AL,0
00401395 |. 74 05 |JE SHORT czCrackM.0040139C
00401397 |. 0C 20 |OR AL,20
00401399 |. AA |STOS BYTE PTR ES:[EDI]
0040139A |.^ EB F6 \JMP SHORT czCrackM.00401392
0040139C |> BF 70314000 MOV EDI,czCrackM.00403170 //注册码送DI
004013A1 |. BE 70314000 MOV ESI,czCrackM.00403170 //注册码送DI
004013A6 |. 8D1D 30314000 LEA EBX,DWORD PTR DS:[403130]
004013AC |> AC /LODS BYTE PTR DS:[ESI] //注册码送AL
004013AD |. 0C 00 |OR AL,0
004013AF |. 74 0A |JE SHORT czCrackM.004013BB
004013B1 |. 8A13 |MOV DL,BYTE PTR DS:[EBX] //0送DI
004013B3 |. 2AD0 |SUB DL,AL //0减注册码
004013B5 |. 8AC2 |MOV AL,DL
004013B7 |. AA |STOS BYTE PTR ES:[EDI]
004013B8 |. 43 |INC EBX
004013B9 |.^ EB F1 \JMP SHORT czCrackM.004013AC //逐个用0减注册码 循环
004013BB |> 8B0D BF304000 MOV ECX,DWORD PTR DS:[4030BF]
004013C1 |> 80C9 00 /OR CL,0
004013C4 |. 74 60 |JE SHORT czCrackM.00401426
004013C6 |. 51 |PUSH ECX
004013C7 |. 68 70314000 |PUSH czCrackM.00403170
004013CC |. E8 83020000 |CALL czCrackM.00401654 //第一个算法CALL
004013D1 |. F7E1 |MUL ECX //刚才固定码+处理过的注册码再乘上注册码个数,我是6位的,第一次乘6,第2次乘5依次相乘所以要乘6次
004013D3 |. 68 B0314000 |PUSH czCrackM.004031B0
004013D8 |. 50 |PUSH EAX
004013D9 |. E8 BE020000 |CALL czCrackM.0040169C//这个CALL把每次相乘的数取低8位再转成10进制,生成个10位的10进制数
004013DE |. BF B0314000 |MOV EDI,czCrackM.004031B0
004013E3 |. BE B0314000 |MOV ESI,czCrackM.004031B0
004013E8 |> AC |/LODS BYTE PTR DS:[ESI]
004013E9 |. 0C 00 ||OR AL,0
004013EB |. 74 06 ||JE SHORT czCrackM.004013F3
004013ED |. 83E0 0F ||AND EAX,0F //10进制数依次和OF AND运算
004013F0 |. AA ||STOS BYTE PTR ES:[EDI]
004013F1 |.^ EB F5 |\JMP SHORT czCrackM.004013E8
004013F3 |> 8B0D BF304000 |MOV ECX,DWORD PTR DS:[4030BF]
004013F9 |. D1E9 |SHR ECX,1
004013FB |. BF F0304000 |MOV EDI,czCrackM.004030F0
00401400 |. BE B0314000 |MOV ESI,czCrackM.004031B0
00401405 |. 8D99 B0314000 |LEA EBX,DWORD PTR DS:[ECX+4031B0]//取10位数的第四位地址
0040140B |> 80C9 00 |/OR CL,0
0040140E |. 74 12 ||JE SHORT czCrackM.00401422
00401410 |. AC ||LODS BYTE PTR DS:[ESI]
00401411 |. 33D2 ||XOR EDX,EDX
00401413 |. 8A13 ||MOV DL,BYTE PTR DS:[EBX] //第四位数送DL
00401415 |. 02C2 ||ADD AL,DL //第一位和第四位 2和5 3和6+
00401417 |. 8A17 ||MOV DL,BYTE PTR DS:[EDI] //第一位和第四位相+后OF AND后的数,第一次是0,第2次是第一次1和四位和AND OF处理后相+的和
00401419 |. 02C2 ||ADD AL,DL //再累+
0040141B |. 24 0F ||AND AL,0F //和OF AND
0040141D |. AA ||STOS BYTE PTR ES:[EDI] //把处理后的数送DI
0040141E |. 49 ||DEC ECX //-1 2和5
0040141F |. 43 ||INC EBX //+1
00401420 |.^ EB E9 |\JMP SHORT czCrackM.0040140B //循环3次1和4,2和5,3和6位 再跳回004013D1取固定值+第一次处理后的注册码和5相乘,依次循环6次分别和4321的相乘再取低8位转10进制数
00401422 |> 59 |POP ECX
00401423 |. 49 |DEC ECX
00401424 |.^ EB 9B \JMP SHORT czCrackM.004013C1
00401426 |> BE F0304000 MOV ESI,czCrackM.004030F0
0040142B |. 8B1D BF304000 MOV EBX,DWORD PTR DS:[4030BF] //输入注册的的个数
送BX 我输入的是6位的所以为6
00401431 |. 8BCB MOV ECX,EBX
00401433 |. D1E9 SHR ECX,1
00401435 |> 8A06 /MOV AL,BYTE PTR DS:[ESI] //把最后累加的第1位和第4位,2和5,3和6的和送AL
00401437 |. 80C9 00 |OR CL,0
0040143A 74 39 JE SHORT czCrackM.00401475
0040143C |. 38D8 |CMP AL,BL //比较第一位和第四位的数的相加的和与你输入的注册码个数相等没,不相等就挂。比较3次。分别为1和4 2和5 3和6
0040143E 75 04 JNZ SHORT czCrackM.00401444//关键跳,分别比较1和4,2和5,3和6位
00401440 |. 46 |INC ESI
00401441 |. 49 |DEC ECX
00401442 |.^ EB F1 \JMP SHORT czCrackM.00401435
00401444 |> 68 00200000 PUSH 2000 ; /Style = MB_OK|MB_TASKMODAL
00401449 |. 68 18304000 PUSH czCrackM.00403018 ; | error
0040144E |. 68 41304000 PUSH czCrackM.00403041 ; | sorry cracker, wrong.
00401453 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401456 |. E8 BB020000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
0040145B |. 6A 40 PUSH 40 ; /Length = 40 (64.)
0040145D |. 68 F0304000 PUSH czCrackM.004030F0 ; |Destination = czCrackM.004030F0
00401462 |. E8 0F030000 CALL <JMP.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory
00401467 |. 6A 40 PUSH 40 ; /Length = 40 (64.)
00401469 |. 68 B0314000 PUSH czCrackM.004031B0 ; |Destination = czCrackM.004031B0
0040146E |. E8 03030000 CALL <JMP.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory
00401473 |. EB 2F JMP SHORT czCrackM.004014A4
00401475 |> 68 00200000 PUSH 2000 ; /Style = MB_OK|MB_TASKMODAL
0040147A |. 68 2D304000 PUSH czCrackM.0040302D ; | <registered>
0040147F |. 68 5A304000 PUSH czCrackM.0040305A ; | you did it!
00401484 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
算法CALL1
00401654 /$ 55 PUSH EBP
00401655 |. 8BEC MOV EBP,ESP
00401657 |. 51 PUSH ECX //固定值7C80BDE6
00401658 |. 57 PUSH EDI
00401659 |. 52 PUSH EDX
0040165A |. 56 PUSH ESI
0040165B |. 33C9 XOR ECX,ECX
0040165D |. 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8]
00401660 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; /String
00401663 |. E8 FC000000 CALL <JMP.&KERNEL32.lstrlenA> ; \lstrlenA
00401668 |. EB 23 JMP SHORT czCrackM.0040168D
0040166A |> 33D2 /XOR EDX,EDX
0040166C |. 8A17 |MOV DL,BYTE PTR DS:[EDI]
0040166E |. 80EA 30 |SUB DL,30 //被0减过的注册码再减30
00401671 |. 8BF0 |MOV ESI,EAX
00401673 |. 4E |DEC ESI
00401674 |. 50 |PUSH EAX
00401675 |. 8BC2 |MOV EAX,EDX
00401677 |. 53 |PUSH EBX
00401678 |. BB 0A000000 |MOV EBX,0A //把乘数送BX OA
0040167D |. EB 03 |JMP SHORT czCrackM.00401682
0040167F |> F7E3 |/MUL EBX //注册码乘OA
00401681 |. 4E ||DEC ESI //控制乘的次数 第一位注册玛乘5次,2位再4次 ,最后一位注册码不乘
00401682 |> 83FE 00 | CMP ESI,0
00401685 |.^ 77 F8 |\JA SHORT czCrackM.0040167F
00401687 |. 5B |POP EBX
00401688 |. 03C8 |ADD ECX,EAX //固定码+上乘过的注册码
0040168A |. 58 |POP EAX
0040168B |. 47 |INC EDI
0040168C |. 48 |DEC EAX
0040168D |> 0BC0 OR EAX,EAX
0040168F |.^ 75 D9 \JNZ SHORT czCrackM.0040166A//循环乘再累+
00401691 |. 8BC1 MOV EAX,ECX //加完总和送AX
00401693 |. 5E POP ESI
00401694 |. 5A POP EDX
00401695 |. 5F POP EDI
00401696 |. 59 POP ECX
00401697 |. C9 LEAVE
00401698 \. C2 0400 RET 4
总结
这个算法比较烦琐。如果有分析错误大牛门指出。
[(0-密码)-30]*OA*OA*OA*OA*OA=(1)
[(0-密码)-30]*OA*OA*OA*OA+(1)=(2)
[(0-密码)-30]*OA*OA*OA+(2)=(3)
[(0-密码)-30]*OA*OA*+(3)=(4)
[(0-密码)-30]*OA+(4)=(5)
[(0-密码)-30]+(5)=(6)
(6)+7C80BDE6=(7)
(7)*6=第1组10进制数
(7)*5=第2组10进制数
(7)*4=第3组10进制数
(7)*3=第4组10进制数
(7)*2=第5组10进制数
(7)*1=第6组10进制数
我乘出来的是只要6位就行了后面4位不影响
4048220000 第1位和第4位4+8=0C
1941860000 1+1+0C=0E
4130470000 4+0+0E=12(经AND OF运算后最后等于2)
2024110000 2+4+2=8
4212720000 4+2+8=0E
2106360000 2+6+0E(经AND OF运算后最后等于6)
4048220000 第2位和第5位0+2=02
1941860000 9+8+2(经AND OF运算后最后等于3)
4130470000 1+4+3=8
2024110000 0+1+8=9
4212720000 2+7+9(经AND OF运算后最后等于2)
2106360000 1+3+2=6
4048220000 第3位和第6位4+2=6
1941860000 4+6+6(经AND OF运算后最后等于0)
4130470000 3+7+0=0A
2024110000 2+1+0A=0D
4212720000 1+2+0D(经AND OF运算后最后等于0)
2106360000 0+6+0=6
1和4,2和5,3和6累加最后和你输入的注册码相同就行了我输入的是6位注册码
提供一个注册码
19Qp1z
有错误请大家指出 谢谢
【文章作者】: ggdd
【作者邮箱】: huangyi8088@163.com
【作者QQ号】: 194793
【软件名称】: GC Crackme #9
【下载地址】: 看雪的book2中
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这个算法难度算中上,主要是算法比较烦琐,不知道以前有人发过没。
废话不说了。
OD载入找出错字符串 Sorry Cracker, wrong
好象有自效验
004012BC 6A 00 PUSH 0 断在这里
004012BE FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
004012C4 E8 77040000 CALL <JMP.&USER32.SetWindowTextA>
004012C9 6A 00 PUSH 0
004012CB 68 B90B0000 PUSH 0BB9
004012D0 FF75 08 PUSH DWORD PTR SS:[EBP+8]
004012D3 E8 56040000 CALL <JMP.&USER32.SetDlgItemTextA>
004012D8 6A 40 PUSH 40
004012DA 68 30314000 PUSH czCrackM.00403130
004012DF E8 92040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
004012E4 6A 40 PUSH 40
004012E6 68 70314000 PUSH czCrackM.00403170
004012EB E8 86040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
004012F0 6A 40 PUSH 40
004012F2 68 F0304000 PUSH czCrackM.004030F0
004012F7 E8 7A040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
004012FC 6A 40 PUSH 40
004012FE 68 B0314000 PUSH czCrackM.004031B0
00401303 E8 6E040000 CALL <JMP.&KERNEL32.RtlZeroMemory>
00401308 C705 E4304000>MOV DWORD PTR DS:[4030E4],0
00401312 C705 E8304000>MOV DWORD PTR DS:[4030E8],0
0040131C C705 EC304000>MOV DWORD PTR DS:[4030EC],0
00401326 FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
0040132C E8 03040000 CALL <JMP.&USER32.SetFocus>
00401331 E9 7E010000 JMP czCrackM.004014B4
00401336 66:83F8 65 CMP AX,65
0040133A 0F85 66010000 JNZ czCrackM.004014A6
00401340 6A 40 PUSH 40
00401342 68 30314000 PUSH czCrackM.00403130
00401347 FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
0040134D E8 A6030000 CALL <JMP.&USER32.GetWindowTextA>
00401352 83F8 04 CMP EAX,4
00401355 0F8E E9000000 JLE czCrackM.00401444
0040135B |. 6A 40 PUSH 40 ; /Count = 40 (64.)
0040135D |. 68 70314000 PUSH czCrackM.00403170 ; |Buffer = czCrackM.00403170
00401362 |. 68 B90B0000 PUSH 0BB9 ; |ControlID = BB9 (3001.)
00401367 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040136A |. E8 77030000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040136F |. 83F8 04 CMP EAX,4 //注册码和4比较 小于等于就卡擦
00401372 0F8E CC000000 JLE czCrackM.00401444
00401378 |. A3 BF304000 MOV DWORD PTR DS:[4030BF],EAX
0040137D |. FF35 C3304000 PUSH DWORD PTR DS:[4030C3]
|. E8 AC030000 CALL <JMP.&USER32.SetFocus>
00401388 |. BF 30314000 MOV EDI,czCrackM.00403130
0040138D |. BE 30314000 MOV ESI,czCrackM.00403130
00401392 |> AC /LODS BYTE PTR DS:[ESI]
00401393 |. 0C 00 |OR AL,0
00401395 |. 74 05 |JE SHORT czCrackM.0040139C
00401397 |. 0C 20 |OR AL,20
00401399 |. AA |STOS BYTE PTR ES:[EDI]
0040139A |.^ EB F6 \JMP SHORT czCrackM.00401392
0040139C |> BF 70314000 MOV EDI,czCrackM.00403170 //注册码送DI
004013A1 |. BE 70314000 MOV ESI,czCrackM.00403170 //注册码送DI
004013A6 |. 8D1D 30314000 LEA EBX,DWORD PTR DS:[403130]
004013AC |> AC /LODS BYTE PTR DS:[ESI] //注册码送AL
004013AD |. 0C 00 |OR AL,0
004013AF |. 74 0A |JE SHORT czCrackM.004013BB
004013B1 |. 8A13 |MOV DL,BYTE PTR DS:[EBX] //0送DI
004013B3 |. 2AD0 |SUB DL,AL //0减注册码
004013B5 |. 8AC2 |MOV AL,DL
004013B7 |. AA |STOS BYTE PTR ES:[EDI]
004013B8 |. 43 |INC EBX
004013B9 |.^ EB F1 \JMP SHORT czCrackM.004013AC //逐个用0减注册码 循环
004013BB |> 8B0D BF304000 MOV ECX,DWORD PTR DS:[4030BF]
004013C1 |> 80C9 00 /OR CL,0
004013C4 |. 74 60 |JE SHORT czCrackM.00401426
004013C6 |. 51 |PUSH ECX
004013C7 |. 68 70314000 |PUSH czCrackM.00403170
004013CC |. E8 83020000 |CALL czCrackM.00401654 //第一个算法CALL
004013D1 |. F7E1 |MUL ECX //刚才固定码+处理过的注册码再乘上注册码个数,我是6位的,第一次乘6,第2次乘5依次相乘所以要乘6次
004013D3 |. 68 B0314000 |PUSH czCrackM.004031B0
004013D8 |. 50 |PUSH EAX
004013D9 |. E8 BE020000 |CALL czCrackM.0040169C//这个CALL把每次相乘的数取低8位再转成10进制,生成个10位的10进制数
004013DE |. BF B0314000 |MOV EDI,czCrackM.004031B0
004013E3 |. BE B0314000 |MOV ESI,czCrackM.004031B0
004013E8 |> AC |/LODS BYTE PTR DS:[ESI]
004013E9 |. 0C 00 ||OR AL,0
004013EB |. 74 06 ||JE SHORT czCrackM.004013F3
004013ED |. 83E0 0F ||AND EAX,0F //10进制数依次和OF AND运算
004013F0 |. AA ||STOS BYTE PTR ES:[EDI]
004013F1 |.^ EB F5 |\JMP SHORT czCrackM.004013E8
004013F3 |> 8B0D BF304000 |MOV ECX,DWORD PTR DS:[4030BF]
004013F9 |. D1E9 |SHR ECX,1
004013FB |. BF F0304000 |MOV EDI,czCrackM.004030F0
00401400 |. BE B0314000 |MOV ESI,czCrackM.004031B0
00401405 |. 8D99 B0314000 |LEA EBX,DWORD PTR DS:[ECX+4031B0]//取10位数的第四位地址
0040140B |> 80C9 00 |/OR CL,0
0040140E |. 74 12 ||JE SHORT czCrackM.00401422
00401410 |. AC ||LODS BYTE PTR DS:[ESI]
00401411 |. 33D2 ||XOR EDX,EDX
00401413 |. 8A13 ||MOV DL,BYTE PTR DS:[EBX] //第四位数送DL
00401415 |. 02C2 ||ADD AL,DL //第一位和第四位 2和5 3和6+
00401417 |. 8A17 ||MOV DL,BYTE PTR DS:[EDI] //第一位和第四位相+后OF AND后的数,第一次是0,第2次是第一次1和四位和AND OF处理后相+的和
00401419 |. 02C2 ||ADD AL,DL //再累+
0040141B |. 24 0F ||AND AL,0F //和OF AND
0040141D |. AA ||STOS BYTE PTR ES:[EDI] //把处理后的数送DI
0040141E |. 49 ||DEC ECX //-1 2和5
0040141F |. 43 ||INC EBX //+1
00401420 |.^ EB E9 |\JMP SHORT czCrackM.0040140B //循环3次1和4,2和5,3和6位 再跳回004013D1取固定值+第一次处理后的注册码和5相乘,依次循环6次分别和4321的相乘再取低8位转10进制数
00401422 |> 59 |POP ECX
00401423 |. 49 |DEC ECX
00401424 |.^ EB 9B \JMP SHORT czCrackM.004013C1
00401426 |> BE F0304000 MOV ESI,czCrackM.004030F0
0040142B |. 8B1D BF304000 MOV EBX,DWORD PTR DS:[4030BF] //输入注册的的个数
送BX 我输入的是6位的所以为6
00401431 |. 8BCB MOV ECX,EBX
00401433 |. D1E9 SHR ECX,1
00401435 |> 8A06 /MOV AL,BYTE PTR DS:[ESI] //把最后累加的第1位和第4位,2和5,3和6的和送AL
00401437 |. 80C9 00 |OR CL,0
0040143A 74 39 JE SHORT czCrackM.00401475
0040143C |. 38D8 |CMP AL,BL //比较第一位和第四位的数的相加的和与你输入的注册码个数相等没,不相等就挂。比较3次。分别为1和4 2和5 3和6
0040143E 75 04 JNZ SHORT czCrackM.00401444//关键跳,分别比较1和4,2和5,3和6位
00401440 |. 46 |INC ESI
00401441 |. 49 |DEC ECX
00401442 |.^ EB F1 \JMP SHORT czCrackM.00401435
00401444 |> 68 00200000 PUSH 2000 ; /Style = MB_OK|MB_TASKMODAL
00401449 |. 68 18304000 PUSH czCrackM.00403018 ; | error
0040144E |. 68 41304000 PUSH czCrackM.00403041 ; | sorry cracker, wrong.
00401453 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401456 |. E8 BB020000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
0040145B |. 6A 40 PUSH 40 ; /Length = 40 (64.)
0040145D |. 68 F0304000 PUSH czCrackM.004030F0 ; |Destination = czCrackM.004030F0
00401462 |. E8 0F030000 CALL <JMP.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory
00401467 |. 6A 40 PUSH 40 ; /Length = 40 (64.)
00401469 |. 68 B0314000 PUSH czCrackM.004031B0 ; |Destination = czCrackM.004031B0
0040146E |. E8 03030000 CALL <JMP.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory
00401473 |. EB 2F JMP SHORT czCrackM.004014A4
00401475 |> 68 00200000 PUSH 2000 ; /Style = MB_OK|MB_TASKMODAL
0040147A |. 68 2D304000 PUSH czCrackM.0040302D ; | <registered>
0040147F |. 68 5A304000 PUSH czCrackM.0040305A ; | you did it!
00401484 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
算法CALL1
00401654 /$ 55 PUSH EBP
00401655 |. 8BEC MOV EBP,ESP
00401657 |. 51 PUSH ECX //固定值7C80BDE6
00401658 |. 57 PUSH EDI
00401659 |. 52 PUSH EDX
0040165A |. 56 PUSH ESI
0040165B |. 33C9 XOR ECX,ECX
0040165D |. 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8]
00401660 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; /String
00401663 |. E8 FC000000 CALL <JMP.&KERNEL32.lstrlenA> ; \lstrlenA
00401668 |. EB 23 JMP SHORT czCrackM.0040168D
0040166A |> 33D2 /XOR EDX,EDX
0040166C |. 8A17 |MOV DL,BYTE PTR DS:[EDI]
0040166E |. 80EA 30 |SUB DL,30 //被0减过的注册码再减30
00401671 |. 8BF0 |MOV ESI,EAX
00401673 |. 4E |DEC ESI
00401674 |. 50 |PUSH EAX
00401675 |. 8BC2 |MOV EAX,EDX
00401677 |. 53 |PUSH EBX
00401678 |. BB 0A000000 |MOV EBX,0A //把乘数送BX OA
0040167D |. EB 03 |JMP SHORT czCrackM.00401682
0040167F |> F7E3 |/MUL EBX //注册码乘OA
00401681 |. 4E ||DEC ESI //控制乘的次数 第一位注册玛乘5次,2位再4次 ,最后一位注册码不乘
00401682 |> 83FE 00 | CMP ESI,0
00401685 |.^ 77 F8 |\JA SHORT czCrackM.0040167F
00401687 |. 5B |POP EBX
00401688 |. 03C8 |ADD ECX,EAX //固定码+上乘过的注册码
0040168A |. 58 |POP EAX
0040168B |. 47 |INC EDI
0040168C |. 48 |DEC EAX
0040168D |> 0BC0 OR EAX,EAX
0040168F |.^ 75 D9 \JNZ SHORT czCrackM.0040166A//循环乘再累+
00401691 |. 8BC1 MOV EAX,ECX //加完总和送AX
00401693 |. 5E POP ESI
00401694 |. 5A POP EDX
00401695 |. 5F POP EDI
00401696 |. 59 POP ECX
00401697 |. C9 LEAVE
00401698 \. C2 0400 RET 4
总结
这个算法比较烦琐。如果有分析错误大牛门指出。
[(0-密码)-30]*OA*OA*OA*OA*OA=(1)
[(0-密码)-30]*OA*OA*OA*OA+(1)=(2)
[(0-密码)-30]*OA*OA*OA+(2)=(3)
[(0-密码)-30]*OA*OA*+(3)=(4)
[(0-密码)-30]*OA+(4)=(5)
[(0-密码)-30]+(5)=(6)
(6)+7C80BDE6=(7)
(7)*6=第1组10进制数
(7)*5=第2组10进制数
(7)*4=第3组10进制数
(7)*3=第4组10进制数
(7)*2=第5组10进制数
(7)*1=第6组10进制数
我乘出来的是只要6位就行了后面4位不影响
4048220000 第1位和第4位4+8=0C
1941860000 1+1+0C=0E
4130470000 4+0+0E=12(经AND OF运算后最后等于2)
2024110000 2+4+2=8
4212720000 4+2+8=0E
2106360000 2+6+0E(经AND OF运算后最后等于6)
4048220000 第2位和第5位0+2=02
1941860000 9+8+2(经AND OF运算后最后等于3)
4130470000 1+4+3=8
2024110000 0+1+8=9
4212720000 2+7+9(经AND OF运算后最后等于2)
2106360000 1+3+2=6
4048220000 第3位和第6位4+2=6
1941860000 4+6+6(经AND OF运算后最后等于0)
4130470000 3+7+0=0A
2024110000 2+1+0A=0D
4212720000 1+2+0D(经AND OF运算后最后等于0)
2106360000 0+6+0=6
1和4,2和5,3和6累加最后和你输入的注册码相同就行了我输入的是6位注册码
提供一个注册码
19Qp1z
有错误请大家指出 谢谢
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
赞赏
雪币:
留言: