科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道揭开木马的神秘面纱之基础篇(1)

揭开木马的神秘面纱之基础篇(1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 在网上,大家最关心的事情之一就是木马:最近出了新的木马吗?木马究竟能实现哪些功能?木马如何防治?木马究竟是如何工作的?本文试图以我国最著名的木马之一 - 冰河为例,向大家剖析木马的基本原理,为大家揭开木马的神秘面纱。

来源:论坛整理 2008年7月19日

关键字: 病毒查杀 病毒 木马

  • 评论
  • 分享微博
  • 分享邮件
 在网上,大家最关心的事情之一就是木马:最近出了新的木马吗?木马究竟能实现哪些功能?木马如何防治?木马究竟是如何工作的?本文试图以我国最著名的木马之一 - 冰河为例,向大家剖析木马的基本原理,为大家揭开木马的神秘面纱。
  木马冰河是用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.Ac t 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部分

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章