計算機網路技術的日益發展和普及,為訊息共享提供了一條全球性的高速通道,但目前採用的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
文章定位: