Art*** Pro 暴破浅谈
本帖最后由 GGLHY 于 2010-6-4 00:16 编辑今天终于有了一点小空闲,想起前段时间搞过的一个软件Art*** Pro(稍微隐藏下软件名哈),便抽空整理了下笔记。
呵呵,简单的爆了下,没看算法哈。本文如有错误,敬请大牛指正!
OD载入,运行Art*** Pro,输入注册信息:
name:gglhy
key:15987530
点注册,弹出:please reenter key. key is required 的对话框。
好的。看看用什么断点能直捣黄龙?
F12的方法、或者MessageBoxA都能来到达到目的哈。现在我们看看有什么有用的字符串参考:
00551687 mov ecx, 005516A8 invalid key
0055DA6F mov edx, 0055DAB8 please reenter key.\n\n
0055DB51 mov eax, 0055E150 - key begin key -
0055DB6A mov eax, 0055E16C - key end key -
0055DB99 mov edx, 0055E184 not found row: - key begin key -
0055DBB4 mov edx, 0055E1B0 not found row: - key end key -
0055DF8F push 0055E1F0 software\aha-soft\
0055DF9B push 0055E20C \
0055DFD5 mov edx, 0055E218 key
0055DFE2 mov edx, 0055E218 key
0055E00D mov edx, 0055E224 time
0055E025 mov edx, 0055E234 fullproductname
0055E057 push 0055E24C <br>
0055E05C push 0055E25C -
0055E06F push 0055E1D8
0055E074 push 0055E268 licenses -
0055E089 mov edx, 0055E27C username
0055E0DD mov eax, 0055E290 you should restart application now
有这么多,够了哈。
那我们先来看这里:
- key begin key - 、 - key end key -
呵呵,显然是对注册码的格式要求哈。
如果选其他的字符串也可以很快定位到关键部分。
那我们双击就可以来到注册验证的地方。
0055DAD0/$55 push ebp ***在这里下断,F2
0055DAD1|.8BEC mov ebp, esp
0055DAD3|.B9 0F000000 mov ecx, 0F
0055DAD8|>6A 00 /push 0
0055DADA|.6A 00 |push 0
0055DADC|.49 |dec ecx
0055DADD|.^ 75 F9 \jnz short 0055DAD8
0055DADF|.53 push ebx
0055DAE0|.56 push esi
0055DAE1|.57 push edi
0055DAE2|.8945 FC mov dword ptr , eax
0055DAE5|.33C0 xor eax, eax
0055DAE7|.55 push ebp
0055DAE8|.68 34E15500 push 0055E134
0055DAED|.64:FF30 push dword ptr fs:
0055DAF0|.64:8920 mov dword ptr fs:, esp
0055DAF3|.C745 E8 FFFFF>mov dword ptr , -1
0055**|.C745 E4 FFFFF>mov dword ptr , -1
0055DB01|.8B45 FC mov eax, dword ptr
0055DB04|.8B80 E0020000 mov eax, dword ptr
0055DB0A|.8B80 08020000 mov eax, dword ptr
0055DB10|.8B10 mov edx, dword ptr
0055DB12|.FF52 14 call dword ptr
0055DB15|.8BF0 mov esi, eax
0055DB17|.4E dec esi
0055DB18|.85F6 test esi, esi
0055DB1A|.7C 66 jl short 0055DB82
0055DB1C|.46 inc esi
0055DB1D|.33DB xor ebx, ebx
0055DB1F|>8D4D C0 /lea ecx, dword ptr
0055DB22|.8B45 FC |mov eax, dword ptr
0055DB25|.8B80 E0020000 |mov eax, dword ptr
0055DB2B|.8B80 08020000 |mov eax, dword ptr
0055DB31|.8BD3 |mov edx, ebx
0055DB33|.8B38 |mov edi, dword ptr
0055DB35|.FF57 0C |call dword ptr
0055DB38|.8B45 C0 |mov eax, dword ptr
0055DB3B|.8D55 C4 |lea edx, dword ptr
0055DB3E|.E8 D9C2EAFF |call 00409E1C
0055DB43|.8B45 C4 |mov eax, dword ptr
0055DB46|.8D55 F0 |lea edx, dword ptr
0055DB49|.E8 1AC6EAFF |call 0040A168
0055DB4E|.8B55 F0 |mov edx, dword ptr
0055DB51|.B8 50E15500 |mov eax, 0055E150 ;- key begin key -
0055DB56|.E8 9172EAFF |call 00404DEC
0055DB5B|.85C0 |test eax, eax
0055DB5D|.7E 08 |jle short 0055DB67
0055DB5F|.8D43 01 |lea eax, dword ptr
0055DB62|.8945 E8 |mov dword ptr , eax
0055DB65|.EB 17 |jmp short 0055DB7E
0055DB67|>8B55 F0 |mov edx, dword ptr
0055DB6A|.B8 6CE15500 |mov eax, 0055E16C ;- key end key -
0055DB6F|.E8 7872EAFF |call 00404DEC
0055DB74|.85C0 |test eax, eax
0055DB76|.7E 06 |jle short 0055DB7E
0055DB78|.8BC3 |mov eax, ebx
0055DB7A|.48 |dec eax
0055DB7B|.8945 E4 |mov dword ptr , eax
0055DB7E|>43 |inc ebx
0055DB7F|.4E |dec esi
0055DB80|.^ 75 9D \jnz short 0055DB1F
0055DB82|>8D45 EC lea eax, dword ptr ***上面的循环应该是对输入的注册码的格式检验
0055DB85|.E8 BE6CEAFF call 00404848
0055DB8A|.837D E8 FF cmp dword ptr , -1
0055DB8E|.75 15 jnz short 0055DBA5
0055DB90|.837D E4 00 cmp dword ptr , 0
0055DB94|.7E 0F jle short 0055DBA5
0055DB96|.8D45 EC lea eax, dword ptr
0055DB99|.BA 84E15500 mov edx, 0055E184 ;not found row: - key begin key -
0055DB9E|.E8 3D6DEAFF call 004048E0
0055DBA3|.EB 19 jmp short 0055DBBE
0055DBA5|>837D E4 FF cmp dword ptr , -1
0055DBA9|.75 13 jnz short 0055DBBE
0055DBAB|.837D E8 00 cmp dword ptr , 0
0055DBAF|.7E 0D jle short 0055DBBE
0055DBB1|.8D45 EC lea eax, dword ptr
0055DBB4|.BA B0E15500 mov edx, 0055E1B0 ;not found row: - key end key -
0055DBB9|.E8 226DEAFF call 004048E0
0055DBBE|>837D EC 00 cmp dword ptr , 0
0055DBC2|.74 08 je short 0055DBCC
0055DBC4|.8B45 EC mov eax, dword ptr
0055DBC7|.E8 88FEFFFF call 0055DA54
0055DBCC|>8D45 F4 lea eax, dword ptr
0055DBCF|.E8 746CEAFF call 00404848
0055DBD4|.837D E8 00 cmp dword ptr , 0
0055DBD8|.7E 06 jle short 0055DBE0
0055DBDA|.837D E4 00 cmp dword ptr , 0
0055DBDE|.7F 1D jg short 0055DBFD
0055DBE0|>33C0 xor eax, eax
0055DBE2|.8945 E8 mov dword ptr , eax
0055DBE5|.8B45 FC mov eax, dword ptr
0055DBE8|.8B80 E0020000 mov eax, dword ptr
0055DBEE|.8B80 08020000 mov eax, dword ptr
0055DBF4|.8B10 mov edx, dword ptr
0055DBF6|.FF52 14 call dword ptr
0055DBF9|.48 dec eax
0055DBFA|.8945 E4 mov dword ptr , eax
0055DBFD|>8B45 FC mov eax, dword ptr
0055DC00|.8B80 FC020000 mov eax, dword ptr
0055DC06|.8B10 mov edx, dword ptr
0055DC08|.FF52 40 call dword ptr
0055DC0B|.33C0 xor eax, eax
0055DC0D|.8945 E0 mov dword ptr , eax
0055DC10|.8B5D E8 mov ebx, dword ptr
0055DC13|.8B75 E4 mov esi, dword ptr
0055DC16|.2BF3 sub esi, ebx
0055DC18|.0F8C 8E000000 jl 0055DCAC
0055DC1E|.46 inc esi
0055DC1F|>8D4D BC /lea ecx, dword ptr
0055DC22|.8B45 FC |mov eax, dword ptr
0055DC25|.8B80 E0020000 |mov eax, dword ptr
0055DC2B|.8B80 08020000 |mov eax, dword ptr
0055DC31|.8BD3 |mov edx, ebx
0055DC33|.8B38 |mov edi, dword ptr
0055DC35|.FF57 0C |call dword ptr
0055DC38|.8B45 BC |mov eax, dword ptr
0055DC3B|.8D55 D4 |lea edx, dword ptr
0055DC3E|.E8 25C5EAFF |call 0040A168
0055DC43|.8D45 B8 |lea eax, dword ptr
0055DC46|.50 |push eax
0055DC47|.33C9 |xor ecx, ecx
0055DC49|.BA D8E15500 |mov edx, 0055E1D8
0055DC4E|.8B45 D4 |mov eax, dword ptr
0055DC51|.E8 E25AF1FF |call 00473738
0055DC56|.8B55 B8 |mov edx, dword ptr
0055DC59|.8D45 D4 |lea eax, dword ptr
0055DC5C|.E8 7F6CEAFF |call 004048E0
0055DC61|.8D45 F4 |lea eax, dword ptr
0055DC64|.8B55 D4 |mov edx, dword ptr
0055DC67|.E8 9C6EEAFF |call 00404B08
0055DC6C|.8B45 D4 |mov eax, dword ptr
0055DC6F|.E8 8C6EEAFF |call 00404B00
0055DC74|.83F8 0A |cmp eax, 0A
0055DC77|.7E 17 |jle short 0055DC90
0055DC79|.837D E0 00 |cmp dword ptr , 0
0055DC7D|.75 11 |jnz short 0055DC90
0055DC7F|.8B45 FC |mov eax, dword ptr
0055DC82|.8B80 FC020000 |mov eax, dword ptr
0055DC88|.8B55 D4 |mov edx, dword ptr
0055DC8B|.8B08 |mov ecx, dword ptr
0055DC8D|.FF51 34 |call dword ptr
0055DC90|>8B55 D4 |mov edx, dword ptr
0055DC93|.B8 E4E15500 |mov eax, 0055E1E4 ;=
0055DC98|.E8 4F71EAFF |call 00404DEC
0055DC9D|.85C0 |test eax, eax
0055DC9F|.7E 03 |jle short 0055DCA4
0055DCA1|.FF45 E0 |inc dword ptr
0055DCA4|>43 |inc ebx
0055DCA5|.4E |dec esi
0055DCA6|.^ 0F85 73FFFFFF \jnz 0055DC1F
0055DCAC|>837D F4 00 cmp dword ptr , 0 ***这看来是对注册码中间部分的检验(是否输入了)
0055DCB0|.75 0C jnz short 0055DCBE
0055DCB2|.A1 C8D45A00 mov eax, dword ptr
0055DCB7|.8B00 mov eax, dword ptr
0055DCB9|.E8 96FDFFFF call 0055DA54
0055DCBE|>8B45 F4 mov eax, dword ptr ***输入的注册码中间部分(我这里是15987530)
0055DCC1|.E8 3A6EEAFF call 00404B00
0055DCC6|.8B55 F4 mov edx, dword ptr
0055DCC9|.807C02 FF 22cmp byte ptr , 22 ***最后1位与"比较。
0055DCCE|.75 17 jnz short 0055DCE7
0055DCD0|.8B45 F4 mov eax, dword ptr
0055DCD3|.E8 286EEAFF call 00404B00
0055DCD8|.8BD0 mov edx, eax
0055DCDA|.8D45 F4 lea eax, dword ptr
0055DCDD|.B9 01000000 mov ecx, 1
0055DCE2|.E8 6170EAFF call 00404D48
0055DCE7|>8B45 F4 mov eax, dword ptr
0055DCEA|.E8 116EEAFF call 00404B00
0055DCEF|.8BD8 mov ebx, eax
0055DCF1|.83FB 01 cmp ebx, 1
0055DCF4|.7C 2A jl short 0055DD20
0055DCF6|>8B45 F4 /mov eax, dword ptr
0055DCF9|.807C18 FF 22|cmp byte ptr , 22
0055DCFE|.75 1B |jnz short 0055DD1B
0055DD00|.8B45 F4 |mov eax, dword ptr
0055DD03|.E8 F86DEAFF |call 00404B00
0055DD08|.3BD8 |cmp ebx, eax
0055DD0A|.7F 0F |jg short 0055DD1B
0055DD0C|.8D45 F4 |lea eax, dword ptr
0055DD0F|.8BCB |mov ecx, ebx
0055DD11|.BA 01000000 |mov edx, 1
0055DD16|.E8 2D70EAFF |call 00404D48
0055DD1B|>4B |dec ebx
0055DD1C|.85DB |test ebx, ebx
0055DD1E|.^ 75 D6 \jnz short 0055DCF6
0055DD20|>8D55 B4 lea edx, dword ptr ***是否还有"。有的话就OVER
0055DD23|.8B45 F4 mov eax, dword ptr
0055DD26|.E8 3DC4EAFF call 0040A168
0055DD2B|.8B55 B4 mov edx, dword ptr
0055DD2E|.8D45 F4 lea eax, dword ptr
0055DD31|.E8 AA6BEAFF call 004048E0
0055DD36|.8B45 F4 mov eax, dword ptr
0055DD39|.E8 C26DEAFF call 00404B00
0055DD3E|.83F8 64 cmp eax, 64 ;哈哈,比较注册码的长度
0055DD41|.7D 0C jge short 0055DD4F ***是不是该JMP呢?/:017
0055DD43|.A1 C8D45A00 mov eax, dword ptr
0055DD48|.8B00 mov eax, dword ptr
....(省略部分代码)...
0055DF5D|>8B45 F4 mov eax, dword ptr
0055DF60|.E8 0337FFFF call 00551668 ;F7***注册码或格式不对的话,这里肯定挂。有猫腻哈
0055DF65|.B2 01 mov dl, 1
0055DF67|.A1 98DF4800 mov eax, dword ptr
0055DF6C|.E8 7F01F3FF call 0048E0F0
0055DF71|.8945 DC mov dword ptr , eax
0055DF74|.33C0 xor eax, eax
0055DF76|.55 push ebp
0055DF77|.68 ACE05500 push 0055E0AC
0055DF7C|.64:FF30 push dword ptr fs:
0055DF7F|.64:8920 mov dword ptr fs:, esp
0055DF82|.BA 01000080 mov edx, 80000001
0055DF87|.8B45 DC mov eax, dword ptr ***准备将注册信息写入注册表了
0055DF8A|.E8 9102F3FF call 0048E220
0055DF8F|.68 F0E15500 push 0055E1F0 ;software\aha-soft\
0055DF94|.A1 78D75A00 mov eax, dword ptr
0055DF99|.FF30 push dword ptr
0055DF9B|.68 0CE25500 push 0055E20C ;\
0055DFA0|.8D45 98 lea eax, dword ptr
0055DFA3|.E8 4034FFFF call 005513E8
0055DFA8|.FF75 98 push dword ptr
0055DFAB|.8D45 9C lea eax, dword ptr
0055DFAE|.BA 04000000 mov edx, 4
0055DFB3|.E8 086CEAFF call 00404BC0
0055DFB8|.8B55 9C mov edx, dword ptr
0055DFBB|.B1 01 mov cl, 1
0055DFBD|.8B45 DC mov eax, dword ptr
0055DFC0|.E8 2B03F3FF call 0048E2F0
0055DFC5|.8845 FB mov byte ptr , al
0055DFC8|.807D FB 00 cmp byte ptr , 0
0055DFCC|.0F84 C4000000 je 0055E096
0055DFD2|.8B4D F4 mov ecx, dword ptr
0055DFD5|.BA 18E25500 mov edx, 0055E218 ;key
0055DFDA|.8B45 DC mov eax, dword ptr
0055DFDD|.E8 EA08F3FF call 0048E8CC
0055DFE2|.BA 18E25500 mov edx, 0055E218 ;key
0055DFE7|.8D4D 94 lea ecx, dword ptr
0055DFEA|.8B45 DC mov eax, dword ptr
0055DFED|.E8 0E09F3FF call 0048E900
0055DFF2|.8B55 94 mov edx, dword ptr
0055DFF5|.8B45 F4 mov eax, dword ptr
0055DFF8|.E8 136CEAFF call 00404C10
0055DFFD|.0F9445 FB sete byte ptr
0055E001|.E8 F2DCEAFF call 0040BCF8
0055E006|.83C4 F8 add esp, -8 ; /
0055E009|.DD1C24 fstp qword ptr ; |Arg1 (8 字节)
0055E00C|.9B wait ; |
0055E00D|.BA 24E25500 mov edx, 0055E224 ; |time
0055E012|.8B45 DC mov eax, dword ptr ; |
0055E015|.E8 7209F3FF call 0048E98C ; \ART***.0048E98C
0055E01A|.8D45 90 lea eax, dword ptr
0055E01D|.E8 B2510400 call 005A31D4
0055E022|.8B4D 90 mov ecx, dword ptr
0055E025|.BA 34E25500 mov edx, 0055E234 ;fullproductname
0055E02A|.8B45 DC mov eax, dword ptr
0055E02D|.E8 9A08F3FF call 0048E8CC
0055E032|.8D55 8C lea edx, dword ptr
0055E035|.8B45 FC mov eax, dword ptr
0055E038|.8B80 F0020000 mov eax, dword ptr
0055E03E|.E8 410AEEFF call 0043EA84
0055E043|.8B45 8C mov eax, dword ptr
0055E046|.8D55 D8 lea edx, dword ptr
0055E049|.E8 1AC1EAFF call 0040A168
0055E04E|.837D E0 01 cmp dword ptr , 1
0055E052|.74 32 je short 0055E086
0055E054|.FF75 D8 push dword ptr
0055E057|.68 4CE25500 push 0055E24C ;<br>
0055E05C|.68 5CE25500 push 0055E25C ; -
0055E061|.8D55 88 lea edx, dword ptr
0055E064|.8B45 E0 mov eax, dword ptr
0055E067|.E8 30C3EAFF call 0040A39C
0055E06C|.FF75 88 push dword ptr
0055E06F|.68 D8E15500 push 0055E1D8
0055E074|.68 68E25500 push 0055E268 ;licenses -
0055E079|.8D45 D8 lea eax, dword ptr
0055E07C|.BA 06000000 mov edx, 6
0055E081|.E8 3A6BEAFF call 00404BC0
0055E086|>8B4D D8 mov ecx, dword ptr
0055E089|.BA 7CE25500 mov edx, 0055E27C ;username
0055E08E|.8B45 DC mov eax, dword ptr
0055E091|.E8 3608F3FF call 0048E8CC
0055E096|>33C0 xor eax, eax
0055E098|.5A pop edx
0055E099|.59 pop ecx
0055E09A|.59 pop ecx
0055E09B|.64:8910 mov dword ptr fs:, edx
0055E09E|.68 B3E05500 push 0055E0B3
0055E0A3|>8B45 DC mov eax, dword ptr
0055E0A6|.E8 F558EAFF call 004039A0
0055E0AB\.C3 retn
显然,如果不想输入100位以上,那就把:
0055DD3E|.83F8 64 cmp eax, 64 ;哈哈,比较注册码的长度
0055DD41|.7D 0C jge short 0055DD4F
这里的jge short 0055DD4F
改成JMP short 0055DD4F
这个CALL有问题:
0055DF60|.E8 0337FFFF call 00551668 ***我们要进去“改造”它
我们F7进来后,重点修改这里:
00551668 53 push ebx
00551669|.8BD8 mov ebx, eax
0055166B|.803B 30 cmp byte ptr , 30
0055166E 75 17 jnz short 00551687 ***一跳就挂
00551670|.8BC3 mov eax, ebx
00551672|.E8 8934EBFF call 00404B00
00551677|.3D AD000000 cmp eax, 0AD
0055167C 75 09 jnz short 00551687 ***一跳就挂
0055167E|.80BB AC000000>cmp byte ptr , 3D
00551685 74 16 je short 0055169D ***跳向光明之巅
00551687|>B9 A8165500 mov ecx, 005516A8 ;invalid key ***这2个单词不用说了吧
0055168C B2 01 mov dl, 1
0055168E|.A1 B8914000 mov eax, dword ptr
00551693|.E8 34C7EBFF call 0040DDCC
00551698|.E8 F72AEBFF call 00404194
0055169D|>5B pop ebx
0055169E\.C3 retn
呵呵,那我们看看有什么方法可以实现暴破?
方法一:
00551668 53 push ebx
直接改成
00551668 C3 retn
方法二:
00551669|.8BD8 mov ebx, eax
0055166B|.803B 30 cmp byte ptr , 30
直接改成
00551669 5B pop ebx
0055166A C3 retn
方法三:
同时改掉下面几处:
0055166E /75 17 jnz short 00551687
直接NOP掉(或者改成JZ)
0055167C /75 09 jnz short 00551687
也要NOP掉(或者改成JZ)
00551685 /74 16 je short 0055169D
改成
00551685 /EB 16 jmp short 0055169D
呵呵,三种方法都能爆破成功!,而且不用受到- key begin key - 、 - key end key -的格式限制。
在这里强调一下,为避免出现3楼的朋友那样的情况,这里要改一下,不然就输入至少100位注册码哈/:017
0055DD41|.7D 0C jge short 0055DD4F
这里的jge short 0055DD4F
改成JMP short 0055DD4F
注册信息保存在注册表里哈:
"Key"="15987530"
"Time"=hex:71,1f,43,23,cf,b0,e3,40
"FullProductName"="Aha-soft Art*** 5.28 Build 2010-May-03"
"UserName"="gglhy"
另外,这个软件如果破解注册成功,运行原版也成了注册版。可能只是判断了下注册表里是否存在注册信息而已。(没OD啊,猜的。哈哈)
这倒有点像泡MM,没搞定的时候你无可奈何,一旦追到手,哈哈。她可不问你是绅士还是流氓,反正就是对你死心塌地的人了!/:017
刚看了下,只要注册表里有"Key"且值不为空即是注册版了。兄弟们自己动手建立一下就ok了。"UserName"倒是可有可无,如果没有程序会把电脑的系统属性中注册到的名称当做USERMANE的。
这个CALL给出了注册码的限制条件:
(用户名貌似没有参与运算,而且好像不存在算法,只要满足一定条件即可。有时间仔细验证下)
0055DF60|.E8 0337FFFF CALL ARTICONS.00551668 进入后:
00551668/$53 PUSH EBX
00551669 8BD8 MOV EBX,EAX
0055166B|.803B 30 CMP BYTE PTR DS:,30 ;输入的注册码是不是0开头?不是就错。
0055166E|.75 17 JNZ SHORT ARTICONS.00551687
00551670|.8BC3 MOV EAX,EBX
00551672|.E8 8934EBFF CALL ARTICONS.00404B00
00551677|.3D AD000000 CMP EAX,0AD ;输入的注册码的长度是否为AD,即173位,不是就错。
0055167C|.75 09 JNZ SHORT ARTICONS.00551687 ;
0055167E|.80BB AC000000>CMP BYTE PTR DS:,3D ;输入的注册码的是否以=结尾,不是就错。
00551685|.74 16 JE SHORT ARTICONS.0055169D ;
00551687|>B9 A8165500 MOV ECX,ARTICONS.005516A8 ;Invalid key
0055168C|.B2 01 MOV DL,1
0055168E|.A1 B8914000 MOV EAX,DWORD PTR DS:
00551693|.E8 34C7EBFF CALL ARTICONS.0040DDCC
00551698|.E8 F72AEBFF CALL ARTICONS.00404194
0055169D|>5B POP EBX
0055169E\.C3 RETN
汗,看来不用前面的三种方法来修改,只要输入的注册码同时满足这三种条件即可改。
0055DDC6|.83F8 03 CMP EAX,3 ;输入的注册码的行数是否小于3。是的话跳向失败
0055DDC9|.0F8C 8E010000 JL ARTICONS.0055DF5D ;
这里虽然有个条件判断,但是貌似跳了无所谓。(有时间再研究一下这里) 好,正需要,学习! 好像三种方法都不行?每个都试了一下,楼主你再看看是不是这样,一运行还是出注册框,而且注册随便输入,还是提示 please reenter key .key is required. 好强大,看楼上的情况是不是出现暗桩了呢/:022 好像三种方法都不行?每个都试了一下,楼主你再看看是不是这样,一运行还是出注册框,而且注册随便输入,还 ...
sdnyzjzx 发表于 2010-6-3 16:15 https://www.chinapyg.com/images/common/back.gif
前面的有个CMP EAX,64下面的JGE改成JMP了没?
/:017 要不你就输入至少100位哈 有点儿KEYFILE的味道哈 谢谢分享,认真学习一下 GGLHY有空可以看下算法。这个算法不复杂的。 GGLHY有空可以看下算法。这个算法不复杂的。
zaas 发表于 2010-6-3 17:30 https://www.chinapyg.com/images/common/back.gif
/:018
呵呵,最近事情太多。很难专门抽出时间来搞。但是算法一定会找个时间好好看看。谢谢ZAAS啊:handshake 顶下兄弟的作品,膜拜下/:good
页:
[1]
2