=================Open Cracking Group=====================
=
=
中文拨号上网计时计费器 V4.12注册算法分析
=
DiKeN/OCG
=
=
http://www.newclw.com/lllufh/cgi-bin/leoboard.cgi
=
=================Open
Cracking Group======================
=我的
=序列号:22P2ffmyM1zMecefbzyMrq4bzGbcrPbZ4MZQmqyv64FwX4kFVQ
=关键字:2222fhJkLDLpqvLp8JB8qLJLvqqnpp8pLCkLJkBDLDqv8pnDkJJ
=
=================Open
Cracking Group======================
=
:004C5800 55
push ebp
:004C5801
8BEC mov
ebp, esp
:004C5803 83C4C8
add esp, FFFFFFC8
:004C5806 53
push ebx
:004C5807 56
push esi
:004C5808
33C9 xor
ecx, ecx
:004C580A 894DD8
mov dword ptr [ebp-28], ecx
:004C580D 894DD4
mov dword ptr [ebp-2C], ecx
:004C5810
894DD0 mov dword
ptr [ebp-30], ecx
:004C5813 894DCC
mov dword ptr [ebp-34], ecx
:004C5816 894DC8
mov dword ptr [ebp-38], ecx
:004C5819 894DF4
mov dword ptr [ebp-0C], ecx
:004C581C 894DF0
mov dword ptr [ebp-10], ecx
:004C581F 8955F8
mov dword ptr [ebp-08],
edx
:004C5822 8945FC
mov dword ptr [ebp-04], eax
:004C5825 8B45FC
mov eax, dword ptr [ebp-04]
:004C5828
E867E7F3FF call 00403F94
:004C582D 8B45F8
mov eax, dword ptr [ebp-08]
:004C5830 E85FE7F3FF
call 00403F94
:004C5835 33C0
xor eax, eax
:004C5837 55
push ebp
:004C5838 682A594C00 push
004C592A
:004C583D 64FF30
push dword ptr fs:[eax]
:004C5840 648920
mov dword ptr fs:[eax], esp
:004C5843
8B45FC mov eax,
dword ptr [ebp-04]
:004C5846 E895E5F3FF
call 00403DE0
:004C584B 83F832
cmp eax, 00000032<=====检查软件序列号长度
:004C584E
7407 je 004C5857
:004C5850 33DB
xor ebx, ebx
:004C5852 E9AB000000
jmp 004C5902
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:004C584E(C)
|
:004C5857 8B45FC
mov eax, dword ptr [ebp-04]
:004C585A E845E7F3FF call 00403FA4
:004C585F 8BD8
mov ebx, eax
:004C5861 B901000000
mov ecx, 00000001
:004C5866 8D45DC
lea eax, dword ptr [ebp-24]
* Referenced
by a (U)nconditional or (C)onditional Jump at Address:
|:004C588E(C)
|
:004C5869 33D2
xor edx, edx
:004C586B 8910
mov dword ptr [eax], edx
:004C586D BA01000000
mov edx, 00000001
* Referenced
by a (U)nconditional or (C)onditional Jump at Address:
|:004C5885(C)
|
:004C5872 8BF2
mov esi, edx
:004C5874 4E
dec esi
:004C5875 8D34B6
lea esi, dword ptr [esi+4*esi]
:004C5878 03F1
add esi, ecx
:004C587A 0FB67433FF
movzx esi, byte ptr [ebx+esi-01]
:004C587F 0130
add dword ptr [eax], esi
:004C5881 42
inc edx
:004C5882 83FA0B
cmp edx, 0000000B
:004C5885 75EB
jne 004C5872
:004C5887
41
inc ecx
:004C5888 83C004
add eax, 00000004
:004C588B 83F906
cmp ecx, 00000006
:004C588E 75D9
jne 004C5869
==========================================================
//0x32=48+2=50
//连续求5个累加和10
SN:=''//0x32位长的序列号
//22P2ffmyM1zMecefbzyMrq4bzGbcrPbZ4MZQmqyv64FwX4kFVQ
buf[i]:=//5个累加和
for index:=1 to 5 do
begin
buf[i]:=0;
for j:=1 to 10 do
begin
buf[i]:=buf[i]+ord(SN[i+5*(j-1)]);
end;
end;
//[eax-00000014] - 0000034e N...=846
//[eax-00000010] - 00000387 ....=903
//[eax-0000000C] - 00000370
p...=880
//[eax-00000008] - 000003c2 ....=962
//[eax-00000004]
- 0000038c ....=908
==========================================================
:004C5890 8D55D8
lea edx, dword ptr [ebp-28]
:004C5893 8B45DC
mov eax, dword ptr [ebp-24]
:004C5896 E8E128F4FF
call 0040817C
:004C589B FF75D8
push [ebp-28]
:004C589E
8D55D4 lea edx,
dword ptr [ebp-2C]
:004C58A1 8B45E0
mov eax, dword ptr [ebp-20]
:004C58A4 E8D328F4FF
call 0040817C
:004C58A9 FF75D4
push [ebp-2C]
:004C58AC
8D55D0 lea edx,
dword ptr [ebp-30]
:004C58AF 8B45E4
mov eax, dword ptr [ebp-1C]
:004C58B2 E8C528F4FF
call 0040817C
:004C58B7 FF75D0
push [ebp-30]
:004C58BA
8D55CC lea edx,
dword ptr [ebp-34]
:004C58BD 8B45E8
mov eax, dword ptr [ebp-18]
:004C58C0 E8B728F4FF
call 0040817C
:004C58C5 FF75CC
push [ebp-34]
:004C58C8
8D55C8 lea edx,
dword ptr [ebp-38]
:004C58CB 8B45EC
mov eax, dword ptr [ebp-14]
:004C58CE E8A928F4FF
call 0040817C====>buf转为字符串
:004C58D3
FF75C8 push [ebp-38]
:004C58D6 8D45F4
lea eax, dword ptr [ebp-0C]
:004C58D9 BA05000000
mov edx, 00000005
:004C58DE E8BDE5F3FF
call 00403EA0====>5个字符串连接,用于和后面的结果比较
//
相等则正确
:004C58E3 8D4DF0
lea ecx, dword ptr [ebp-10]
//===========================================================
//846903880962908
//===========================================================
* Possible StringData Ref from Code Obj ->"JDqpBkLvn8Cm0HYIr1KQMSagURlieFAEb3jd7N4zwZoOGy"
->"xu6T2fstchVP9X5WwNC3OHDlm1efyqzcbM4GrZjP9TQ7gk"
->"2ov8F0IitXSJaAEBYxKunVL5Uhs6pRWd"
|
:004C58E6 8B1584174D00
mov edx, dword ptr [004D1784]===>Magicstr
:004C58EC 8B45F8
mov eax, dword ptr [ebp-08]=====>输入注册码
:004C58EF E8747BF8FF
call 0044D468===>把输入注册码加密
//===========================================================
MagicStr:='JDqpBkLvn8Cm0HYIr1KQMSagURlieFAEb3jd7N4zwZoOGyxu6T2fstchVP9X5WwNC3OHDlm1efyqzcbM4GrZjP9TQ7gk2ov8F0IitXSJaAEBYxKunVL5Uhs6pRWd'
具体又是累加
由12字符计算长度
由后面的字符计算后面的注册码
只要这个过程可以逆过来,那么这个keygen就可以做出;我们的先把这个算法搞明白
//==========================================================
:0044D4B0 BF33000000 mov
edi, 00000033
:0044D4B5 8B45FC
mov eax, dword ptr [ebp-04]
:0044D4B8 8A10
mov dl, byte ptr [eax]
:0044D4BA
B933000000 mov ecx, 00000033
:0044D4BF 8B45F8
mov eax, dword ptr [ebp-08]
:0044D4C2 E825FAFFFF
call 0044CEEC========>
===========================================================
sub_0044CEEC(arg1,arg2,arg3)//返回arg3在arg1中的位置,从arg2开始查找
//当arg2>length(arg1)时;返回-1;否则返回索引或者length(arg1);
//==============================================
:0044CEEC 55
push ebp
:0044CEED 8BEC
mov ebp, esp
:0044CEEF 51
push ecx
:0044CEF0 53
push ebx
:0044CEF1 56
push esi
:0044CEF2 57
push edi
:0044CEF3 8BF9
mov edi, ecx===>startIndex
:0044CEF5 8BDA
mov ebx, edx===>arg3
:0044CEF7 8945FC
mov dword ptr [ebp-04], eax
:0044CEFA 8B45FC
mov eax, dword ptr [ebp-04]
:0044CEFD
E89270FBFF call 00403F94
:0044CF02 33C0
xor eax, eax
:0044CF04
55
push ebp
:0044CF05 684BCF4400
push 0044CF4B
:0044CF0A
64FF30 push dword
ptr fs:[eax]
:0044CF0D 648920
mov dword ptr fs:[eax], esp
:0044CF10 83CEFF
or esi, FFFFFFFF===>初始付值-1
:0044CF13 8B45FC
mov eax, dword ptr [ebp-04]
:0044CF16 E8C56EFBFF
call 00403DE0===>取输入字符串的长度
:0044CF1B 8BD0
mov edx, eax
:0044CF1D 2BD7
sub edx, edi
:0044CF1F
7C14 jl 0044CF35
:0044CF21 42
inc edx
:0044CF22 89F8
mov eax, edi===>startIndex
//==========================================================
// mmesi:=-1;
//
mmedx:=length(str)-startIndex;
//
while (mmedx>=0) and (str[])
//
if mmedx>=0 then
//
begin
//
inc mmedx;
//
mmeax:=startIndex;
//
repeat
// inc(mmeax);
// dec(mmedx);
// until str[mmeax]=mmebx;//mmebx=arg3
// end;
//
分析知道实际是从startIndex查找arg3的索引
//1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
// 1
2
3 4
5
6 7
//123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE
F0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABC
//JDqpBkLvn8Cm0HYIr1KQMSagURlieFAEb3jd7N4zwZoOGyxu6T2fstchVP9X5W
wNC3OHDlm1efyqzcbM4GrZjP9TQ7gk2ov8F0IitXSJaAEBYxKunVL5Uhs6pRWd
//这个字符串有一定特殊性由0-9,a-z,A-Z的乱序组合
//共(26+26+10)*2=124个字符,
//
*
//===========================================================
* Referenced by a (U)nconditional
or (C)onditional Jump at Address:
|:0044CF33(C)
|
:0044CF24
8B4DFC mov ecx,
dword ptr [ebp-04]
:0044CF27 3A5C01FF
cmp bl, byte ptr [ecx+eax-01]
:0044CF2B 7504
jne 0044CF31
:0044CF2D 8BF0
mov esi, eax===>作为输出
:0044CF2F EB04
jmp 0044CF35
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:0044CF2B(C)
|
:0044CF31 40
inc eax
:0044CF32 4A
dec edx
:0044CF33 75EF
jne 0044CF24
* Referenced by a
(U)nconditional or (C)onditional Jump at Addresses:
|:0044CF1F(C), :0044CF2F(U)
|
:0044CF35 33C0
xor eax, eax
:0044CF37 5A
pop edx
:0044CF38 59
pop ecx
:0044CF39 59
pop ecx
:0044CF3A 648910
mov dword ptr fs:[eax], edx
:0044CF3D 6852CF4400
push 0044CF52
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044CF50(U)
|
:0044CF42 8D45FC
lea eax, dword ptr [ebp-04]
:0044CF45 E81A6CFBFF
call 00403B64
:0044CF4A C3
ret
//===============================================
//eax=str,ecx=startindex,edx=num
//
//function sub_0044CEEC(const str,startindex,num):integer;
// len:=length(str)-startindex
// if len>=0 then
// begin
// inc(len);
// if (str[startindex])<>0
//
// end;
// edi=$33;
// 1. eax:=MagicStr;ecx=edi;edx:=code[1];
// 2. eax:=MagicStr;ecx=edi;edx:=code[2];
// 3. eax:=MagicStr;ecx=edi;edx:=code[3];
// 4. eax:=MagicStr;ecx=edi;edx:=code[4];
// 5. eax:=MagicStr;ecx=edi;edx:=code[5];
// 6. eax:=MagicStr;ecx=edi;edx:=code[6];
// 6轮完毕;然后做:0044D56D E8426BFBFF
call 004040B4
// 输出edi,ebx为后面所用
// edi:=esi*10;ebx=累加和-$33
// edi=lenCode*10;ebx=lenCode;//才是正确的注册码
//处理长度
//
//
//for index:=1
to lenCode do
//begin
//
// eax:=MagicStr;ecx=??(edi)??;edx:=code[index*3+3+1];
//end
//==================================================
:0044D4C7 8BD8
mov ebx, eax
:0044D4C9 83EB33
sub ebx, 00000033
:0044D4CC 8BC3
mov eax, ebx
:0044D4CE 03C0
add eax, eax
:0044D4D0 8D0480
lea eax, dword ptr [eax+4*eax]
:0044D4D3 8BD8
mov ebx, eax
:0044D4D5 8B45FC
mov eax, dword ptr [ebp-04]
:0044D4D8 8A5001
mov dl, byte ptr [eax+01]
:0044D4DB B933000000
mov ecx, 00000033
:0044D4E0 8B45F8
mov eax, dword ptr [ebp-08]
:0044D4E3
E804FAFFFF call 0044CEEC
:0044D4E8 03D8
add ebx, eax
:0044D4EA 83EB33
sub ebx, 00000033
:0044D4ED 8BC3
mov eax, ebx
:0044D4EF 03C0
add eax, eax
:0044D4F1 8D0480
lea eax, dword ptr [eax+4*eax]
:0044D4F4 8BD8
mov ebx, eax
:0044D4F6 8B45FC
mov eax, dword ptr [ebp-04]
:0044D4F9 8A5002
mov dl, byte ptr [eax+02]
:0044D4FC B933000000
mov ecx, 00000033
:0044D501 8B45F8
mov eax, dword ptr [ebp-08]
:0044D504
E8E3F9FFFF call 0044CEEC
:0044D509 03D8
add ebx, eax
:0044D50B 83EB33
sub ebx, 00000033
:0044D50E 8BF3
mov esi, ebx===========>>>>
:0044D510
8B45FC mov eax,
dword ptr [ebp-04]
:0044D513 8A5003
mov dl, byte ptr [eax+03]
:0044D516 8BCF
mov ecx, edi
:0044D518
8B45F8 mov eax,
dword ptr [ebp-08]
:0044D51B E8CCF9FFFF
call 0044CEEC
:0044D520 8BD8
mov ebx, eax
:0044D522 83EB33
sub ebx, 00000033
:0044D525
8BC3 mov
eax, ebx
:0044D527 03C0
add eax, eax
:0044D529 8D0480
lea eax, dword ptr [eax+4*eax]
:0044D52C 8BD8
mov ebx, eax
:0044D52E 8B45FC
mov eax, dword ptr [ebp-04]
:0044D531 8A5004
mov dl, byte ptr [eax+04]
:0044D534 8BCF
mov ecx, edi
:0044D536 8B45F8
mov eax, dword ptr [ebp-08]
:0044D539 E8AEF9FFFF
call 0044CEEC
:0044D53E 03D8
add ebx, eax
:0044D540 83EB33
sub ebx, 00000033
:0044D543 8BC3
mov eax, ebx
:0044D545 03C0
add eax, eax
:0044D547 8D0480
lea eax, dword ptr [eax+4*eax]
:0044D54A
8BD8 mov
ebx, eax
:0044D54C 8B45FC
mov eax, dword ptr [ebp-04]
:0044D54F 8A5005
mov dl, byte ptr [eax+05]
:0044D552
8BCF mov
ecx, edi
:0044D554 8B45F8
mov eax, dword ptr [ebp-08]
:0044D557 E890F9FFFF
call 0044CEEC
:0044D55C 03D8
add ebx, eax
:0044D55E
83EB33 sub ebx,
00000033
:0044D561 8BFE
mov edi, esi==============>>>>
//===================================0
0 0 0 1 5
//求索引和;表示将检查的长度,分为:
十万 万位 千位 百位 十位 个位
//
idx1 idx2 idx3
idx4 idx5 idx6
//
2
2 2 2 f h
//===========================
:0044D563 03FF
add edi, edi
:0044D565 8D3CBF
lea edi, dword ptr [edi+4*edi]
:0044D568 8D45F0
lea eax, dword ptr [ebp-10]
:0044D56B 8BD3
mov edx, ebx======>必须等于序列好算出来的数字的长度
:0044D56D
E8426BFBFF call 004040B4
:0044D572 85DB
test ebx, ebx======>必须等于序列好算出来的数字的长度
:0044D574 0F8EA2000000
jle 0044D61C
:0044D57A 895DEC
mov dword ptr [ebp-14], ebx
:0044D57D
BE01000000 mov esi, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044D616(C)
|
//===========================================================
for index:=1 to lenCode do
begin
处理输入的注册码
end;
//===================================================================
:0044D582 8D0476
lea eax, dword ptr [esi+2*esi]
:0044D585 8B55FC
mov edx, dword ptr [ebp-04]
:0044D588
8A540203 mov dl, byte ptr
[edx+eax+03]
:0044D58C 8BCF
mov ecx, edi
:0044D58E 8B45F8
mov eax, dword ptr [ebp-08]
JDqpBkLvn8Cm0HYIr1KQMSagURlieFAEb3jd7N4zwZoOGyxu6T2fstchVP9X5WwNC3OHDlm1efyqzcbM4GrZjP9TQ7gk2ov8F0IitXSJaAEBYxKunVL5Uhs6pRWd
:0044D591 E856F9FFFF
call 0044CEEC
:0044D596 8BD8
mov ebx, eax
:0044D598 2BDF
sub ebx, edi
:0044D59A 8BC6
mov eax, esi
:0044D59C 48
dec eax
:0044D59D B90A000000
mov ecx, 0000000A
:0044D5A2 99
cdq
:0044D5A3 F7F9
idiv ecx
:0044D5A5 42
inc edx
:0044D5A6 2BDA
sub ebx, edx
:0044D5A8 8BC3
mov eax, ebx
:0044D5AA 03C0
add eax, eax
:0044D5AC 8D0480
lea eax, dword ptr [eax+4*eax]
:0044D5AF 8BD8
mov ebx, eax
//=======================================(fpos(MagicStr,edi,strCode[])-((index
mod 10)+1))*10
//==========fpos函数实际如下
function fpos(const str:string;startIndex:integer;tag:char):integer;
var
index,len:integer;
mmeax:integer;
begin
len:=length(str);
mmeax:=-1;
if startIndex>len
then
begin
//index:=startIndex-1;
mmeax:=startIndex-1;
repeat
inc(mmeax);
until ((str[mmeax]=tag)
or (mmeax=len));
end;
fpos:=mmeax;
end;
//===========================================================================
:0044D5B1 8D0476
lea eax, dword ptr [esi+2*esi]
:0044D5B4 8B55FC
mov edx, dword ptr [ebp-04]
:0044D5B7
8A540204 mov dl, byte ptr
[edx+eax+04]
:0044D5BB 8BCF
mov ecx, edi
:0044D5BD 8B45F8
mov eax, dword ptr [ebp-08]
:0044D5C0
E827F9FFFF call 0044CEEC
:0044D5C5 03D8
add ebx, eax
:0044D5C7 2BDF
sub ebx, edi
:0044D5C9 8BC6
mov eax, esi
:0044D5CB 48
dec eax
:0044D5CC B90A000000 mov
ecx, 0000000A
:0044D5D1 99
cdq
:0044D5D2 F7F9
idiv ecx
:0044D5D4 42
inc edx
//====================================(第几个注册码
mod 10+1)
:0044D5D5 2BDA
sub ebx, edx
:0044D5D7 8BC3
mov eax, ebx
:0044D5D9 03C0
add eax, eax
:0044D5DB 8D0480
lea eax, dword ptr [eax+4*eax]
:0044D5DE 8BD8
mov ebx, eax
:0044D5E0 8D0476
lea eax, dword ptr [esi+2*esi]
:0044D5E3 8B55FC
mov edx, dword ptr [ebp-04]
:0044D5E6 8A540205
mov dl, byte ptr [edx+eax+05]
:0044D5EA 8BCF
mov ecx, edi
:0044D5EC 8B45F8
mov eax, dword ptr [ebp-08]
:0044D5EF E8F8F8FFFF
call 0044CEEC
:0044D5F4 03D8
add ebx, eax
:0044D5F6 2BDF
sub ebx, edi===>索引=1-124,-1
=================================================> 1-62
=================================================>62-124
//由连续的3个注册码计算出: 百位 十位 个位
//
idx1 idx2 idx3
//0x30-0x39=48-57
================================================>
:0044D5F8 8BC6
mov eax, esi
:0044D5FA 48
dec eax
:0044D5FB B90A000000
mov ecx, 0000000A
:0044D600 99
cdq
:0044D601 F7F9
idiv ecx
:0044D603 42
inc edx=((index-1)
mod 10)+1;
//===========================================================
//
index=[1-lenCode]
//===========================================================
//========mpos(MagicStr,edi,strCode[])-((index
mod 10)+1)
//
//====================================(第几个注册码 mod 10+1)
//===========================================================
:0044D604
2BDA sub
ebx, edx
:0044D606 8D45F0
lea eax, dword ptr [ebp-10]
:0044D609 E8A269FBFF
call 00403FB0
:0044D60E 885C30FF
mov byte ptr [eax+esi-01], bl
//===============================================
//==================>这个bl一定是在0x30-0x39之内,应该可以简化还原
//===============================================
:0044D612 46
inc esi
:0044D613 FF4DEC
dec [ebp-14]=========>循环注册码程度
:0044D616 0F8566FFFFFF
jne 0044D582
* Referenced by a (U)nconditional
or (C)onditional Jump at Address:
|:0044D574(C)
|
:0044D61C 8B45F4
mov eax, dword ptr [ebp-0C]
:0044D61F 8B55F0
mov edx, dword ptr [ebp-10]
:0044D622 E8D565FBFF
call 00403BFC
* Referenced by a (U)nconditional
or (C)onditional Jump at Address:
|:0044D4AB(U)
|
:0044D627 33C0
xor eax, eax
:0044D629 5A
pop edx
:0044D62A 59
pop ecx
:0044D62B 59
pop ecx
:0044D62C 648910
mov dword ptr fs:[eax],
edx
:0044D62F 6851D64400
push 0044D651
* Referenced by a (U)nconditional or (C)onditional Jump
at Address:
|:0044D64F(U)
|
:0044D634 8D45F0
lea eax, dword ptr [ebp-10]
:0044D637
E82865FBFF call 00403B64
:0044D63C 8D45F8
lea eax, dword ptr [ebp-08]
:0044D63F BA02000000
mov edx, 00000002
:0044D644 E83F65FBFF
call 00403B88
:0044D649 C3
ret
//===========================注册码加密算法完毕========================
:004C58F4 8B45F4
mov eax, dword ptr [ebp-0C]
:004C58F7 8B55F0
mov edx, dword ptr [ebp-10]
:004C58FA E8F1E5F3FF
call 00403EF0========>比较函数
:004C58FF
0F94C3 sete bl
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C5852(U)
|
:004C5902 33C0
xor eax, eax
:004C5904 5A
pop edx
:004C5905
59
pop ecx
:004C5906 59
pop ecx
:004C5907 648910
mov dword ptr fs:[eax], edx
:004C590A
6831594C00 push 004C5931
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C592F(U)
|
:004C590F 8D45C8
lea eax, dword ptr [ebp-38]
:004C5912 BA05000000
mov edx, 00000005
:004C5917 E86CE2F3FF
call 00403B88
:004C591C 8D45F0
lea eax, dword ptr [ebp-10]
:004C591F BA04000000 mov
edx, 00000004
:004C5924 E85FE2F3FF
call 00403B88
:004C5929 C3
ret
==============================================================
=
=这个注册码反算过程还有点复杂,浪费了我1天时间
=keygen已经做出,因为是国产软件,所以无法公布
=
====================Open Cracking Group=====================
=
=
中文拨号上网计时计费器 V4.12注册算法分析
=
=
DiKeN/OCG
=
=
http://www.newclw.com/lllufh/cgi-bin/leoboard.cgi
=
====================Open Cracking Group=====================
- 标 题:中文拨号上网计时计费器 V4.12注册算法分析--[OCG] (23千字)
- 作 者:DiKeN
- 时 间:2002-3-26 18:09:15
- 链 接:http://bbs.pediy.com