agang 发表于 2006-7-22 21:51:39

成功助理V1.20破解的算法分析就差一点成功了!

软件地址http://down1.tech.sina.com.cn/download/downContent/2006-04-28/17705.shtml
追码成功,内存注册机也不劳驾兄弟们了.

我直接贴上算法部分,在此

00613885   .55            PUSH EBP
00613886   .68 9E3A6100   PUSH cgzl_exe.00613A9E
0061388B   .64:FF30       PUSH DWORD PTR FS:
0061388E   .64:8920       MOV DWORD PTR FS:,ESP
00613891   .8D45 DC       LEA EAX,DWORD PTR SS:
00613894   .E8 B31ADFFF   CALL cgzl_exe.0040534C
00613899   .8D45 F0       LEA EAX,DWORD PTR SS:
0061389C   .BA B43A6100   MOV EDX,cgzl_exe.00613AB4                      ;软件固定码 "*1^cgsxy*-",下面要参与真码运算
006138A1   .E8 3E1BDFFF   CALL cgzl_exe.004053E4
006138A6   .8D45 F4       LEA EAX,DWORD PTR SS:
006138A9   .8B55 FC       MOV EDX,DWORD PTR SS:                   ;还是用户名
006138AC   .E8 331BDFFF   CALL cgzl_exe.004053E4
006138B1   .8B45 F4       MOV EAX,DWORD PTR SS:
006138B4   .E8 531DDFFF   CALL cgzl_exe.0040560C
006138B9   .8BF8          MOV EDI,EAX
006138BB   .8B45 FC       MOV EAX,DWORD PTR SS:
006138BE   .E8 491DDFFF   CALL cgzl_exe.0040560C                         ;取用户名长存入EAX,我的是7位长
006138C3   .83F8 06       CMP EAX,6
006138C6   .7D 0D         JGE SHORT cgzl_exe.006138D5                  ;大于等于6就往下跳
006138C8   .8B45 F8       MOV EAX,DWORD PTR SS:
006138CB   .E8 7C1ADFFF   CALL cgzl_exe.0040534C
006138D0   .E9 99010000   JMP cgzl_exe.00613A6E
006138D5   >33C9          XOR ECX,ECX
006138D7   .55            PUSH EBP
006138D8   .68 593A6100   PUSH cgzl_exe.00613A59
006138DD   .64:FF31       PUSH DWORD PTR FS:
006138E0   .64:8921       MOV DWORD PTR FS:,ESP
006138E3   .8D55 CC       LEA EDX,DWORD PTR SS:
006138E6   .8B45 F4       MOV EAX,DWORD PTR SS:
006138E9   .E8 7AC5FFFF   CALL cgzl_exe.0060FE68
006138EE   .8D45 EC       LEA EAX,DWORD PTR SS:
006138F1   .E8 561ADFFF   CALL cgzl_exe.0040534C
006138F6   .8B45 F0       MOV EAX,DWORD PTR SS:                  ;存的是软件预设码
006138F9   .E8 0E1DDFFF   CALL cgzl_exe.0040560C                         ;取预设码的长度,是A(10进制的10位长)
006138FE   .8BF0          MOV ESI,EAX                                    ;预设码长度存入ESI
00613900   .85F6          TEST ESI,ESI
00613902   .7E 39         JLE SHORT cgzl_exe.0061393D                  ;ESI<=0时就不进入下面的循环了。
00613904   .BB 01000000   MOV EBX,1                                    ;EBX=1,开始为下面的循环计数
00613909   >8BC3          MOV EAX,EBX                                    ;循环开始处。。。
0061390B   .48            DEC EAX
0061390C   .99            CDQ
0061390D   .F7FF          IDIV EDI                                       ;这实现两个带符号数的二进制除法运算.
0061390F   .8B45 F4       MOV EAX,DWORD PTR SS:                   ;用户名放入EAX
00613912   .0FB61410      MOVZX EDX,BYTE PTR DS:                ;逐位取用户名的ASCII码
00613916   .83C2 50       ADD EDX,50                                     ;每个字符+50(十进制就是80)后
00613919   .83F2 7F       XOR EDX,7F                                     ;与7F异或,记作S1,放在EDX
0061391C   .8B45 F0       MOV EAX,DWORD PTR SS:                  ;系统预设码 "*1^cgsxy*-"
0061391F   .0FB64418 FF   MOVZX EAX,BYTE PTR DS:            ;逐位取固定码ASCII,记为S2,呵呵
00613924   .33D0          XOR EDX,EAX                                    ;S1与S2异或,结果存在EDX
00613926   .8D45 98       LEA EAX,DWORD PTR SS:
00613929   .E8 061CDFFF   CALL cgzl_exe.00405534
0061392E   .8B55 98       MOV EDX,DWORD PTR SS:
00613931   .8D45 EC       LEA EAX,DWORD PTR SS:
00613934   .E8 DB1CDFFF   CALL cgzl_exe.00405614
00613939   .43            INC EBX                                        ;用户名的计次数+1
0061393A   .4E            DEC ESI                                        ;ESI存的是预设码长,作用也是计数的,取完后就跳出循环
0061393B   .^ 75 CC         JNZ SHORT cgzl_exe.00613909                  ;预设码没取完就跳到循环开始处。。。
0061393D   >8D55 BC       LEA EDX,DWORD PTR SS:
00613940   .8B45 EC       MOV EAX,DWORD PTR SS:
00613943   .E8 20C5FFFF   CALL cgzl_exe.0060FE68                         ;好像是做了某字串的MD5加密
00613948   .BB 10000000   MOV EBX,10                                     ;EBX=16
0061394D   .8D45 CC       LEA EAX,DWORD PTR SS:
00613950   .8D55 BC       LEA EDX,DWORD PTR SS:
00613953   .8D75 AC       LEA ESI,DWORD PTR SS:
00613956   >8A08          MOV CL,BYTE PTR DS:                     ;这里的循环生成了下面的32位长的字符串,是不是MD5的32位加密,呵呵
00613958   .320A          XOR CL,BYTE PTR DS:
0061395A   .880E          MOV BYTE PTR DS:,CL
0061395C   .46            INC ESI
0061395D   .42            INC EDX
0061395E   .40            INC EAX
0061395F   .4B            DEC EBX                                        ;计数器
00613960   .^ 75 F4         JNZ SHORT cgzl_exe.00613956                  ;这里是第二个关键循环尾
00613962   .8D55 E8       LEA EDX,DWORD PTR SS:
00613965   .8D45 AC       LEA EAX,DWORD PTR SS:
00613968   .E8 6FC5FFFF   CALL cgzl_exe.0060FEDC
0061396D   .8D45 E4       LEA EAX,DWORD PTR SS:
00613970   .E8 D719DFFF   CALL cgzl_exe.0040534C                         ;0344a74b07b691ef6315828979647fdf第二部分算法要用到
00613975   .8B45 E8       MOV EAX,DWORD PTR SS:
00613978   .E8 8F1CDFFF   CALL cgzl_exe.0040560C
0061397D   .8BF0          MOV ESI,EAX
0061397F   .D1FE          SAR ESI,1
00613981   .79 03         JNS SHORT cgzl_exe.00613986
00613983   .83D6 00       ADC ESI,0
00613986   >4E            DEC ESI
00613987   .85F6          TEST ESI,ESI
00613989   .7C 3A         JL SHORT cgzl_exe.006139C5
0061398B   .46            INC ESI
0061398C   .33DB          XOR EBX,EBX
0061398E   >8D45 E0       LEA EAX,DWORD PTR SS:
00613991   .50            PUSH EAX
00613992   .8BD3          MOV EDX,EBX
00613994   .03D2          ADD EDX,EDX
00613996   .42            INC EDX
00613997   .B9 02000000   MOV ECX,2
0061399C   .8B45 E8       MOV EAX,DWORD PTR SS:                  ;放的是MD5加密32位字符串,是不是MD5呀,猜的
0061399F   .E8 C81EDFFF   CALL cgzl_exe.0040586C
006139A4   .8B45 E0       MOV EAX,DWORD PTR SS:
006139A7   .E8 E8FDFFFF   CALL cgzl_exe.00613794
006139AC   .8BD0          MOV EDX,EAX
006139AE   .8D45 94       LEA EAX,DWORD PTR SS:
006139B1   .E8 7E1BDFFF   CALL cgzl_exe.00405534
006139B6   .8B55 94       MOV EDX,DWORD PTR SS:
006139B9   .8D45 E4       LEA EAX,DWORD PTR SS:
006139BC   .E8 531CDFFF   CALL cgzl_exe.00405614
006139C1   .43            INC EBX
006139C2   .4E            DEC ESI
006139C3   .^ 75 C9         JNZ SHORT cgzl_exe.0061398E
006139C5   >8D55 9C       LEA EDX,DWORD PTR SS:
006139C8   .8B45 E4       MOV EAX,DWORD PTR SS:
006139CB   .E8 98C4FFFF   CALL cgzl_exe.0060FE68
006139D0   .8D45 DC       LEA EAX,DWORD PTR SS:
006139D3   .E8 7419DFFF   CALL cgzl_exe.0040534C
006139D8   .BB 10000000   MOV EBX,10                                     ;计数器先置为16次
006139DD   .8D7D 9C       LEA EDI,DWORD PTR SS:
006139E0   >33C0          XOR EAX,EAX                                    ;这里是第二部分算法开始。。。
006139E2   .8A07          MOV AL,BYTE PTR DS:                     ;AL=E8;AL=B2,AL=70;EAX=DD
006139E4   .B9 7E000000   MOV ECX,7E                                     ;ECX=7E
006139E9   .33D2          XOR EDX,EDX
006139EB   .F7F1          DIV ECX                                        ;无符号数除法,结果放EDX,逐位算出了“准真码”
006139ED   .8BF2          MOV ESI,EDX
006139EF   .83FE 2F       CMP ESI,2F                                     ;除法所得商与‘*’ASCII码比较
006139F2   .7D 11         JGE SHORT cgzl_exe.00613A05                  ;如果大于等于就跳
006139F4   .8BC6          MOV EAX,ESI                                    ;这一段就已经逐位算出"准真码"了,下面是排除和替换一下字符,如':;换为'<'
006139F6   .B9 0B000000   MOV ECX,0B
006139FB   .99            CDQ
006139FC   .F7F9          IDIV ECX
006139FE   .83C2 2F       ADD EDX,2F
00613A01   .8BF2          MOV ESI,EDX
00613A03   .EB 31         JMP SHORT cgzl_exe.00613A36
00613A05   >83FE 3A       CMP ESI,3A                                     ;再与字符‘:’比较
00613A08   .75 07         JNZ SHORT cgzl_exe.00613A11
00613A0A   .BE 3C000000   MOV ESI,3C                                     ;<
00613A0F   .EB 25         JMP SHORT cgzl_exe.00613A36
00613A11   >83FE 3B       CMP ESI,3B                                     ;如果不是,再与‘;’比较
00613A14   .75 07         JNZ SHORT cgzl_exe.00613A1D
00613A16   .BE 3D000000   MOV ESI,3D                                     ;=
00613A1B   .EB 19         JMP SHORT cgzl_exe.00613A36
00613A1D   >83FE 5D       CMP ESI,5D                                     ;如果还不是,再与‘]’比较
00613A20   .7E 14         JLE SHORT cgzl_exe.00613A36                  ;如果该字符的ASCII小于等于5D就跳,否则继续往下
00613A22   .83FE 61       CMP ESI,61                                     ;再与‘a’比较
00613A25   .7D 0F         JGE SHORT cgzl_exe.00613A36                  ;如果大于等于就跳
00613A27   .8BC6          MOV EAX,ESI
00613A29   .B9 1D000000   MOV ECX,1D
00613A2E   .99            CDQ
00613A2F   .F7F9          IDIV ECX                                       ;如果上面距此最近的比较不成立,则其除以1D,取整的商入EAX,余数在EDX
00613A31   .83C2 61       ADD EDX,61                                     ;余数+61
00613A34   .8BF2          MOV ESI,EDX
00613A36   >8D45 90       LEA EAX,DWORD PTR SS:
00613A39   .8BD6          MOV EDX,ESI
00613A3B   .E8 F41ADFFF   CALL cgzl_exe.00405534
00613A40   .8B55 90       MOV EDX,DWORD PTR SS:
00613A43   .8D45 DC       LEA EAX,DWORD PTR SS:
00613A46   .E8 C91BDFFF   CALL cgzl_exe.00405614
00613A4B   .47            INC EDI
00613A4C   .4B            DEC EBX
00613A4D   .^ 75 91         JNZ SHORT cgzl_exe.006139E0                  ;第二部分算法尾
00613A4F   .33C0          XOR EAX,EAX
00613A51   .5A            POP EDX
00613A52   .59            POP ECX
00613A53   .59            POP ECX
00613A54   .64:8910       MOV DWORD PTR FS:,EDX
00613A57   .EB 0A         JMP SHORT cgzl_exe.00613A63
00613A59   .^ E9 DA0EDFFF   JMP cgzl_exe.00404938
00613A5E   .E8 0113DFFF   CALL cgzl_exe.00404D64
00613A63   >8B45 F8       MOV EAX,DWORD PTR SS:
00613A66   .8B55 DC       MOV EDX,DWORD PTR SS:                  ;真码终于出现了!
00613A69   .E8 3219DFFF   CALL cgzl_exe.004053A0
00613A6E   >33C0          XOR EAX,EAX






