成功助理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 编辑 ] 兄弟好强哦~~~
偶还不会MD5,看兄弟的算法分析都感到吃力,学习拉~~~ 算法正在学习当中! 正在学习中 为什么软件算法都那么BT,浪费偶们的脑细胞,算法分析号吃力
页:
[1]