系統概述
該系統由兩個子系統組成:服務器端系統和客戶端(工作站)系統。服務器端系統安裝在網絡管理人員的計算機上,用於實施各種對聯網計算機的監控操作;客戶端系統安裝在每臺聯網的計算機上,它運行後以圖標的方式出現在系統任務欄的提示區中,不影響工作站的其他操作,只用於響應服務器端的監控命令,並根據服務的需要,及時採樣工作站的相應數據返回給服務器端。該系統的運行環境可以運行於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協議,具體用法請參閱有關資料。
結束語
通過在基本的網絡監控系統增加入侵檢測,就能夠極大提高網絡的整體安全性,使之更靈敏、更智能,大大降低入侵的成功率。