以下是算法详细过程
循环第一次:------>循环次数为预设码位数0xA。
用户名第一个字符'['的ASCII是91+80=171(0xAB) XOR 7F=D4====》记为S11=D4
预设码第一个字符'*'的ASCII是42(0x2A)====》记为S21=2A
S11 XORS21=D4 XOR 2A=FE
循环第二次:
用户名第二个字符'a'的ASCII是97+80=177(0xB1) XOR 7F=CE===》记为S21=CE
预设码第二个字符'1'的ASCII是0x31(这个不用查表,俺记得)====》记为S22=31
S21 XOR S22=CE XOR 31=FF
循环第三次:
用户名第三个字符'g'的ASCII是103+80=183(0xB7) XOR 7F=C8===》记为S31=C8
预设码第三个字符'^'的ASCII是94(0x5E)====》记为S32=5E
S31 XOR S32=C8 XOR 5E=96
循环第四次:
用户名第四个字符'a'的ASCII是97+80=197(0xB1) XOR 7F=CE===》记为S41=CE
预设码第四个字符'c'的ASCII是99(0x63)====》记为S42=63
S41 XOR S42=CE XOR 63=AD
循环第五次:
用户名第五个字符'n'的ASCII是110+80=190(0xBE) XOR 7F=C1===》记为S51=C1
预设码第五个字符'g'的ASCII是103(0x67)====》记为S52=67
S51 XOR S52=C1 XOR 73=A6
循环第六次:
用户名第六个字符'g'的ASCII是103+80=183(0xB7) XOR 7F=C8===》记为S61=C8
预设码第六个字符's'的ASCII是115(0x73)====》记为S62=73
S61 XOR S62=C8 XOR 73=BB
循环第七次:
用户名第七个字符']'的ASCII是93+80=173(0xAD) XOR 7F=D2===》记为S71=D2
预设码第七个字符'x'的ASCII是120(0x78)====》记为S72=78
S71 XOR S72=D2 XOR 78=AA

