用VB6.0實現網絡實時監控系統

  計算機網絡技術的日益發展和普及,爲信息共享提供了一條全球性的高速通道,但目前採用的TCP/IP協議族潛在着安全漏洞,其安全機制並不健全,如何保護企業內部網絡中的資源及信息不受外部攻擊者肆意破壞或盜竊,是企業網絡安全需要解決的重要問題。當我們擔心被黑客攻擊或懷疑電腦被植入木馬時,我們往往求助於防火牆,本系統即通過實時監控全部TCP連接的方法來實現防黑客攻擊。同時網絡管理人員在整個網絡運行期間,能否實時監控聯網計算機的運行狀態和操作對網絡安全具有極其重要的作用.下面就以Visual Basic 6.0作爲開發工具講述兩個主要模塊的設計和實現。

  系統概述

  該系統由兩個子系統組成:服務器端系統和客戶端(工作站)系統。服務器端系統安裝在網絡管理人員的計算機上,用於實施各種對聯網計算機的監控操作;客戶端系統安裝在每臺聯網的計算機上,它運行後以圖標的方式出現在系統任務欄的提示區中,不影響工作站的其他操作,只用於響應服務器端的監控命令,並根據服務的需要,及時採樣工作站的相應數據返回給服務器端。該系統的運行環境可以運行於Win98、Win95或WinNT、Win2000下。在系統的開發中,引入了WINSOCK通訊控件,除此之外,爲較好地實現各項監控操作,還用到了幾個API函數。

  系統功能

  1、監控全部TCP連接:實時監控所有服務器端口的連接情況、及時對異常連接發出警告並提示用戶刪除異常連接;

  2、屏幕監控:該功能允許服務器隨時把被監控工作站的屏幕畫面抓取到服務器中,網絡管理人員對相應工作站所進行的操作一目瞭然,若發現有非法操作即可採取發送警告或強制措施,強迫其停止相應操作;

  3、對工作站進行鎖機、關機、限制鼠標活動等;

  4、服務器和工作站之間的信息互送。

  功能的實現

  1、監控全部TCP連接

  TCP/IP(Transmission Control Protocol/Internet Protocol:傳輸控制協議/互聯網協議)是一個包括TCP、IP、 UDP、ARP、RARP和ICMP等在內的網絡協議集。TCP/IP經常被稱爲“將Internet綁定在一起的粘合劑”,它允許在空間上分離的多個信息網絡連接在一起形成一個巨大的虛擬網絡。TCP和UDP(用戶數據報協議)是兩個最常用的數據傳輸協議,它們都使用設置監聽端口的方法來完成數據傳輸。

  在本文中討論TCP連接。通過使用TCP, Internet客戶機可以打開到另一個Internet客戶機的虛擬連接並傳送數據流。與UDP不同,TCP協議通過重傳丟失的數據報保證傳輸的可靠性。它也保證在接收端的應用程序按發送的順序將接收到的位和字節重新組裝起來以獲取完整的數據。

  要獲得與服務器系統中全部有效的TCP連接,用到GetTcpTable這個API函數,它定義如下:

Private Declare Function GetTcpTable Lib "iphlpapi.
dll" (ByRef pTcpTable As MIB_TCPTABLE, ByRef
pdwSize As Long, ByVal bOrder As Long) As Long

  其中參數pPcpTable是已生成的 TCP連接表緩衝區的指針,參數pdwsize是緩衝區大小(當緩衝區不夠大時,該參數返回實際需要的大小),參數bOrder指示連接表是否需要按“Local IP”、“Localport”、“Remote IP”、“Remote port”依次進行排序,1爲按此順序。

  通過一個TIMEER控件的TIMER的事件來比較前後兩個TCP連接表,我們可以立即發現異常併發出警告。本系統用聲音和報警標誌提醒用戶注意可能的外界入侵。收到警告信號後,我們應首先將可疑連接刪除掉,SetTcpEntry函數可以幫助我們刪除可疑連接。其定義爲:

