首页
社区
课程
招聘
[原创]WinASO REG Optimizer 2.6 注册算法分析
发表于: 2006-7-21 03:52 6999

[原创]WinASO REG Optimizer 2.6 注册算法分析

2006-7-21 03:52
6999

【文章标题】: WinASO Registry Optimizer 2.6
【文章作者】: PeerLessSoul
【作者邮箱】: liuz@km169.net
【作者主页】: http://114989149.qzone.qq.com
【作者QQ号】: 114989149
【软件名称】: WinASO Registry Optimizer 2.6
【软件大小】: 2.32MB
【下载地址】: www.download.com
【保护方式】: 注册码验证
【使用工具】: Peid,Ollice,W32dsm8.93
【作者声明】: 本人小菜,请大侠们不要见笑……
--------------------------------------------------------------------------------
【软件简介】
WinASO Registry Optimizer 是款系统注册表优化工具,在www.download.com上
Editor's rating ★★★★★
Average user rating ★★★☆
用下来感觉差不多~
【注册过程】
  1.查壳(使用Peid)Borland Delphi 6.0 - 7.0 ,我就不多说了!
  2.运行软件查看注册出错对话筐中的文字信息。
  输入伪码,输入伪码感觉也有讲究……比如先什么都不输入直接点注册,看提示是否跟输入以后有奇异
这样脑子中就有思路了!代码段开始可能有个比较空,空就直接跳走的代码吧!经过伪码输入验证……发现无

论输哪个筐里面,和什么都不输入 ,和只输入某几个筐都出现相同的提示!这个意味着,他是通过全部的注册

码比对运算后才有一个终结跳转……或者是这些输入的注册码之间有什么联系(这个也是猜的)……因为就这个

软件而言没有用户名输入,他会不会取计算机名或者用户名来运算出正确注册码呢?我们就来看看我们的猜想

……可能大家的猜想更多。可以试着去猜想……软件也是人编的……可能会有跟作者想到一块的时候吧……
ok!理一下思路……我们继续玩猜想论
  2.1.开头可能没有一个空的cmp,注册码之间可能有联系。可能取用户名/计算机名来计算注册码。
  这里我输入1111-2222-3333-4444-5555 点击register在 出现
"Sorry,this is an invalid license Key……'字符串……启动W32dsm8.93载入主程序文件…查看字符串!似乎

是没有什么对应的字符串……那我们直接使用ollice.载入程序!
3.输入注册伪码,这里我输入1111-2222-3333-4444-5555 开始追踪……
OLLice跟踪过程这个软件Call相对要多一点,一定要有耐心……ollice载入程序!
--------------------------------------------------------------------------------
直接F9,然后输入伪码,先不用点register.返回Ollice 中Alt+E 下断MessageBoxA!再回到软件领空,然后点

