解析木马

来源:互联网 发布:计算复杂性 正规算法 编辑:程序博客网 时间:2024/06/05 00:40
在网上,大家最关心的事情之一就是木马:最近出了新的木马吗?木马究竟能实现 
哪些功能?木马如何防治?木马究竟是如何工作的?本文试图以我国最著名的木马之 
- 冰河为例,向大家剖析木马的基本原理,为大家揭开木马的神秘面纱。 
  木马冰河是用C++Builder写的,为了便于大家理解,我将用相对比较简单的VB来说 
明它,其中涉及到一些WinSock编程和Windows API的知识,如果你不是很了解的话,请 
去查阅相关的资料。 

一、基础篇(揭开木马的神秘面纱) 
  无论大家把木马看得多神秘,也无论木马能实现多么强大的功能,木马,其实质只 
是一个网络客户/服务程序。那么,就让我们从网络客户/服务程序的编写开始。 
  1.基本概念: 
   网络客户/服务模式的原理是一台主机提供服务(服务器),另一台主机接受服务 
(客户机)。作为服务器的主机一般会打开一个默认的端口并进行监听(Listen), 如果有 
客户机向服务器的这一端口提出连接请求(Connect Request), 服务器上的相应程序就 
会自动运行,来应答客户机的请求,这个程序我们称为守护进程(UNIX的术语,不过已经 
被移植到了MS系统上)。对于冰河,被控制端就成为一台服务器,控制端则是一台客户 
机,G_server.exe是守护进程, G_client是客户端应用程序。(这一点经常有人混淆, 
而且往往会给自己种了木马!甚至还有人跟我争得面红耳赤,昏倒!!) 
    
  2.程序实现: 
   在VB中,可以使用Winsock控件来编写网络客户/服务程序, 实现方法如下: 
   (其中,G_Server和G_Client均为Winsock控件) 
   服务端: 
   G_Server.LocalPort=7626(冰河的默认端口,可以改为别的值) 
   G_Server.Listen(等待连接) 
    
   客户端: 
   G_Client.RemoteHost=ServerIP(设远端地址为服务器地址) 
   G_Client.RemotePort=7626  (设远程端口为冰河的默认端口,呵呵,知道吗?这 
是冰河的生日哦) 
   (在这里可以分配一个本地端口给G_Client, 如果不分配, 计算机将会自动分配 
一个, 建议让计算机自动分配) 
   G_Client.Connect      (调用Winsock控件的连接方法) 
    
   一旦服务端接到客户端的连接请求ConnectionRequest,就接受连接 
   Private Sub G_Server_ConnectionRequest(ByVal requestID As Long) 
       G_Server.Accept requestID 
   End Sub 
    
   客户机端用G_Client.SendData发送命令,而服务器在G_Server_DateArrive事件 
中接受并执行命令(几乎所有的木马功能都在这个事件处理程序中实现) 

   如果客户断开连接,则关闭连接并重新监听端口    
   Private Sub G_Server_Close() 
       G_Server.Close  (关闭连接) 
       G_Server.Listen (再次监听) 
   End Sub 

   其他的部分可以用命令传递来进行,客户端上传一个命令,服务端解释并执行命 
令...... 
     

二、控制篇(木马控制了这个世界!) 
  由于Win98开放了所有的权限给用户,因此,以用户权限运行的木马程序几乎可以 
控制一切,让我们来看看冰河究竟能做些什么(看了后,你会认同我的观点:称冰河为木 
马是不恰当的,冰河实现的功能之多,足以成为一个成功的远程控制软件) 
  因为冰河实现的功能实在太多,我不可能在这里一一详细地说明,所以下面仅对冰河 
的主要功能进行简单的概述, 主要是使用Windows API函数, 如果你想知道这些函数的 
具体定义和参数, 请查询WinAPI手册。 
  1.远程监控(控制对方鼠标、键盘,并监视对方屏幕) 
   keybd_event 模拟一个键盘动作(这个函数支持屏幕截图哦)。 
   mouse_event 模拟一次鼠标事件(这个函数的参数太复杂,我要全写在这里会被 
编辑骂死的,只能写一点主要的,其他的自己查WinAPI吧) 
   mouse_event(dwFlags,dx,dy,cButtons,dwExtraInfo) 

