吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8279|回复: 11
收起左侧

[原创] ..考研词汇 1.0 InlineHook API 爆破之解文

[复制链接]
GUC 发表于 2009-12-16 17:04
本帖最后由 GUC 于 2009-12-16 19:04 编辑

原版:http://www.onlinedown.net/soft/82461.htm

破解不是本文的重点,这里简略带过。
软件会找目录下的key.bb文件,其实就是个记事本文件,里面写上16个数字就可以了,接下来关键点如下:
004EED6B    55                         push    ebp                       ; 这是关键call内部,eax返回非0就是注册成功
004EED6C    8BEC                       mov     ebp, esp
004EED6E    8B4D 0C                    mov     ecx, dword ptr [ebp+C]
004EED71    E8 B4FDFFFF                call    004EEB2A
004EED76    50                         push    eax
004EED77    8B4D 08                    mov     ecx, dword ptr [ebp+8]
004EED7A    E8 E4FDFFFF                call    004EEB63
004EED7F    F7D8                       neg     eax                       ; 爆破方式n多,我用这里的三行共5个字节写mov eax,-1
004EED81    1BC0                       sbb     eax, eax                  ; 爆破方式n多,我用这里的三行共5个字节写mov eax,-1
004EED83    40                         inc     eax                       ; 爆破方式n多,我用这里的三行共5个字节写mov eax,-1
004EED84    5D                         pop     ebp
004EED85    C2 0800                    retn    8

这个地方共被11个地方调用。

软件的壳很少见,是PEX 0.99 -> bart/CrackPl,脱壳后本机运行成功,但在虚拟机里测试发现不能跨平台,看一下,原来这个壳处理后程序调用api的方式都是:
00866780  - E9 1077FA7B                jmp     7C80DE95                  ; kernel32.7C80DE95
00866785  - E9 85C1FC7B                jmp     7C83290F                  ; kernel32.ResumeThread
0086678A  - E9 9440FA7B                jmp     7C80A823                  ; kernel32.GetThreadPriority
0086678F  - E9 045AFA7B                jmp     7C80C198                  ; kernel32.SetThreadPriority
00866794  - E9 D1AAFA7B                jmp     7C81126A                  ; kernel32.GetVersion
。。。

彻底晕倒。

放弃脱壳,可以通过多层SMC去搞定他,也可以简单地用loader、lpk,但本文讲另外一个思路:InlineHook API进行爆破。

但是找哪个api呢?
我们通过esp定律发现他在OEP之前第一次用了VirtualFree函数,那时候代码全已出现但未执行,时机很perfect!就它了!

载入程序,Ctrl+N看一下:
Address    Section    Type    Name                                    Comment
00866379              Import  KERNEL32.ExitProcess
00866371              Import  KERNEL32.GetProcAddress
00866375              Import  KERNEL32.LoadLibraryA
00866369              Import  USER32.MessageBoxA
008DB000&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;Export&#160;&#160;<ModuleEntryPoint>
0086637D&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;Import&#160;&#160;KERNEL32.VirtualAlloc
00866381&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;Import&#160;&#160;KERNEL32.VirtualFree

已经有KERNEL32.LoadLibraryA和KERNEL32.GetProcAddress的地址了(分别在dword [00866375]和dword [00866371]),有这对搭档在足够我们干很多事了!乐啊
这里还已经有了KERNEL32.VirtualFree,在dword [00866381],可以直接拿来用(即使没有,咱们也可以通过LoadLibraryA跟GetProcAddress获取)。
强调,下面的代码里,KERNEL32.VirtualFree的地址dword [00866381]是直接拿来用的,不要看到dword [00866381]感到莫名其妙。。。

基本信息有了,咱们开工!
1、首先找个空地。
程序空地不少,但是我仍喜欢加个区段,所以我加了个区段,大小只要200个字节左右就行了,因为补丁的代码只需要大概170个字节。
我加的段VA:008DB000