注册……程序被断下到这里……
--------------------------------------------------------------------------------
观察标题栏,是user32中
77D5050B >  8BFF            mov     edi, edi    ; 点击注册按钮后程序断在此
77D5050D    55              push    ebp         ; 观察ollice右下,这里为出现错误框作准备。
77D5050E    8BEC            mov     ebp, esp
77D50510    833D 1C04D777 0>cmp     dword ptr [>
77D50517    74 24           je      short 77D50>
77D50519    64:A1 18000000  mov     eax, fs:[18>
77D5051F    6A 00           push    0
77D50521    FF70 24         push    dword ptr [>
77D50524    68 F40AD777     push    77D70AF4
77D50529    FF15 1812D177   call    [<&KERNEL32>; kernel32.InterlockedCompareExchange
77D5052F    85C0            test    eax, eax
77D50531    75 0A           jnz     short 77D50>
77D50533    C705 F00AD777 0>mov     dword ptr [>
77D5053D    6A 00           push    0
77D5053F    FF75 14         push    dword ptr [>
77D50542    FF75 10         push    dword ptr [>
77D50545    FF75 0C         push    dword ptr [>
77D50548    FF75 08         push    dword ptr [>
77D5054B    E8 2D000000     call    MessageBoxE>;
77D50550    5D              pop     ebp
77D50551    C2 1000         retn    10
--------------------------------------------------------------------------------
我们先不管他,F9走~返回到程序领空.然后删除第一个空格里面的伪码1111再点注册,呵呵还是断在这里……

在试试其他的……如果是不填写任何一个空格,或者是在任何一个框中输入了非数字字符,那么程序直接提示

注册错误,没被断下来!经过试验,发现只要你输入的是数字,点注册都能断在这里(当然是注册码不对的情况

下!呵呵).好么,我们看看是如何进入这个错误筐代码段呢?在一次的注册……又在一次的的被断下……不同

的操作是我们一步一步走~让他反回去,也可以按下ctrl+f9直接返回程序领空!当单步走到上面代码中

77D5054B    E8 2D000000     call    MessageBoxE>; 这个就是出现错误叫你确定的对话筐,现在回程序点

ok,又回到ollice再单步走……过了
77D50551    C2 1000         retn    10
你会发现你的标题栏改变了~现在就是程序领空了,出来后到这里,一出来就是个jmp!买买……
005634DB  |. /E9 BE010000   jmp     0056369E
这个时候你会发现上面有个Call……你说那个是Call什么的?猜一下啊……
猜不出也不紧……就没必要往下看了。我们往上……一小点就发现个je,这家伙会不会是关键跳?具体代码如下
--------------------------------------------------------------------------------
程序领空
005634B0  |. /74 2E         je      short 005634E0      ; 这里有个je,看看右边有个目标连线。去看看
005634B2  |. |6A 40         push    40
005634B4  |. |A1 349E5800   mov     eax, [589E34]
005634B9  |. |8B80 6C080000 mov     eax, [eax+86C]
005634BF  |. |E8 9821EAFF   call    0040565C
005634C4  |. |50            push    eax
005634C5  |. |8B45 FC       mov     eax, [ebp-4]
005634C8  |. |E8 8F21EAFF   call    0040565C
005634CD  |. |50            push    eax
005634CE  |. |8BC3          mov     eax, ebx
005634D0  |. |E8 D7AFEFFF   call    0045E4AC
005634D5  |. |50            push    eax                 ; |hOwner
005634D6  |. |E8 BD4DEAFF   call    <jmp.&user32.Messag>; \MessageBoxA
005634DB  |. |E9 BE010000   jmp     0056369E            ;  返回程序领空时,我们出现在这里
005634E0  |> \8B75 F8       mov     esi, [ebp-8]        ;  哦~如果上面Je实现就跳过了上面这个jmp,

而上面这个jmp就是跳死的……
--------------------------------------------------------------------------------
会不会是关键跳?改啊~试啊~诀窍就是这两点!怕什么……有不是在系统领空,呵呵~
在005634B0 下断…并je->jne,在走一遍注册过程!哦~注册后断在005634B0 发现原来je没有实现,改成jne后

实现跳转……跳到005634E0开始另外一段代码段……
--------------------------------------------------------------------------------
005634E0  |> \8B75 F8       mov     esi, [ebp-8]        ;  修改后到这里……我们单步走!
005634E3  |.  81C6 EB000000 add     esi, 0EB
005634E9  |.  0FAFF7        imul    esi, edi
005634EC  |.  83EE 05       sub     esi, 5
005634EF  |.  8D55 AC       lea     edx, [ebp-54]
005634F2  |.  8BC6          mov     eax, esi
005634F4  |.  E8 3767EAFF   call    00409C30
005634F9  |.  8B45 AC       mov     eax, [ebp-54]
005634FC  |.  8D4D B0       lea     ecx, [ebp-50]
005634FF  |.  BA 04000000   mov     edx, 4
00563504  |.  E8 174CEEFF   call    00448120
00563509  |.  8B45 B0       mov     eax, [ebp-50]
0056350C  |.  50            push    eax
0056350D  |.  8D55 A8       lea     edx, [ebp-58]
00563510  |.  8B83 C0030000 mov     eax, [ebx+3C0]
00563516  |.  E8 9134EFFF   call    004569AC
0056351B  |.  8B55 A8       mov     edx, [ebp-58]
0056351E  |.  58            pop     eax
0056351F  |.  E8 8420EAFF   call    004055A8
00563524      74 2E         je      short 00563554        ;这里有个je又在跳什么啦?
00563526  |.  6A 40         push    40
00563528  |.  A1 349E5800   mov     eax, [589E34]
0056352D  |.  8B80 6C080000 mov     eax, [eax+86C]
00563533  |.  E8 2421EAFF   call    0040565C
00563538  |.  50            push    eax
00563539  |.  8B45 FC       mov     eax, [ebp-4]
0056353C  |.  E8 1B21EAFF   call    0040565C
00563541  |.  50            push    eax
00563542  |.  8BC3          mov     eax, ebx
00563544  |.  E8 63AFEFFF   call    0045E4AC
00563549  |.  50            push    eax                 ; |hOwner
0056354A  |.  E8 494DEAFF   call    <jmp.&user32.Messag>; 到这里有弹出注册错误的对话筐……
--------------------------------------------------------------------------------
联想起第一个错误对话筐,往上找找,又有个je,我们再来修改,再在je哪里下断!!

--------------------------------------------------------------------------------
00563524     /75 2E         je     short 00563554       ;修改后实现跳转
00563526  |. |6A 40         push    40
00563528  |. |A1 349E5800   mov     eax, [589E34]
0056352D  |. |8B80 6C080000 mov     eax, [eax+86C]
00563533  |. |E8 2421EAFF   call    0040565C
00563538  |. |50            push    eax
00563539  |. |8B45 FC       mov     eax, [ebp-4]
0056353C  |. |E8 1B21EAFF   call    0040565C
00563541  |. |50            push    eax
00563542  |. |8BC3          mov     eax, ebx
00563544  |. |E8 63AFEFFF   call    0045E4AC
00563549  |. |50            push    eax            ; |hOwner
0056354A  |. |E8 494DEAFF   call    <jmp.&user32.M>; \MessageBoxA;实现跳转就跳过了这个错误筐!
0056354F  |. |E9 4A010000   jmp     0056369E
00563554  |> \8D55 A4       lea     edx, [ebp-5C]       ;上面跳到这里!
--------------------------------------------------------------------------------
我们单步往下走,发现提示注册成功……但是退出后再运行程序,还是要注册!伤!说明只是暂时的欺骗过去

一下……但是我们也获取到重要信息,再追一下可能有转机……实现完美注册!
清理一下思路,我们改了两个je为jne而实现个伪注册……
005634B0  |. /74 2E         je     short 005634E0   
00563524     /75 2E         je     short 00563554
这两个跳转实现注册成功提示!(没有完美注册!)绕过出错的对话筐…
还有一点要明白~如果第一个跳转没有实现也就走不到第二个跳转……
现在我们就要找出让他们跳转的条件……撤销所有修改……
返回到第一个关键je,
--------------------------------------------------------------------------------
005634AB  |.  E8 F820EAFF   call    004055A8
005634B0      74 2E         je      short 005634E0 ;  这是我断下后见到的第一个关键je
005634B2  |.  6A 40         push    40
这个CAll很有可能是在判断什么……进去看看在call处下断,然后进入……
--------------------------------------------------------------------------------
004055A8  /$  53            push    ebx                       ;进入后观察寄存器的值
004055A9  |.  56            push    esi                       
004055AA  |.  57            push    edi
004055AB  |.  89C6          mov     esi, eax                  
004055AD  |.  89D7          mov     edi, edx
004055AF  |.  39D0          cmp     eax, edx                  ;喜欢这个吧~在数据栏中就清楚看到伪

码同一个数字比较(我这里是8639)
004055B1  |.  0F84 8F000000 je      00405646                  ;上面比较相同跳走!
.<代码省略>
.<代码省略>
.<代码省略>
.<代码省略>
00405646  |>  5F            pop     edi                             ;如果上面je跳转实现就跳到这里
00405647  |.  5E            pop     esi
00405648  |.  5B            pop     ebx
00405649  \.  C3            retn                                    ;返回到005634B0来判断第一个关

键je是否实现……
--------------------------------------------------------------------------------
那么我们就把4444改写为8639,伪码写成1111-2222-3333-8639-5555在来注册这个时候发现第一个je通过了,

而我们的的第二个je又没有实现跳转,再往第二个je上看看,果然又发现一个Call。同样到了4055A8,清晰了!

原来4055A8是用来比较伪码与真码的程序段。同样从004055AF中清晰的看出是5555同8091比较,je就实现也就

跳出比较的程序段,然后第二个关键je实现……也就成功注册上了!
那好现在我输入1111-2222-3333-8639-8091注册成功……单独启动程序,没提示需要注册……算是完美注册了
我们是要Key它,就继续我们的路程吧!现在看看1111-2222-3333是否跟后面的8639-8091有决定性的影响?
还是下断在MessageBoxA然后试着改变一下1111-2222-3333看看程序是否能被断下~果然当你改变前面的字符!

程序还是被断下。说明是存在关系的。根据前面的一些思路~那个真码应该是在第一个关键je之前出现,我们

直接去第一个关键je,前面!在0056347B下断!F8 单步走~细心留意寄存器里面的值!走一遍之后你会大致了

解第一次出现明码在什么地方!
--------------------------------------------------------------------------------
0056347B  |> \8D55 B8       lea     edx, [ebp-48]          ;  edx=第一个四位伪码(1111)
0056347E  |.  8BC6          mov     eax, esi
00563480  |.  E8 AB67EAFF   call    00409C30
00563485  |.  8B45 B8       mov     eax, [ebp-48]          ;  原始码首次出现
00563488  |.  8D4D BC       lea     ecx, [ebp-44]          ;  原始码
0056348B  |.  BA 04000000   mov     edx, 4
00563490  |.  E8 8B4CEEFF   call    00448120               ;  原始码去后四位得(第四位)真码
00563495  |.  8B45 BC       mov     eax, [ebp-44]          ;  eax=[ebp-44](真码)
00563498  |.  50            push    eax
00563499  |.  8D55 B4       lea     edx, [ebp-4C]
0056349C  |.  8B83 B4030000 mov     eax, [ebx+3B4]         ;  eax=真码
005634A2  |.  E8 0535EFFF   call    004569AC
005634A7  |.  8B55 B4       mov     edx, [ebp-4C]          ;  edx=注册伪码
005634AA  |.  58            pop     eax
005634AB  |.  E8 F820EAFF   call    004055A8               ;  (第四位)假码与真码比较
005634B0      74 2E         je      short 005634E0         ;  这个就是我们的第一个关键跳……
--------------------------------------------------------------------------------
经过测试~发现每当改变前两个伪码,那么005634AB那里出现的明码就是改变。我们再大胆的猜,注册码后两

位与前两位有关!为了追查算法……我们该整理一下手头资料!
1111-2222-3333-8639-8091
hex:457-8AE-D05-21BF-1F9B
我们再进入ollice去一探究竟……我们往上看……到这里出现个类真码,应为他有7位,而后四位就是我们的真

码8639
00563485  |.  8B45 B8       mov     eax, [ebp-48]          ;  原始码首次出现
那么更加清晰了啊~算这个原始明码肯定在前面……我们走!
到这里……005633F9下断以后我们在F8步过……观察寄存器值以及中间那个数据栏中情况变化……发现!……
--------------------------------------------------------------------------------
005633F6  |> \8D55 C8       lea     edx, [ebp-38]    ;  
005633F9  |.  8B83 A0030000 mov     eax, [ebx+3A0]
005633FF  |.  E8 A835EFFF   call    004569AC
00563404  |.  8B45 C8       mov     eax, [ebp-38]    ;  取第一个伪码
00563407  |.  E8 6069EAFF   call    00409D6C
0056340C  |.  8BF0          mov     esi, eax         ;  取第一个伪码的hex
0056340E  |.  8D55 C4       lea     edx, [ebp-3C]
00563411  |.  8B83 A4030000 mov     eax, [ebx+3A4]
00563417  |.  E8 9035EFFF   call    004569AC
0056341C  |.  8B45 C4       mov     eax, [ebp-3C]    ;  取第二个伪码!
0056341F  |.  E8 4869EAFF   call    00409D6C
00563424  |.  8BF8          mov     edi, eax         ;  取第二个伪码的Hex
00563426  |.  8D55 C0       lea     edx, [ebp-40]
00563429  |.  8B83 AC030000 mov     eax, [ebx+3AC]
0056342F  |.  E8 7835EFFF   call    004569AC
00563434  |.  8B45 C0       mov     eax, [ebp-40]    ;  取第三个伪码!
00563437  |.  E8 3069EAFF   call    00409D6C
0056343C  |.  8945 F8       mov     [ebp-8], eax     ;  取第三个伪码的Hex
0056343F  |.  0FAFF7        imul    esi, edi         ;  第二个伪码Hex*第一个伪码Hex
00563442  |.  83EE 03       sub     esi, 3           ;  上面结果-3
00563445  |.  81FE 10270000 cmp     esi, 2710        ;  与2710比较,也就是不能大于10000
0056344B  |.  7D 2E         jge     short 0056347B   ;  小于就跳转!

--------------------------------------------------------------------------------
在上面的步过中,你会发现我们输入伪码被转换成十六进制,还是把伪码先翻成十六进制好!在这里你可以一

眼看出的……
在写成数学的计算公式:
第四个真码为:第一位伪码的十六进制*第二位伪码的十六进制-3,最后结果在换成十进制,再取最后四位!
1111-2222-3333-8639-8091
hex:457-8AE-D05-21BF-1F9B
(8AE*457)=0025ab22-3=0025ab1f ,0025ab1f转十进制为2468639.再取后四位8639,ok!搞定一个了!
接下来思考~上面说了……有两个关键跳~我们这里就是在第一个关键跳失效的情况下,往前找到算理。
那么后一个我们可以照葫芦画瓢,让第一个关键je实现……在第二个关键je上面找寻我们的答案……
这下输入伪码1111-2222-3333-8639-5555 可以直接到第二个关键je的前面点处下断了……我们再进入ollice去

一探究竟……又发现……
--------------------------------------------------------------------------------
005634E0  |> \8B75 F8       mov     esi, [ebp-8]   ;  这里以来就取第三位伪码Hex
005634E3  |.  81C6 EB000000 add     esi, 0EB       ;  上面的Hex加上0EB
005634E9  |.  0FAFF7        imul    esi, edi       ;  第二位Hex*上面的值
005634EC  |.  83EE 05       sub     esi, 5         ;  再减去5
005634EF  |.  8D55 AC       lea     edx, [ebp-54]
005634F2  |.  8BC6          mov     eax, esi
005634F4  |.  E8 3767EAFF   call    00409C30
005634F9  |.  8B45 AC       mov     eax, [ebp-54]
005634FC  |.  8D4D B0       lea     ecx, [ebp-50]  ;  将上面的值转成十进制!
005634FF  |.  BA 04000000   mov     edx, 4
00563504  |.  E8 174CEEFF   call    00448120
00563509  |.  8B45 B0       mov     eax, [ebp-50]  ;  取后四位位为真码!
0056350C  |.  50            push    eax
0056350D  |.  8D55 A8       lea     edx, [ebp-58]
00563510  |.  8B83 C0030000 mov     eax, [ebx+3C0]
00563516  |.  E8 9134EFFF   call    004569AC
0056351B  |.  8B55 A8       mov     edx, [ebp-58]
0056351E  |.  58            pop     eax
0056351F  |.  E8 8420EAFF   call    004055A8       ;  真码伪码的最后一次比较~成功就注册喽!
00563524      74 2E         je      short 00563554 ; 这里就是关键的成败了……呵呵!
Well!清理线索的时间又到喽!
最后的注册码比较跟前面的类似,
最后一个的算法写成文字就是:
第二位伪码的十六进制乘以(第三位伪码的十六进制+0EB),再减去5,再转十进制……取后四位成为真码~
顺便写个注册机了!程序业余爱好者,就使用VB了~大家见谅~
注册机下载地址:http://km.liuz.googlepages.com/ASO-Keygen.exe
【后话】:这个是我第二篇写破文,感觉不是那么流畅……我发之前看了好几遍~力求给您一个清晰的思路。
可能还有些地方没写清楚~如果你有什么建议的话可以留贴!
pediy上高手众多,望高人不要见笑!
我以后会多写些东西出来给大家分享,这也是我的一个自我总结,呵呵~大家一同学习一同进步。
---------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                    2006年07月21日
                                                       凌晨 3:43


[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 223
活跃值: (27)
能力值: ( LV10,RANK:165 )
在线值:
发帖
回帖
粉丝
2
哎~花了我好长时间写 啊~自己顶一下
2006-7-21 21:44
0
雪    币: 3853
活跃值: (4452)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
3
不错支持下。

看看这个站点的另外需要注册的,算法类似,希望把全系列搞定。
2006-7-21 23:04
0
雪    币: 223
活跃值: (27)
能力值: ( LV10,RANK:165 )
在线值:
发帖
回帖
粉丝
4
最初由 china 发布
不错支持下。

看看这个站点的另外需要注册的,算法类似,希望把全系列搞定。


呵呵~等我明后天开工!
2006-7-22 04:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享......
2006-7-22 12:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 sliphades 发布
呵呵~等我明后天开工!


已经找出算法了~还是比较简单的。~希望大家指教~
WinASO EasyTweak V2.1.3
除了注册号不使用字母外,长度为16.还要满足以下条件!
前一个四位是任意的.
第二个四位是16进制要为211(529)
第三个四位是16进制要为27E (638)
第四个四位是16进制要为439(1081)
所以注册码为:6666052906381081

WinASO Disk Cleaner
注册算法:
注册码中不能有非数字字符,要有16位长
从注册码第4位到7位必须满足一下条件:
1.先把这个4位数组中的第1移到第3位,第2位移到第1位,第3位移到第2位最后第4位不变,移动后的结果换16进制,如果这个16进制等于A9(Dec:169)那么就跳走下一段的验证,否则立即注册失败!

输入:6019  
转换:0169   (正确)
-------
2.上面的成功就跳转到这里,进行!9~12位的验证.9~12位则要满足
先把这个4位数组中的第1位和第3位互换,第2位和第4位互换。 最后结果换十六进制,且如果这个16进制等于121(Dec:289)则跳往下一部分的验证!否则注册失败。
-------------
输入: 8902
转换:0289 (正确)
-------------
3.上面的成功就跳转到这里,进行!13~16位的验证.13~16位则要满足:
先把这个4位数组,1位和4位互相换。2和3位互换!最后结果换16进制等于169(Dec:361)这里就注册成功了!
-------------
输入: 1630
转换:0361 (正确)
-------------
所以注册码为:1234601989021630

感觉这几个相对于楼主那个,较简单!
2006-7-22 15:26
0
雪    币: 223
活跃值: (27)
能力值: ( LV10,RANK:165 )
在线值:
发帖
回帖
粉丝
7
最初由 Ckey 发布
已经找出算法了~还是比较简单的。~希望大家指教~
WinASO EasyTweak V2.1.3
除了注册号不使用字母外,长度为16.还要满足以下条件!
前一个四位是任意的.
第二个四位是16进制要为211(529)
........

谢谢了啊~
2006-7-22 15:56
0
雪    币: 3853
活跃值: (4452)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
8
软件相对简单,我在6月30写了注册机,适合我们这样的新手学习。
2006-7-22 18:04
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
昨天正好也看到这个软件!!
2006-7-22 18:38
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
代码省略干什么???
2006-7-22 19:46
0
雪    币: 223
活跃值: (27)
能力值: ( LV10,RANK:165 )
在线值:
发帖
回帖
粉丝
11
最初由 w三二dasm 发布
代码省略干什么???


呵呵~你自己追追看啊~中间那些感觉不是那么重要,写出来占篇幅。没什么意思!
2006-7-22 19:49
0
雪    币: 436
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这么清楚 !!
分析的真是清楚!!!
看到我心里头都有的痒痒都想自己再试一次了!!
2006-7-22 23:06
0
游客
登录 | 注册 方可回帖
返回
//