能力值:
( LV9,RANK:410 )
|
-
-
6 楼
【破解作者】 hnhuqiong
【作者邮箱】 3KKK@
【作者主页】 3KKK
【使用工具】 FLYODBG
【破解平台】 Win9x/NT/2000/XP
【软件名称】 xxxxxxxxxxxxxxxx
【下载地址】 xxxxxxxxxxxx
【软件简介】 对壳感兴趣,软件就不提了
【加壳方式】 XXX 0.7X
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
00370000 B9 04000000 mov ecx,4 ; 大量的花指令+INT 3一直到3732ae
00370005 E8 1F000000 call 00370029
0037000A ^ EB FA jmp short 00370006
0037000C E8 16000000 call 00370027
00370011 E9 EBF80000 jmp 0037F901
00370016 58 pop eax ;
00370017 EB 09 jmp short 00370022
00370019 0F25 ??? ; 未知命令
0037001B E8 F2FFFFFF call 00370012
00370020 0FB9 ??? ; 未知命令
上手分析:????????怎么到处都是乱七八糟的东西!!!!!
你进入了一个水中花,镜中月的地方,到处的花指令,我一边分析一边高声的
唱着谭校长的《水中花》,世界上要是有个地方到处有这样的花花草草,我们是要爱护的 :)
从头来,看仔细了。OD插件中你最好备好武器(AJUNK ,花指令去除器),我们走!!
00370000 B9 04000000 mov ecx,4 ; 可以说,这个壳的花指令运用的让人惊叹
00370005 E8 1F000000 call 00370029 ;这壳代码处一开始开始让你看的几乎没有心情
0037000A 90 nop ;玩,你会发现这里的有一个特点,就是花指令的循环
0037000B 90 nop ;中,反复玩的就是call,jmp,JXX,
0037000C E8 16000000 call 00370027 ;反复的玩寄存器,堆栈,就是不操作内存,当你枯燥
00370011 90 nop ;的在F7的时候,突然插入有用的指令,让人防不胜防
00370012 ^ EB F8 jmp short 0037000C ;
00370014 90 nop ;天道殷勤,你只要多玩花指令,玩的滚瓜烂熟,那么
00370015 90 nop ;你学会收集花指令的模式,其实,它们也简单,跟踪者
00370016 58 pop eax ;毕竟只是重复前人的劳动,设计花指令的人让人肃然起敬
00370017 EB 09 jmp short 00370022 ;要知道花指令设计上比你去跟踪要难上很多很多,设计过程中
00370019 90 nop ;会出现多少次的程序崩溃!,一套完美的花指令是多少个日夜加上
0037001A 90 nop ;多少严密的逻辑设计出来的,向花指令开发者致敬!!!
0037001B E8 F2FFFFFF call 00370012 ;
00370020 90 nop ;
00370021 90 nop ;
00370022 49 dec ecx ;破花指令有一个特点就是花指令不会大范围的跳转,因为
00370023 ^ 75 F1 jnz short 00370016 ;它需要用花指令来欺骗DEBUG 或者静态分析软件,如果大范围
00370025 EB 05 jmp short 0037002C ;跳,那么设计的复杂程度将急剧上升。
00370027 90 nop ;
00370028 90 nop ;而且花指令有一个特点就是往指令里面跳,那么我们要感谢
00370029 90 nop ;od插件AJUNK的作者,一个特别特别好用的花指令工具,可惜最后
0037002A 90 nop ;一个版本BUG 严重,UNDO 有严重的BUG 。
0037002B 90 nop ;
0037002C B9 04000000 mov ecx,4 ;
00370031 E8 1F000000 call 00370055 ;左边从370000到3700c0是去掉花指令后的正常状态的代码,怎么样
00370036 90 nop ;看的清清楚楚吧??NOP 掉的指令不会影响任何程序状态,你所需要的
00370037 90 nop ;是把这些代码弄明白了,用二进制copy下来,对比没有NOP掉的原程序
00370038 E8 16000000 call 00370053 ;我们将再次运用一个花指令工具---花指令去除器,好了,这个程序的
0037003D 90 nop ;的花指令将被你收入囊中!!!
0037003E ^ EB F8 jmp short 00370038 ;当你收集了这个壳足够多的花指令,那么!
00370040 90 nop ;当你观看这个壳的时候,发现它在脱掉一层层的面纱展现在你的面前!!!
00370041 90 nop ;
00370042 58 pop eax ;
00370043 EB 09 jmp short 0037004E ;
00370045 90 nop ;
00370046 90 nop ;
00370047 E8 F2FFFFFF call 0037003E ;
0037004C 90 nop ;
0037004D 90 nop ;
0037004E 49 dec ecx
0037004F ^ 75 F1 jnz short 00370042
00370051 EB 05 jmp short 00370058
00370053 ^ EB F9 jmp short 0037004E
00370055 ^ EB F0 jmp short 00370047
00370057 90 nop
00370058 B9 04000000 mov ecx,4
0037005D E8 1F000000 call 00370081
00370062 90 nop
00370063 90 nop
00370064 E8 16000000 call 0037007F
00370069 90 nop
0037006A ^ EB F8 jmp short 00370064
0037006C 90 nop
0037006D 90 nop
0037006E 58 pop eax
0037006F EB 09 jmp short 0037007A
00370071 90 nop
00370072 90 nop
00370073 E8 F2FFFFFF call 0037006A
00370078 90 nop
00370079 90 nop
0037007A 49 dec ecx
0037007B ^ 75 F1 jnz short 0037006E
0037007D EB 05 jmp short 00370084
0037007F ^ EB F9 jmp short 0037007A
00370081 ^ EB F0 jmp short 00370073
00370083 90 nop
00370084 E8 03000000 call 0037008C
00370089 90 nop
0037008A 90 nop
0037008B 90 nop
0037008C 58 pop eax
0037008D EB 01 jmp short 00370090
0037008F 90 nop
00370090 83C0 07 add eax,7
00370093 50 push eax
00370094 C3 retn
00370097 E8 24000000 call 003700C0
运行前的寄存器状态(EIP =370000) 花指令运行后的寄存器状态(EIP =3700c0)
EAX 0035FE6C EAX 00370097
ECX 00000002 ECX 00000000
EDX 00370000 EDX 00370000
EBX 00469499 jl.00469499 EBX 00469499 jl.00469499
ESP 0012FF9C ESP 0012FF94
EBP 00467000 jl.00467000 EBP 00467000 jl.00467000
ESI 0046701C ASCII "VirtualAlloc" ESI 0046701C ASCII "VirtualAlloc"
EDI 570B6113 EDI 570B6113
EIP 00370000 EIP 003700C0
C 0 ES 0023 32bit 0(FFFFFFFF) C 0 ES 0023 32bit 0(FFFFFFFF)
P 1 CS 001B 32bit 0(FFFFFFFF) P 0 CS 001B 32bit 0(FFFFFFFF)
A 0 SS 0023 32bit 0(FFFFFFFF) A 0 SS 0023 32bit 0(FFFFFFFF)
Z 1 DS 0023 32bit 0(FFFFFFFF) Z 0 DS 0023 32bit 0(FFFFFFFF)
S 0 FS 003B 32bit 7FFDF000(FFF) S 0 FS 003B 32bit 7FFDF000(FFF)
T 0 GS 0000 NULL T 0 GS 0000 NULL
D 0 D 0
O 0 LastErr ERROR_SUCCESS (00000000) O 0 LastErr ERROR_SUCCESS (00000000)
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE) EFL 00000202 (NO,NB,NE,A,NS,PO,GE,G)
DR0 00000000 DR0 00000000
DR1 00000000 DR1 00000000
DR2 00000000 DR2 00000000
DR3 00000000 DR3 00000000
DR6 00000000 DR6 00000000
DR7 00000000 DR7 00000000
这里以后,我将不再将这个壳的花指令模式展现出来,为大家清楚的看到这个程序。
003700C0 64:FF35 00000000 push dword ptr fs:[0] ;开始了SEH ,这个壳大量的运用了SEH ,
003700C7 EB 12 jmp short 003700DB ’熟练程度几乎是我遇见壳中最强的,可以说
003700DB 64:8925 00000000 mov dword ptr fs:[0],esp ;SEH 这里体现了作者的的写壳机巧和这个壳
..... ;树立了在密界极高的待遇。
.....
0037011A 66:BF 4D4A mov di,4A4D
0037011E CC int3 ;; 这里准备INT 3异常了,你会发现下面去掉花指令后
&;-----------------------------------------
(观察堆栈) &;0012FF94 /0012FFE0 指针到下一个 SEH 记录
&;0012FF98 |003700E9 SE 句柄
&; 0012FF9C |00467000 jl.00467000
&;-----------------------------------------
0037011F 90 nop ;怎么和3700CO如此像?是的,这里就是SEH 的出口
00370120 90 nop
00370121 64:8F05 00000000 pop dword ptr fs:[0] ; 你在这里下断(F2),F4一把带过,祝贺你,你过了
00370128 58 pop eax ; 第一个陷阱。其实,老老实实的看堆栈,用SEH 的句炳
;你会发现兜了一圈,回到了这里。呵呵,玩多SEH 了
;你会发现有时候有技巧的,过SEH 过去就过去了,没有过去
;在栽跟头地方重新仔细找问题,马上会解决的。
小结:这里的SEH 其实没有特别的,基本没有有用的代码,就是让DEBUGER和它比耐心,找到SEH 的出口,直接奔过去,不和它纠缠。
其实你要是喜欢,可以把370000到7372AE一大段全NOP掉,并不影响程序。爽吧?
如果大量花指令的我用.............代替了。
003732AE E8 00000000 call 003732B3 ; 真正开始面对了有分量的地方了,天黑
003732B3 5A pop edx ; 风高杀人夜,弟兄们要小心了。
003732B4 81EA 9E1B4000 sub edx,401B9E ;
003732BA EB 23 jmp short 003732DF ;一堆花指令
003732DF 50 push eax ‘
003732E0 E8 EFFFFFFF call 003732D4 ;
003732D4 58 pop eax ;
003732D5 9C pushfd ;
003732D6 05 E6FFFFFF add eax,-1A ;
003732DB 9D popfd ;
003732DC >^ FFE0 jmp near eax ;
.............................
0037331B 8D75 74 lea esi,dword ptr ss:[ebp+74] ; 取GetProcAddress地址给ESI
............................
00373348 8DBA 080F4100 lea edi,dword ptr ds:[edx+410F08] ; 将38261d地址传给EDI
.............................
00373378 F3:A5 rep movs dword ptr es:[edi],dword ptr>; GetModuleHandleA和LoadLibraryA地址传送到38261d中
-------------------------------------------------------------------------;
0038261D 6C FE 35 00 29 B5 80 7C 77 1D 80 7C 00 00 00 00 l?.)?|w?....;大家看看它准备干什么 :)
-------------------------------------------------------------------------;
003733A4 8B45 04 mov eax,dword ptr ss:[ebp+4] ; ntdll.7C930738
.............................
003733D0 8982 180F4100 mov dword ptr ds:[edx+410F18],eax ; ntdll.7C930738传入38262d
.............................
00373400 8D85 51010000 lea eax,dword ptr ss:[ebp+151] ;
.............................
00373431 8982 840F4100 mov dword ptr ds:[edx+410F84],eax ; 将467151送382699
.............................
00373462 8B45 2C mov eax,dword ptr ss:[ebp+2C] ; kernel32.VirtualAlloc
............................. ;看见这个大家应该知道它要干什么了吧??
0037348D 8982 140F4100 mov dword ptr ds:[edx+410F14],eax ; 将VirtualAlloc地址传送到382629
.............................
003734E4 8B85 280F4100 mov eax,dword ptr ss:[ebp+410F28] ; 38263d地址入eax=0
.............................
003736CD 0BC0 or eax,eax
003736CF 75 40 jnz short 00373711 ; 必须跳,这里如果F7跟踪将会不跳
003736D1 6A 00 push 0
003736D3 FF95 0C0F4100 call near dword ptr ss:[ebp+410F0C] ; kernel32.GetModuleHandleA
呵呵,把个地址搬过来搬过去的,原来是要弄个call GetModuleHandleA,真累。别急,才刚刚开始呢
003736E7 68 24080E68 push 680E0824 ;压这些到堆栈干什么?
003736EC 68 90908344 push 44839090 ;???
003736F1 - FFE4 jmp near esp ;BT ,原来要跑堆栈里面执行代码了
-------------堆栈里面不好玩也。就下面这样几句,也跑堆栈里面
0012FF92 834424 08 0E add dword ptr ss:[esp+8],0E ;3736f4
0012FF97 68 E6363700 push 3736E6
0012FF9C C2 1000 retn 10
...............................
003736F4 8985 180F4100 mov dword ptr ss:[ebp+410F18],eax ; 00400000--》38262d,准备盖掉罪状
................................
00373711 6A 04 push 4
00373713 68 00100000 push 1000 ; 申请缓冲区大小1000
00373718 68 00100000 push 1000
0037371D 6A 00 push 0
0037371F FF95 140F4100 call near dword ptr ss:[ebp+410F14] ; VirtualAlloc申请缓冲区(390000)
又申请内存,乖乖,还没有走两步,就又开始申请内存玩是么名堂了????
00373725 8985 54184100 mov dword ptr ss:[ebp+411854],eax ; 将申请的缓冲区段地址入382f69
0037372B 68 003C070A push 0A073C00 ;
00373730 68 9FFC0D75 push 750DFC9F ;干吗又推这样的东西入堆栈,看着75头
;就明白要为下面跑堆栈里面跑代码.
00373735 50 push eax ;390000
...............................................
003737A3 FF30 push dword ptr ds:[eax] ; 将 37373f内的内容送到堆栈,从这里开始
;到3737ad,将把代码送入堆栈,真精彩的代码
..........................................
其中花指令带压代码入栈方式,真的很漂亮,跟着都让人感觉心旷神怡.
...........................................
003737AA 89E0 mov eax,esp ; 将堆栈地址入eax,准备入堆栈执行
003737AD FFD0 call near eax ; 跳入堆栈进行代码执行
---------------------------------------------------------------------------------------
0012FF44 873424 xchg dword ptr ss:[esp],esi ; 将堆栈和ESI的内容互换
0012FF47 8B36 mov esi,dword ptr ds:[esi] ; 将[ESI]的内容赋值给ESI
0012FF49 81F6 EBFF71C8 xor esi,C871FFEB ;将ESI和C871ffeb比较
0012FF4F 75 19 jnz short 0012FF6A ;不等则跳,这里不能跳.
0012FF51 8B7424 50 mov esi,dword ptr ss:[esp+50] ;
0012FF55 56 push esi ; 取ESP+50的内容重新压栈
0012FF56 8B36 mov esi,dword ptr ds:[esi] ;
0012FF58 81F6 EBFF71E8 xor esi,E871FFEB ; 将ESP+50的内容和E871FFEB比较
0012FF5E 75 09 jnz short 0012FF69 ;不等则跳,这里不能跳
0012FF60 5E pop esi ;
0012FF61 83C6 4C add esi,4C
0012FF64 897424 48 mov dword ptr ss:[esp+48],esi ; 将从堆栈的返回代码段地址压栈
0012FF68 8D7424 58 lea esi,dword ptr ss:[esp+58] ; 将ESP+58地址送ESI
0012FF6C 51 push ecx ;
0012FF6D B9 02000000 mov ecx,2 ;要运算出2个指令
0012FF72 8136 EBFF7874 xor dword ptr ds:[esi],7478FFEB ; 作这个运算真不简单,记得刚才我说的75头的数值压栈0012FF78 83EE FC sub esi,-4 ;的话么,这里把指令变成真正的指令.
0012FF78 83EE FC sub esi,-4 ;下一个数据
0012FF7B 49 dec ecx ;计数器
0012FF7C ^ 75 F4 jnz short 0012FF72 ;
0012FF7E 59 pop ecx ;
0012FF7F 8D7424 58 lea esi,dword ptr ss:[esp+58] ; 将[ESP+58]内容送入ESI
0012FF83 FFD6 call near esi ; 到12ff98
0012FF98 /74 03 je short 0012FF9D
0012FF9D C3 retn ; 返回到12ff85
0012FF85 5E pop esi ; 准备去调用KERNEL32.dll
0012FF86 F3: prefix rep:
0012FF87 68 87373700 push 373787
0012FF8C C2 5000 retn 50 ; 返回代码段
-------------------------------------------------------------------------------------------
大家看了这段如何?真的很精彩,在堆栈里面执行代码还不忘记边执行边解码出来,我等菜鸟佩服的五体投地.
后面将持续的运用这样的方式.
00373787 8B0424 mov eax,dword ptr ss:[esp] ; 将缓冲区(390000)段地址入EAX
0037378A 83EC F8 sub esp,-8 ; 堆栈指针+8(12ff9c)
............
0037387F 5E pop esi ; 取370000段地址
00374478 56 push esi
00374479 8DB5 C1214000 lea esi,dword ptr ss:[ebp+4021C1] ; 将地址(3738d6)送ESI
0037447F 68 03EA17B3 push B317EA03 ;
..............
003744F2 FF33 push dword ptr ds:[ebx] ;又开始要往堆栈里面压代码
...................
003744F9 89E3 mov ebx,esp ;要往堆栈里面走了 :(
003744FC FFD3 call near ebx ;去堆栈了,真受不了,好好程序段不用
;喜欢跑堆栈里面玩,以后我们都跑女厕所
这里我就不跑了,和上面一样的形势.
003745CE 8BFE mov edi,esi ; 3738d6开始,446大小准备解码,送370000
003745D0 B9 46040000 mov ecx,446
003745D5 AC lods byte ptr ds:[esi] ; 把取出的数据放到al中
.....................................................
003745D6 9C pushfd
003745D7 6A 03 push 3
003745EA 83C4 04 add esp,4 ;ESP+4
......
003745F1 FF0C24 dec dword ptr ss:[esp] ;3-1
........
003745EA 83C4 04 add esp,4 ;ESP+4
........
003745F1 FF0C24 dec dword ptr ss:[esp] ;2-1
........
003745EA 83C4 04 add esp,4 ;ESP+4
........
003745F1 FF0C24 dec dword ptr ss:[esp] ;1-1
........
........................................................
其实上面就是将[ESP]中的内容=-1,这是迷惑人的,算花指令,真正也就下面的解码方式
00374603 32C1 xor al,cl ;al=8
0037461C C0C0 04 rol al,4 ;al=80
0037464C AA stos byte ptr es:[edi] ;把计算后的结果放回去
0037464D ^\E2 86 loopd short 003745D5 ;循环解码
-----------------------------------------------------------------------
一直在解码,真是藏在深闺不露面呀,不行我跑女厕所看你去!!!!!!!!!!!!!!
后面开始很危险了,这里
0037464F 5E pop esi ; 00373885
00374650 33C0 xor eax,eax
00374652 64:FF30 push dword ptr fs:[eax] ; 又在建SEH了,准备异常了
00374655 64:8920 mov dword ptr fs:[eax],esp
00374658 0F0B ud2 ;异常
------------------------看句柄跟着跑呀
0012FF9C /0012FFE0
0012FFA0 |00373885 返回到 00373885 来自 00374478
0012FFA4 |7C930738 ntdll.7C930738
-------------------------
00373885 E8 04000000 call 0037388E ;
...........
003738CC FF81 B8000000 inc dword ptr ds:[ecx+B8] ;
003738D2 3D 03000080 cmp eax,80000003 ;呵呵这里比这个大家明白了么?
00373B24 8161 14 F00FFFFF and dword ptr ds:[ecx+14],FFFF0FF0 ; ffff0ff0
003747B7 AC lods byte ptr ds:[esi] ; 2d
003747B8 32C1 xor al,cl
003747BA 04 4D add al,4D
003747BC C0C0 03 rol al,3
003747BF AA stos byte ptr es:[edi] ;又在解码
003747C0 ^\E2 F5 loopd short 003747B7
...........................
0037497A AC lods byte ptr ds:[esi]
0037497B 03D8 add ebx,eax ; :)
0037497D ^ E2 FB loopd short 0037497A
0037497F 8BC3 mov eax,ebx
00374981 F8 clc ;异常
...........................
这里是我需要套用一个前辈的一个分析,的确,刚刚过来的时候,这里感觉有点诡异,一边建SEH
一边解码,走的时候,我恐惧感不断地加强,在这里曾经苦闷过,伤心过,终于看见了一点光,一点点,
这里特别感谢前辈Windows,强烈鄙视王子,不说清楚就往下跑,这里摔得人不下成千上万,我终于爬过来
了,这里特别贴上Windows的分析
(★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
;在这个版本的壳中,最巧妙的就是它的4个关键SEH. 接下来我们遇到了第一个.
;这个seh对反跟踪效果非常的好. 它首先利用一个int3中断进入seh, 设置4个单步断点于dr寄存器中.
;然后分别在四个单步中断处完成解码的相应操作,;最后经过一个除0异常进入seh,设置好dr寄存器的值后,拆除seh.
; 我们如果在4个单步断点之间进行软硬件中断调试,是不太可行的.
; a.软件: 很多代码没有解密,无法对其进行软件中断
; b.硬件: dr寄存器被占用,根本无法使用硬件中断
;所以,我们唯一的办法只有在它最后一次进入seh之后的代码上下软件断点"CMP EAX,CD000094". 幸好,这段代码部分没有加密,
不然就根本无法跟踪下去了.;然后,出第一个seh中断. 这个时候,我们必须把dr寄存器中的值记录下来,因为在第二个seh中要
用到. 除非,你在第一个和第二个seh之间不进行
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
这里我倒是要说,不可能它不解密,否则它自己也要陷入死循环.
不得不佩服这个壳如此地漂亮的下陷阱,和在它自己在陷阱中解码继续前进,我也在前进了,不断前进
我耳边开始响起来了那个<义勇军进行曲>
003742E0 3D 940000CD cmp eax,CD000094 ;F2下断点这里,我们起飞!!!!!!!!
(●★003742E5 23ACAB 121617A9 AND EBP,DWORD PTR DS:[EBX+EBP*4+A9171612>)★●);这里是没有解码时候走不下去的 )
003742E5 /0F85 89010000 jnz 00374474 ;芝麻开门了,嘻嘻
003742EB |8322 00 and dword ptr ds:[edx],0 ;把走过来的路堵死,真厉害,步步为营
00374350 C741 04 2301FF0F mov dword ptr ds:[ecx+4],0FFF0123 ;DR0
.......
00374382 C741 08 6745FF0F mov dword ptr ds:[ecx+8],0FFF4567 ;DR1
.......
003743B3 C741 0C AB89FF0F mov dword ptr ds:[ecx+C],0FFF89AB ;DR2
.......
003743E5 C741 10 EFCDFF0F mov dword ptr ds:[ecx+10],0FFFCDEF ;DR3
.......
00374415 8161 14 F00FFFFF and dword ptr ds:[ecx+14],FFFF0FF0 ;DR6
.......
00374447 C741 18 55010000 mov dword ptr ds:[ecx+18],155 ;DR7
.........
EFL 00000206 (NO,NB,NE,A,NS,PE,GE,G)
DR0 0FFF0123
DR1 0FFF4567
DR2 0FFF89AB
DR3 0FFFCDEF
DR6 FFFF0FF0
DR7 00000555
记下它们,后面有用 :)
---------我完整的把这个跨越写下来,看见没有,中间的INT 3就是让无数英雄卡脑袋,无数MM飞
哭鼻子的地方,真黑哟,CX=51F,多少个INT 3哟,我耳边响起来了,
-----------------------有多少爱可以从来 ,
51F(我要飞????),BT!!!!!!!!!我就是不飞,我飞多高摔多重 :)
0037549E FF35 00000000 push dword ptr ds:[0]
003754A4 64:8925 00000000 mov dword ptr fs:[0],esp
003754AB 8DB5 D1424000 lea esi,dword ptr ss:[ebp+4042D1]
003754B1 B9 1F050000 mov ecx,51F
003754B6 8A0431 mov al,byte ptr ds:[ecx+esi]
003754B9 CC int3
003754BA 90 nop
003754BB 880431 mov byte ptr ds:[ecx+esi],al
003754BE ^ E2 F6 loopd short 003754B6
003754C0 64:8F05 00000000 pop dword ptr fs:[0] ; 我们下F2这里,这下飞高点
同志们,这一节我写到这里,希望给看雪拉长点好看得东西,有钱的捧个钱场,有人的捧个人场,
看雪是我家,卫生靠大家!
◇◎◎●◎●◎◎●○●◎●★★№☆№☆№☆№№§●◎●_↑→←△▲↑_▲@什么乱七八糟的东西
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
|