2、用LordPE修改程序的入口为新段的地址008DB000,OD载入,开始写代码:
PS:008DB026这里call eax ; VirtualProtect是为了使VirtualFree函数前6个字节可写可读,防止api地址不可写导致我们挂钩失败。不清楚的自己去查下api手册。
008DB000 > $&#160;&#160;68 92B08D00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;push&#160; &#160; 8DB092&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;; /ASCII "kernel32.dll"&#160; &#160;8DB092这里你自己去写下ASCII "kernel32.dll"
008DB005&#160; &#160;.&#160;&#160;FF15 75638600&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;call&#160; &#160; dword ptr [866375]&#160; &#160;&#160; &#160;&#160;&#160;; \kernel32.LoadLibraryA&#160;&#160;返回基址到eax
008DB00B&#160; &#160;.&#160;&#160;68 A2B08D00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;push&#160; &#160; 8DB0A2&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;; /ASCII "VirtualProtect"&#160; &#160;8DB0A2这里你自己去写下ASCII "VirtualProtect"
008DB010&#160; &#160;.&#160;&#160;50&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;push&#160; &#160; eax&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;; |这里是刚得到的kernel32.dll的基址
008DB011&#160; &#160;.&#160;&#160;FF15 71638600&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;call&#160; &#160; dword ptr [866371]&#160; &#160;&#160; &#160;&#160;&#160;; \kernel32.GetProcAddress&#160; &#160;返回VirtualProtect的函数的地址到eax
008DB017&#160; &#160;.&#160;&#160;68 B2B08D00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;push&#160; &#160; 8DB0B2&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;原来的属性暂放空地8DB0B2
008DB01C&#160; &#160;.&#160;&#160;6A 40&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;push&#160; &#160; 40&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;;&#160;&#160;可读可写属性40
008DB01E&#160; &#160;.&#160;&#160;6A 06&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;push&#160; &#160; 6&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; ;&#160;&#160;size = 6
008DB020&#160; &#160;.&#160;&#160;FF35 81638600&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;push&#160; &#160; dword ptr [866381]&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;程序初始化后dword ptr [866381]里面就是VirtualFree函数的地址了
008DB026&#160; &#160;.&#160;&#160;FFD0&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;call&#160; &#160; eax&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;call刚得到的VirtualProtect的函数,使VirtualFree函数前6个字节可写可读,以便挂钩
008DB028&#160; &#160;.&#160;&#160;A1 81638600&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;mov&#160; &#160;&#160;&#160;eax, dword ptr [866381]&#160; &#160;;&#160;&#160;VirtualFree函数的地址给eax(开始保存api VirtualFree的前6个字节)
008DB02D&#160; &#160;.&#160;&#160;8B08&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;ecx, dword ptr [eax]&#160; &#160;&#160; &#160;;&#160;&#160;VirtualFree函数的前4个字节给ecx
008DB02F&#160; &#160;.&#160;&#160;66:8B58 04&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;bx, word ptr [eax+4]&#160; &#160;&#160; &#160;;&#160;&#160;VirtualFree函数的第5-第6个字节给bx
008DB033&#160; &#160;.&#160;&#160;890D B6B08D00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;dword ptr [8DB0B6], ecx&#160; &#160;;&#160;&#160;把得到的前6个字节保存起来,前4个字节保存到空地8DB0B6
008DB039&#160; &#160;.&#160;&#160;66:891D BAB08D00&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;word ptr [8DB0BA], bx&#160; &#160;&#160;&#160;;&#160;&#160;把得到的前6个字节保存起来,第5-第6个字节保存到空地8DB0BA(保存前6个字节完毕)
008DB040&#160; &#160;.&#160;&#160;C600 68&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;byte ptr [eax], 68&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;写下钩子,68是push的机器码(开始写钩子)
008DB043&#160; &#160;.&#160;&#160;40&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;inc&#160; &#160;&#160;&#160;eax&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;上面刚写完1个byte,所以要加1,继续写下面的
008DB044&#160; &#160;.&#160;&#160;C700 55B08D00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;dword ptr [eax], 8DB055&#160; &#160;;&#160;&#160;写上8DB055,让VirtualFree函数执行的时候返回到8DB055
008DB04A&#160; &#160;.&#160;&#160;83C0 04&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;add&#160; &#160;&#160;&#160;eax, 4&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;上面刚写完4个byte,所以要加4,继续写下面的
008DB04D&#160; &#160;.&#160;&#160;C600 C3&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;byte ptr [eax], 0C3&#160; &#160;&#160; &#160; ;&#160;&#160;写上0C3,配合上面写入的push 8DB055就会回到8DB055,patch时机就到了(钩子写完毕)
008DB050&#160; &#160;.- E9 A5B0F8FF&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;jmp&#160; &#160;&#160;&#160;008660FA&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;;&#160;&#160;程序原来入口就是跳到008660FA开始执行的,我们照搬
;-------------------------钩子到了之后就会来到下面-----------------------
008DB055&#160; &#160;.&#160;&#160;C705 7FED4E00 B8FFFFFF&#160; &#160;mov&#160; &#160;&#160;&#160;dword ptr [4EED7F], -48&#160; &#160;;&#160;&#160;VirtualFree函数执行的时候由于我们的钩子所以会来到这里,开始写入爆破的代码
008DB05F&#160; &#160;.&#160;&#160;C605 83ED4E00 FF&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;byte ptr [4EED83], 0FF&#160; &#160; ;&#160;&#160;继续写入第5个,mov eax,-1总共是5个字节
008DB066&#160; &#160;.&#160;&#160;8B0D B6B08D00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;ecx, dword ptr [8DB0B6]&#160; &#160;;&#160;&#160;把我们前面保存起来的VirtualFree函数的前4个字节给ecx(开始还原钩子)
008DB06C&#160; &#160;.&#160;&#160;66:8B1D BAB08D00&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;bx, word ptr [8DB0BA]&#160; &#160;&#160;&#160;;&#160;&#160;VirtualFree函数的第5-第6个字节给bx
008DB073&#160; &#160;.&#160;&#160;A1 81638600&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;mov&#160; &#160;&#160;&#160;eax, dword ptr [866381]&#160; &#160;;&#160;&#160;dword ptr [866381]里面是VirtualFree函数的头部地址
008DB078&#160; &#160;.&#160;&#160;8908&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;dword ptr [eax], ecx&#160; &#160;&#160; &#160;;&#160;&#160;把ecx里的VirtualFree函数的前4个字节给写回去
008DB07A&#160; &#160;.&#160;&#160;83C0 04&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;add&#160; &#160;&#160;&#160;eax, 4&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;上面写完4个字节,所以加4继续写下面的
008DB07D&#160; &#160;.&#160;&#160;66:8918&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;mov&#160; &#160;&#160;&#160;word ptr [eax], bx&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;把bx里的VirtualFree函数的第5-第6个字节给写回去(还原钩子完毕)
008DB080&#160; &#160;.&#160;&#160;83E8 04&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;sub&#160; &#160;&#160;&#160;eax, 4&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;回到VirtualFree函数头部准备执行VirtualFree
008DB083&#160; &#160;.&#160;&#160;83C4 04&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;add&#160; &#160;&#160;&#160;esp, 4&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;平栈
008DB086&#160; &#160;.&#160;&#160;FFD0&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;call&#160; &#160; eax&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;这里call的就是VirtualFree函数了等于回到程序原路了
008DB088&#160; &#160;.&#160;&#160;68 07608600&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;push&#160; &#160; 866007&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;原文件call VirtualFree之后就是回到866007的,我们照搬
008DB08D&#160; &#160;.&#160;&#160;C3&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;retn&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;;&#160;&#160;push+retn 都知道干嘛的吧
008DB08E&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB08F&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB090&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB091&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB092&#160; &#160;.&#160;&#160;6B 65 72 6E 65 6C 33 32 >ascii&#160; &#160;"kernel32.dll",0&#160; &#160;&#160; &#160;&#160; &#160; ;&#160;&#160;这个是自己写的
008DB09F&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0A0&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0A1&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0A2&#160; &#160;.&#160;&#160;56 69 72 74 75 61 6C 50 >ascii&#160; &#160;"VirtualProtect",0&#160; &#160;&#160; &#160;&#160;&#160;;&#160;&#160;这个是自己写的
008DB0B1&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0B2&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0B3&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0B4&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0B5&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0B6&#160; &#160;.&#160;&#160;00000000&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;dd&#160; &#160;&#160; &#160;00000000
008DB0BA&#160; &#160;.&#160;&#160;0000&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;dw&#160; &#160;&#160; &#160;0000
008DB0BC&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00
008DB0BD&#160; &#160;&#160; &#160;00&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;db&#160; &#160;&#160; &#160;00