Private Declare Function SetTcpEntry Lib "iphlpapi.
dll" (ByRef pTcpTable As MIB_TCPROW) As Long

  其中參數pTcptable爲指向tcp錶行的指針。然後將欲刪連接的狀態置爲MIB_TCP_STATE_DELETE_TCB(值爲12)即可刪除該連接。

  TIMER事件源代碼:

Private Sub Timer1_Timer()
 Dim Return1 As Long, i As Long
 Dim Tmp1 As Long, Tmp2 As Long
 Dim Ip_Buf(1 To 4) As Byte
 Dim Win_Path As String, Tmp3 As String
 Return1 = GetTcpTable(TCP1, Len(TCP1), 1)
 If Last_Num_Of_Entries <> 0 And _
   Last_Num_Of_Entries <> TCP1.dwNum_Of_Entries Then
  '異常時發出警告
  Picture1.Visible = True   '警告標誌
  On Error Resume Next
  Win_Path = String(145, 0)
  '利用API函數GetWindowsDirectory獲得當前系統目錄
  i = GetWindowsDirectory(Win_Path, 145)
  Win_Path = Left(Win_Path, i)
  '利用API函數sndPlaySound發出報警聲音
  i = sndPlaySound(Win_Path + "/Media/Ding.wav", &H1)
  On Error GoTo 0
 Else
  If Picture1.Visible = True Then
   Picture1.Visible = False
  End If
 End If
 Last_Num_Of_Entries = TCP1.dwNum_Of_Entries
 Select Case Return1
  Case 0&:
   Text1 = "": Combo1.Clear
   For i = 0 To TCP1.dwNum_Of_Entries - 1
    Tmp3 = Str(i + 1) + " "
    Select Case TCP1.TCP_Table(i).dwState
     ' 顯示連接狀態
    Case 1: Tmp3 = Tmp3 + "CLOSED"
    Case 2: Tmp3 = Tmp3 + "LISTENING"
    Case 3: Tmp3 = Tmp3 + "SYN_SENT"
    Case 4: Tmp3 = Tmp3 + "SYN_RCVD"
    Case 5: Tmp3 = Tmp3 + "ESTABLISHED"
    Case 6: Tmp3 = Tmp3 + "FIN_WAIT1"
    Case 7: Tmp3 = Tmp3 + "FIN_WAIT2"
    Case 8: Tmp3 = Tmp3 + "CLOSE_WAIT"
    Case 9: Tmp3 = Tmp3 + "CLOSING"
    Case 10: Tmp3 = Tmp3 + "LAST_ACK"
    Case 11: Tmp3 = Tmp3 + "TIME_WAIT"
    Case 12: Tmp3 = Tmp3 + "DELETE_TCB"
    End Select
    Combo1.AddItem Tmp3 ' 填充列表以供用戶刪除
    ' 本地IP
    Tmp3 = Tmp3 + ":" + vbCrLf + vbTab + "Local: "
    'CopyMemory爲API函數
    CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwLocalAddr, 4
    Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + _
CStr(Ip_Buf(2)) + "."+ CStr(Ip_Buf(3)) _
+"." + CStr(Ip_Buf(4))
    Tmp1 = TCP1.TCP_Table(i).dwLocalPort
    ' 本地端口
    Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256
    ' 遠程IP
    Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbTab + "Remote: "
    CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwRemoteAddr, 4
    Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) _
+ "."+ CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))
    ' 遠程端口
    Tmp1 = TCP1.TCP_Table(i).dwRemotePort
    Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256
    Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbCrLf
    Text1 = Text1 + Tmp3
   Next i
  Case 50&:
   MsgBox "系統不支持該API函數": End
  Case 87:
   MsgBox "無效的參數": End
  Case 111&:
   MsgBox "緩衝區溢出": End
  Case 232&:
   MsgBox "無數據": End
  End Select
End Sub



  用於刪除連接的CLICK事件源代碼:

Private Sub delete_Click()
 Dim Return1 As Long
 If Combo1.ListIndex < 0 Then Exit Sub
 ' 將欲刪連接的狀態置爲值爲12
 TCP1.TCP_Table(Combo1.ListIndex).dwState = 12  
 ' 執行刪除
 Return1 = SetTcpEntry(TCP1.TCP_Table(Combo1.ListIndex))
 If Return1 = 0 Then
  MsgBox "刪除成功"
 Else
  MsgBox "刪除失敗"
 End If
 Timer1_Timer
End Sub

  2、屏幕監控

  當服務器系統發現TCP異常連接時,可通過屏幕監控功能將局域網中被監控工作站的屏幕畫面抓取到服務器中並實施相應措施,如對工作站鎖機或關機等。此處用到WINSOCK控件,其通訊原理請參閱相關資料,屏幕監控功能用到TCP協議,爲了達到更好的效果,可在窗體中加入TIMER控件,設定TIMER事件。

  (1) 工作站端 

  偵聽並響應服務器端發出的連接請求和屏幕抓取。其中屏幕抓取功能可通過API函數實現:

Dim a As String
Winsock1.GetData a, vbString
Select Case a
 Case "zp"
  Picture1.AutoRedraw = True
  Picture1.ScaleMode = 1
  lDesktop = GetDesktopWindow()
  lDC = GetDC(lDesktop)
  BitBlt Picture1.hdc, 0, 0, Screen.Width, _
Screen.Height, lDC,0, 0, vbSrcCopy
  '獲取圖像數組
  SavePicture Picture1.Image, filename
  Winsock1.SendData "okm"
  Dim myfile() As Byte
 Case "fir" '傳第一塊圖
  Open filename For Binary As #1
  filelen = LOF(1)
  ReDim myfile(1 To blocksize) As Byte  
  '(const blocksize=3072)
  Get #1, , myfile
  Winsock1.SendData myfile
  curpos = blocksize
 Case "next"  ‘傳其它塊
  If curpos = filelen Then
   Winsock1.SendData "end"
   Close #1
  Exit Sub
 End If
 j = curpos + blocksize
 If j > filelen Then
  j = filelen - curpos
 Else
  j = blocksize
 End If
 ReDim myfile(1 To j) As Byte
 Get #1, , myfile
 Winsock1.SendData myfile
 curpos = curpos + j
End Select

  注意:以上功能在WINSOCK的DataArrival事件中實現。抓取的圖象數據量較大,所以需要分塊傳輸。

  (2) 服務器端

DataArrival 事件代碼:
Dim receivefile() As Byte
ReDim receivefile(bytesTotal) As Byte
Winsock1.GetData receivefile, vbArray + vbByte
'告訴Winsock控件收到的是字節數組類型的數據
If Chr(receivefile(0)) = "o" And _
Chr(receivefile(1)) = "k" And _
Chr(receivefile(2)) = "m" Then
 If Dir$(filename) <> "" Then Kill filename
 ' 打開文件,準備存儲圖像
 Open filename For Binary As #1   
 filelen = 0
 Winsock1.SendData "fir"
 Exit Sub
End If
If Chr(receivefile(0)) = "e" And _
Chr(receivefile(1)) = "n" And _
Chr(receivefile(2)) = "d" Then
 Label1.Caption = "end"
 Close #1
 Picture1.Picture = LoadPicture(filename) '顯示圖象
 Exit Sub
End If
Put #1, , receivefile
Winsock1.SendData "next"

  3、其它功能

  主要用到一些API函數,如實現屏幕鎖定和解鎖操作可使用Enable Window,實現關機功能用ExitWindowsEx, 服務器和工作站之間的信息互送用到WINSOCK控件的UDP協議,具體用法請參閱有關資料。

  結束語

  通過在基本的網絡監控系統增加入侵檢測,就能夠極大提高網絡的整體安全性,使之更靈敏、更智能,大大降低入侵的成功率。

 
發佈了1 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章