首页
社区
课程
招聘
对book2中GC Crackme #9算法分析
发表于: 2007-8-15 02:25 3701

对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
有错误请大家指出 谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回