所有的代码我都写了注释,不要嫌我罗嗦,写的很土,可能还有错误的地方,请多多海涵,偶是文盲。

保存代码,在本机xp,虚拟机xp、win7都测试完毕,破解成功。

2009-12-16_164429.gif

2009-12-16_164554.gif

推销下偶的皮肤,有兴趣的找我。
2009-12-16_164740.gif

免费评分

参与人数 1威望 +1 收起 理由
Squn + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2009-12-16 18:01
GUC兄弟来吾爱第一篇破文,加精鼓励!
 楼主| GUC 发表于 2009-12-16 18:18
ericalan 发表于 2009-12-16 18:23
 楼主| GUC 发表于 2009-12-16 18:36
4# ericalan

还是直接发到这里好了,一个个发很麻烦。。。

dup_skin_花鸟.rar

109.03 KB, 下载次数: 6, 下载积分: 吾爱币 -1 CB

头像被屏蔽
小举 发表于 2009-12-16 20:27
你是牛魔王他大爷!
missviola 发表于 2009-12-16 20:38
好文支持下,lz应该素来自upk的大侠啊。。。
87334433 发表于 2009-12-17 09:40
这个得学,感谢感谢
 楼主| GUC 发表于 2009-12-17 12:01
本帖最后由 GUC 于 2009-12-17 12:05 编辑

澄清下
不知道昨天怎么回事,1级修复后不能跨平台,今天试了下,1级修复后是可以跨平台的,没那么复杂,2000 xp win7都能运行,怪异,应该是昨天哪里操作错误了。。。

太壳盲了,努力学习

=====
明白了,昨天1级修复后忘记再次点“Show Invalid”了,导致剪切的时候把1级修复成功修复的那部分iat也给切了,结果就等于跟没用1级修复一样,唉,粗心害死人。
lovettww 发表于 2009-12-17 12:20
拜读了。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表