---------------------至此用户名已取完,但预设码还没取完,继续循环,第二轮依次取用户名,直到预设码也取完,两者才能运算---------

循环第八次:------>循环次数为预设码位数0xA。
用户名第一个字符'['的ASCII是91+80=171(0xAB) XOR 7F=D4====》记为S81=D4
预设码第八个字符'y'的ASCII是121(0x79)====》记为S81=79
S81 XORS81=D4 XOR 79=AD
循环第九次:
用户名第二个字符'a'的ASCII是97+80=177(0xB1) XOR 7F=CE===》记为S91=CE
预设码第九个字符'*'的ASCII是42(0x2A)====》记为S81=2A
S91 XOR S92=CE XOR 2A=E4
循环第十次:
用户名第三个字符'g'的ASCII是103+80=183(0xB7) XOR 7F=C8===》记为Sa1=C8
预设码第十个字符'-'的ASCII是45(0x2D)====》记为Sa2=2D
Sa1 XOR Sa2=C8 XOR 2D=E5

--------------------------------------------------------------
生成这样的字符串:FE FF 96 AD A6 BB AA AD E4 E5---------〉记为Z1
0344a74b07b691ef6315828979647fdf,,这个好像是MD5加密后的字符串,--->>记为Z2

真码是这样来的,
由E8 2B 70 DD 5F B5 E6 3A E5 A4 6E 14 C6 E4 ED 3E---------->>记为Z3
[倒序的话是这样3EEDE4C6 146EA4E5 3AE6B55F DD70B2E8]字符串逐字节除以7E,如果这个商的ASCII码对应的字符为‘:’就用‘<’替换;如果是‘;’用‘=’替换;如果这个商小于0x61,那么就用商除以0x1D,用新的商的余数+0x61,得到的就是真码对应位数的ASCII了。
例如:真码的第五位时,先用5F与‘:’的ASCII码比较,如果不等再与“;”比较,再与0x61比较,小于了,所以用5E除以0x1D,用商的余数8+0x61=0x69,此值对应的ASCII就是字符'i'。

现在的问题就是,Z1和Z2字符串各用来做了什么,而Z3又是从何而来,热心的高手们是时候出招了,救救我吧!

[ 本帖最后由 agang 于 2006-7-23 14:22 编辑 ]

网游难民 发表于 2006-7-23 15:35:02

兄弟好强哦~~~
偶还不会MD5,看兄弟的算法分析都感到吃力,学习拉~~~

sky3749 发表于 2006-7-25 23:25:10

算法正在学习当中!

ytswan 发表于 2006-7-26 09:20:12

正在学习中

joker27 发表于 2006-7-27 12:25:53

为什么软件算法都那么BT,浪费偶们的脑细胞,算法分析号吃力
页: [1]
查看完整版本: 成功助理V1.20破解的算法分析就差一点成功了!