- UID
- 12472
注册时间2006-5-7
阅读权限20
最后登录1970-1-1
以武会友
TA的每日心情 | 开心 2016-6-17 14:50 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
软件地址http://down1.tech.sina.com.cn/do ... 6-04-28/17705.shtml
追码成功,内存注册机也不劳驾兄弟们了.
我直接贴上算法部分,在此
00613885 . 55 PUSH EBP
00613886 . 68 9E3A6100 PUSH cgzl_exe.00613A9E
0061388B . 64:FF30 PUSH DWORD PTR FS:[EAX]
0061388E . 64:8920 MOV DWORD PTR FS:[EAX],ESP
00613891 . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
00613894 . E8 B31ADFFF CALL cgzl_exe.0040534C
00613899 . 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
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:[EBP-C]
006138A9 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; 还是用户名[agang]
006138AC . E8 331BDFFF CALL cgzl_exe.004053E4
006138B1 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
006138B4 . E8 531DDFFF CALL cgzl_exe.0040560C
006138B9 . 8BF8 MOV EDI,EAX
006138BB . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
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:[EBP-8]
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:[ECX]
006138E0 . 64:8921 MOV DWORD PTR FS:[ECX],ESP
006138E3 . 8D55 CC LEA EDX,DWORD PTR SS:[EBP-34]
006138E6 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
006138E9 . E8 7AC5FFFF CALL cgzl_exe.0060FE68
006138EE . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
006138F1 . E8 561ADFFF CALL cgzl_exe.0040534C
006138F6 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; [EBP-10]存的是软件预设码
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:[EBP-C] ; 用户名放入EAX
00613912 . 0FB61410 MOVZX EDX,BYTE PTR DS:[EAX+EDX] ; 逐位取用户名的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:[EBP-10] ; 系统预设码 "*1^cgsxy*-"
0061391F . 0FB64418 FF MOVZX EAX,BYTE PTR DS:[EAX+EBX-1] ; 逐位取固定码ASCII,记为S2,呵呵
00613924 . 33D0 XOR EDX,EAX ; S1与S2异或,结果存在EDX
00613926 . 8D45 98 LEA EAX,DWORD PTR SS:[EBP-68]
00613929 . E8 061CDFFF CALL cgzl_exe.00405534
0061392E . 8B55 98 MOV EDX,DWORD PTR SS:[EBP-68]
00613931 . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
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:[EBP-44]
00613940 . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
00613943 . E8 20C5FFFF CALL cgzl_exe.0060FE68 ; 好像是做了某字串的MD5加密
00613948 . BB 10000000 MOV EBX,10 ; EBX=16
0061394D . 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34]
00613950 . 8D55 BC LEA EDX,DWORD PTR SS:[EBP-44]
00613953 . 8D75 AC LEA ESI,DWORD PTR SS:[EBP-54]
00613956 > 8A08 MOV CL,BYTE PTR DS:[EAX] ; 这里的循环生成了下面的32位长的字符串,是不是MD5的32位加密,呵呵
00613958 . 320A XOR CL,BYTE PTR DS:[EDX]
0061395A . 880E MOV BYTE PTR DS:[ESI],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:[EBP-18]
00613965 . 8D45 AC LEA EAX,DWORD PTR SS:[EBP-54]
00613968 . E8 6FC5FFFF CALL cgzl_exe.0060FEDC
0061396D . 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
00613970 . E8 D719DFFF CALL cgzl_exe.0040534C ; 0344a74b07b691ef6315828979647fdf第二部分算法要用到
00613975 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
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:[EBP-20]
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:[EBP-18] ; [EBP-18]放的是MD5加密32位字符串,是不是MD5呀,猜的
0061399F . E8 C81EDFFF CALL cgzl_exe.0040586C
006139A4 . 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
006139A7 . E8 E8FDFFFF CALL cgzl_exe.00613794
006139AC . 8BD0 MOV EDX,EAX
006139AE . 8D45 94 LEA EAX,DWORD PTR SS:[EBP-6C]
006139B1 . E8 7E1BDFFF CALL cgzl_exe.00405534
006139B6 . 8B55 94 MOV EDX,DWORD PTR SS:[EBP-6C]
006139B9 . 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
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:[EBP-64]
006139C8 . 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
006139CB . E8 98C4FFFF CALL cgzl_exe.0060FE68
006139D0 . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
006139D3 . E8 7419DFFF CALL cgzl_exe.0040534C
006139D8 . BB 10000000 MOV EBX,10 ; 计数器先置为16次
006139DD . 8D7D 9C LEA EDI,DWORD PTR SS:[EBP-64]
006139E0 > 33C0 XOR EAX,EAX ; 这里是第二部分算法开始。。。
006139E2 . 8A07 MOV AL,BYTE PTR DS:[EDI] ; 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 ; 无符号数除法[EAX/7E],结果放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:[EBP-70]
00613A39 . 8BD6 MOV EDX,ESI
00613A3B . E8 F41ADFFF CALL cgzl_exe.00405534
00613A40 . 8B55 90 MOV EDX,DWORD PTR SS:[EBP-70]
00613A43 . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
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:[EAX],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:[EBP-8]
00613A66 . 8B55 DC MOV EDX,DWORD PTR SS:[EBP-24] ; 真码终于出现了!
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 XOR S21=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 XOR S81=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加密[32位]后的字符串,--->>记为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 编辑 ] |
|