dwFlags:  
   MOUSEEVENTF_ABSOLUTE 指定鼠标坐标系统中的一个绝对位置。 
   MOUSEEVENTF_MOVE 移动鼠标 
   MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下 
   MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起 
   MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下 
   MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下 
   MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下 
   MOUSEEVENTF_MIDDLEUP 模拟鼠标中键按下 
dx,dy: 
   MOUSEEVENTF_ABSOLUTE中的鼠标坐标 

    
2.记录各种口令信息(出于安全角度考虑,本文不探讨这方面的问题,也请不要给我来信 
询问) 

  3.获取系统信息 
   a.取得计算机名  GetComputerName 
   b.更改计算机名  SetComputerName 
   c.当前用户    GetUserName函数 
   d.系统路径  
     Set FileSystem0bject = CreateObject("Scripting.FileSystemObject") 
      (建立文件系统对象) 
     Set SystemDir = FileSystem0bject.getspecialfolder(1) 
     (取系统目录) 
     Set SystemDir = FileSystem0bject.getspecialfolder(0) 
     (取Windows安装目录) 
      
     (友情提醒: FileSystemObject是一个很有用的对象,你可以用它来完成很多 
有用的文件操作) 

   e.取得系统版本  GetVersionEx(还有一个GetVersion,不过在32位windows下可 
能会有问题,所以建议用GetVersionEx 

   f.当前显示分辨率 
   Width = screen.Width \ screen.TwipsPerPixelX 
   Height= screen.Height \ screen.TwipsPerPixelY 


   其实如果不用Windows API我们也能很容易的取到系统的各类信息,那就是 
Winodws的"垃圾站"-注册表 
   比如计算机名和计算机标识吧: 
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP 
中的Comment,ComputerName和WorkGroup 
   注册公司和用户名: 
HKEY_USERS\.DEFAULT\Software\Microsoft\MS Setup (ACME)\UserInfo 
至于如何取得注册表键值请看第6部分 

  4.限制系统功能 
   a.远程关机或重启计算机,使用WinAPI中的如下函数可以实现: 
    ExitWindowsEx(ByVal uFlags,0) 
    当uFlags=0 EWX_LOGOFF 中止进程,然后注销 
       =1 EWX_SHUTDOWN 关掉系统电源 
       =2 EWX_REBOOT  重新引导系统 
       =4 EWX_FORCE  强迫中止没有响应的进程 
    
   b.锁定鼠标 
    ClipCursor(lpRect As RECT)可以将指针限制到指定区域,或者用 
ShowCursor(FALSE)把鼠标隐藏起来也可以 
     
    注:RECT是一个矩形,定义如下: 
    Type RECT 
       Left As Long 
       Top As Long 
       Right As Long 
       Bottom As Long 
    End Type 

   c.锁定系统 这个有太多的办法了,嘿嘿,想Windows不死机都困难呀,比如,搞个 
死循环吧,当然,要想系统彻底崩溃还需要一点技巧,比如设备漏洞或者耗尽资源什么的 
....... 

   d.让对方掉线 RasHangUp...... 

   e.终止进程  ExitProcess...... 

   f.关闭窗口 利用FindWindow函数找到窗口并利用SendMessage函数关闭窗口 

    

  5.远程文件操作 
   无论在哪种编程语言里, 文件操作功能都是比较简单的, 在此就不赘述了,你也 
可以用上面提到的FileSystemObject对象来实现 

  6.注册表操作 
   在VB中只要Set RegEdit=CreateObject("WScript.Shell") 
   就可以使用以下的注册表功能: 
   删除键值:RegEdit.RegDelete RegKey 
   增加键值:RegEdit.Write   RegKey,RegValue 
   获取键值:RegEdit.RegRead  (Value) 
   记住,注册表的键值要写全路径,否则会出错的。 

  7.发送信息 
   很简单,只是一个弹出式消息框而已,VB中用MsgBox("")就可以实现,其他程序也 
不太难的。 

  8.点对点通讯 
   呵呵,这个嘛随便去看看什么聊天软件就行了 
   (因为比较简单但是比较烦,所以我就不写了,呵呵。又:我始终没有搞懂冰河为什 
么要在木马里搞这个东东,困惑......) 

  9.换墙纸 
   Call SystemParametersInfo(20,0,"BMP路径名称",&H1) 
0 0
原创粉丝点击