在网上,大家最关心的事情之一就是木马:最近出了新的木马吗?木马究竟能实现哪些功能?木马如何防治?木马究竟是如何工作的?本文试图以我国最著名的木马之一 冰河为例,向大家剖析木马的基本原理,为大家揭开木马的神秘面纱。
& d% {; ]0 s7 Q, o5 B0 k8 l) w( D+ B5 U, g
木马冰河是用C++Builder写的,为了便于大家理解,我将用相对比较简单的VB来说明它,其中涉及到一些WinSock编程和Windows API的知识,如果你不是很了解的话,请去查阅相关的资料。( V( N' _$ L4 g7 G L# t& y
& V* }" Y: w1 h: @; M- S6 g 一、基础篇(揭开木马的神秘面纱), @; C o) ?6 {% s% A3 ~2 o
9 ^9 Z+ Q0 X8 j8 `9 D% f) p
无论大家把木马看得多神秘,也无论木马能实现多么强大的功能,木马,其实质只是一个网络客户/服务程序。那么,就让我们从网络客户/服务程序的编写开始。
5 Q' Z5 i& c% L5 Y 1.基本概念:
: g: c% B# B* H' c+ m5 j. T. h 网络客户/服务模式的原理是一台主机提供服务(服务器),另一台主机接受服务(客户机)。作为服务器的主机一般会打开一个默认的端口并进行监听(Listen), 如果有客户机向服务器的这一端口提出连接请求(Connect Request), 服务器上的相应程序就会自动运行,来应答客户机的请求,这个程序我们称为守护进程(UNIX的术语,不过已经被移植到了MS系统上)。对于冰河,被控制端就成为一台服务器,控制端则是一台客户机,G_server.exe是守护进程, G_client是客户端应用程序。(这一点经常有人混淆,而且往往会给自己种了木马!甚至还有人跟我争得面红耳赤,昏倒!!)2 g1 }7 y- p$ j
; z) g* y3 K+ B5 [0 ] 2.程序实现:% |% G3 @) y8 ]/ a# H
在VB中,可以使用Winsock控件来编写网络客户/服务程序, 实现方法如下:
! U3 n& V) [& ? (其中,G_Server和G_Client均为Winsock控件)
7 I9 K1 m0 t# z& u: [8 l 服务端:
2 i: A- Z9 x, S, A4 l G_Server.LocalPort=7626(冰河的默认端口,可以改为别的值)1 h% D/ Q6 W. l7 n
G_Server.Listen(等待连接)) U& i: V; F, U
0 F. V& U+ ~, P4 r. B2 C3 Q$ t 客户端:
1 M* z5 l4 Q4 [& Y7 d G_Client.RemoteHost=ServerIP(设远端地址为服务器地址)
' r4 W5 O) f9 y3 l( i- v G_Client.RemotePort=7626 (设远程端口为冰河的默认端口,呵呵,知道吗?这是冰河的生日哦)! Y7 U8 a% a! q
(在这里可以分配一个本地端口给G_Client, 如果不分配, 计算机将会自动分配一个, 建议让计算机自动分配)# V" d6 F$ p! H/ i( C& C# ?
G_Client.Connect (调用Winsock控件的连接方法)
9 Z8 [6 \; ]: Z ! S, I+ B- C; b
一旦服务端接到客户端的连接请求ConnectionRequest,就接受连接
( L. x" ~+ s2 D# `' Q Private Sub G_Server_ConnectionRequest(ByVal requestID As Long)
& t; v, n) t8 x4 @+ P G_Server.Accept requestID2 I x% v* A( Y% B8 V! G
End Sub3 ]' ~" I7 l+ s+ }7 n
: ]" Y7 \1 W( n P4 K" L 客户机端用G_Client.SendData发送命令,而服务器在G_Server_DateArrive事件中接受并执行命令(几乎所有的木马功能都在这个事件处理程序中实现)' ~& b0 m3 r, R2 Y: s" B
& k, y& m5 N3 t* ^- ~/ r% O
如果客户断开连接,则关闭连接并重新监听端口 p/ }& a+ Q' ?2 l- L
Private Sub G_Server_Close()9 O' [6 x& [, x) j# M" V
G_Server.Close (关闭连接)
( y% v, J% H- F G_Server.Listen (再次监听)
# v3 W% l% o7 ^( _4 } End Sub" a) j8 u: j) |& n2 C
$ E% t6 h8 q% e" R8 X1 Q2 J; j 其他的部分可以用命令传递来进行,客户端上传一个命令,服务端解释并执行命令......
- Q0 J/ X* C1 A6 a$ U$ o+ O
# `% L: E" F- u% p* {7 P% ^
! m3 e7 k/ p1 `( J |