信息來源:/
防火墻主要由日誌、網絡狀態列表和網絡狀態控制(如攔截)組成。所以我們需要三個界面,壹個是主界面——狀態列表。壹個是日誌界面,壹個是控制界面。
打開VB創建壹個新項目並添加壹個窗體。壹個* * *到3個表格,2個模塊。太復雜了。我也在想怎麽寫才能讓大家看得懂。文章寫得不好,請收錄。告訴我原則:
首先,監控TCP連接
黑客程序或木馬程序的本質是實現數據傳輸。TCP和UDP(用戶數據報協議)是最常用的兩種數據傳輸協議,兩者都是采用設置監聽端口的方式來完成數據傳輸。
實時監控所有端口的連接,及時預警異常連接,並提示用戶刪除異常連接,可以有效達到防黑客的目的。
使用微軟的IP助手庫函數(iphlpapi.dll)是壹種捷徑。GetTcpTable函數可以返回當前系統中所有有效的TCP連接。它被定義為:
聲明函數GetTcpTable Lib“iphlpapi . dll”(ByRef pTcpTable為MIB_TCPTABLE,ByRef pdwSize為Long,ByVal bOrder為Long)為Long
其中,參數1是指向TCP連接表緩沖區的指針,參數2是緩沖區大小(當緩沖區不夠大時,此參數返回實際需要的大小),參數3表示連接表是否需要依次按“本地IP”、“本地端口”、“遠程IP”、“遠程端口”排序。
使用GetUdpTable函數可以完成對UDP連接表的監控。因為它們在使用上完全相似,所以這裏省略討論。
二、異常警告和刪除連接
通過定期比較兩個TCP連接表,可以立即發現異常並給出警告。收到預警信號後,首先要刪除可疑連接,然後仔細檢查系統中是否有安全漏洞或可疑進程在工作。IP助手庫函數中的SetTcpEntry函數可以幫助我們刪除可疑連接。它被定義為:
公共聲明函數setcpentry Lib " IPhlpAPI "(pTcpRow As MIB _ TCPROW)只要'這是用來關閉壹個開放的端口。
在調用這個函數之前,要刪除的連接的狀態應該設置為MIB_TCP_STATE_DELETE_TCB。MIB_TCP_STATE_DELETE_TCB也是唯壹可以在運行時設置的狀態。
好了,有了這些,壹個防火墻的基本原理和方法就已經知道了,哈哈,我們要封裝這些函數和API。用下面的代碼建立壹個名為modNetstat的類模塊。
- modNetstat -
選項顯式
定義壹些ICMP協議。
將MIBICMPSTATS作為MIBICMPSTATS公開
公共類型MIBICMPSTATS
dwEchos壹樣長
dwEchoReps壹樣長
結束類型
公共mibicminfo作為mibicminfo
公共類型MIBICMPINFO
icmpOutStats作為MIBICMPSTATS
結束類型
公共MIB_ICMP作為MIB_ICMP
公共類型MIB_ICMP
統計為MIBICMPINFO
結束類型
GetIcmpStatistics函數允許您查看當前ICMP數據報流量。
公共聲明函數GetIcmpStatistics Lib " iphlpapi . dll "(pStats As mibimpinfo)為Long
Public Last_ICMP_Cnt為整數
-
定義壹些TCP協議
MIB_TCPROW類型
dwState為Long
dwLocalAddr壹樣長
dwLocalPort壹樣長
dwRemoteAddr壹樣長
dwRemotePort壹樣長
結束類型
MIB_TCPTABLE類型
dwNumEntries壹樣長
表格(100)格式為MIB_TCPROW
結束類型
public MIB _ TCP table As MIB _ TCP table
GetTcpTable函數可以返回當前系統中所有有效的TCP連接。
聲明函數GetTcpTable Lib“iphlpapi . dll”(ByRef pTcpTable為MIB_TCPTABLE,ByRef pdwSize為Long,ByVal bOrder為Long)為Long
SetTcpEntry函數可以幫助我們刪除可疑的連接。
公共聲明函數setcpentry Lib " IPhlpAPI "(pTcpRow As MIB _ TCPROW)只要'這是用來關閉壹個開放的端口。
將連接狀態定義為13。
字符串形式的公共IP_States(13)
Private Last_Tcp_Cnt為整數
-
定義winsock相關內容
私有常量AF_INET = 2
私有常量IP_SUCCESS As Long = 0
私有常量MAX_WSADescription = 256
私有常量MAX_WSASYSStatus = 128
私有常量SOCKET_ERROR As Long = -1
私有常量WS _ VERSION _ REQD As Long = & ampH101
HOSTENT類型
h_name As Long '主機的正式名稱
h_aliases As Long '別名列表
h_addrtype As Integer '主機地址類型
h_length為整數地址長度
h_addr_list As Long地址列表
結束類型
服務類型
s_name As Long '(指向字符串的指針)正式服務名
s_aliases As Long '(指向字符串的指針)別名列表(可能以空值分隔,以2null結尾)
s_port As Long ' port #
要使用的s_proto As Long '(指向)協議
結束類型
私有類型WSADATA
整數形式的wVersion
整數形式的wHighVersion
szDescription(0到MAX_WSADescription)以字節表示
szSystemStatus(0到MAX_WSASYSStatus)以字節表示
wMaxSockets壹樣長
wMaxUDPDG壹樣長
dwVendorInfo As Long
結束類型
公共聲明函數ntohs Lib "WSOCK32。DLL" (ByVal netshort壹樣長)壹樣長
Inet_addr將IP地址從點格式轉換為無符號長整數。
私有聲明函數inet_addr Lib "WSOCK32。DLL" (ByVal CP As String)壹樣長
Inet_ntoa將IP地址從點格式轉換為ascii。
私有聲明函數inet_ntoa Lib "WSOCK32。DLL”(ByVal inn壹樣長)壹樣長
私有聲明函數gethostbyaddr Lib "WSOCK32。DLL" (Addr為Long,ByVal addr_len為Long,ByVal addr_type為Long)為Long
私有聲明函數gethostbyname Lib "WSOCK32。DLL" (ByVal host_name As String)壹樣長
私有聲明函數WSAStartup Lib "WSOCK32。DLL "(ByVal wVersionRequired As Long,lpWSADATA As WSADATA)壹樣長
私有聲明函數WSACleanup Lib "WSOCK32。DLL "()壹樣長
如果這個函數的返回值不是0,它就是內存的地址。因為VB不能直接操作地址,所以還必須調用RtlMoveMemory函數將數據寫入地址。
private Declare Sub RtlMoveMemory Lib " kernel 32 "(HPV dest As Any,ByVal hpvSource As Long,ByVal cbCopy As Long)
將數據轉換為內存二進制字符串。
聲明子復制內存庫“kernel32”別名“RtlMoveMemory”(Dest As Any,Src As Any,ByVal cb & amp)
將函數lstrlen Lib " kernel 32 "(ByVal lpString As Any)聲明為整數
私有被阻止為布爾值
定義網絡狀態
子初始狀態()
IP_States(0) = "未知"
IP_States(1) = "已關閉"
IP_States(2) = "監聽"
IP_States(3) = "發送同步空閑字符"
IP_States(4) = "接收同步空閑字符"
IP_States(5) = "數據交換"
IP_States(6) = "結束等待1 "
IP_States(7) = "結束等待2 "
IP_States(8) = "關閉等待"
IP_States(9) = "關閉"
IP_States(10) = "命令回答正確"
IP_States(11) = "連接等待"
IP_States(12) = "刪除TCP連接"
末端接頭
字符串形式的公共函數GetAscIP(ByVal inn As Long)
Dim nStr & amp
Dim lpStr As Long
將retString作為字符串變暗
retString = String(32,0)
lpStr = inet_ntoa(inn)
如果lpStr那麽
nStr = lstrlen(lpStr)
如果nStr & gt32那麽nStr = 32
復制記憶ByVal retString,ByVal lpStr,nStr
retString = Left(retString,nStr)
GetAscIP = retString
其他
GetAscIP = "無法獲取IP "
如果…就會結束
結束功能
好吧,日誌就是創建壹個日誌文件,所以我們把需要的功能封裝在壹個類模塊中。創建壹個公共模塊。代碼如下所示
日誌的定義
公共函數日誌(RemA為字符串,RemP為字符串,LocP為字符串,Txt為字符串)
Dim ff As Long
ff =自由文件
打開日誌文件
打開應用程序。路徑與路徑。" \log.log "作為#ff追加
將數據寫入日誌文件
寫#ff,時間& amp“-”& amp;日期、RemA、RemP、LocP、Txt
在日誌窗口中顯示數據。
ListItems.Add,,Time & amp“-”& amp;日期
frm log . lstlog . listitems(frm log . lstlog . listitems . count)。子項(1) = RemA
frm log . lstlog . listitems(frm log . lstlog . listitems . count)。分項(2) = RemP
frm log . lstlog . listitems(frm log . lstlog . listitems . count)。分項(3) = LocP
frm log . lstlog . listitems(frm log . lstlog . listitems . count)。子項(4) = Txt
結束日誌操作
關閉#ff
結束功能
好了,函數和API數據庫封裝好了。下面是設計界面和功能組合:)
首先創建主窗體,在這裏將名稱改為frmMain。我不想扼殺妳的創造力,但請不要為了代碼最終測試的成功而改變它:)
點項目-部分,插入微軟Windows公共控件6.0 (SP4)如圖1所示:
在前面放壹個小鉤,確保:)
回到桌面,雙擊工具欄,加入後右鍵點擊上面的屬性。
依次插入按鈕,如圖2所示:
索引標題樣式圖像
1,暫時停止攔截1-tbrcheck。
2刷新0-tbr默認值
3(空)3-tbr分離器
4查看日誌0- tbrdefault
插入兩個名為imgHot和imgCold的ImageList空間。
依次插入圖片,其實就是“停止屏蔽”等按鈕上顯示的圖片。
右鍵單擊工具欄,如圖3所示:
將圖像列表修改為imgcold,將熱圖像列表修改為imghot。
嗯,在圖2中,我們看到圖片後面的數字,就是imgcold圖片列表的編號:)
添加ListView控件
右鍵單擊屬性列標題
索引文本寬度
1遠程IP可以自行調整:)
2個遠程端口
3本地端口
4個州
好,添加壹個名為tmrRefresh的定時器控件,用來刷新網絡狀態列表。
將間隔設置為250的頂部。
最終界面如下圖所示:
添加如下代碼:
定義壹些常數
作為整數的私有lC
字符串形式的公共塊
Private a_RemA(1000)作為字符串
Private a_LocP(1000)作為字符串
Private a_RemP(1000)作為字符串
Private a_Count As Long
以下是刷新網絡狀態的功能。
公共函數RefreshTable(可選強制為Boolean = False)
出錯時繼續下壹步
Dim tcpt為MIB_TCPTABLE,l為Long
Dim x為整數,I為整數
Dim RemA作為字符串,LocP作為字符串,RemP作為字符串
l = Len(MIB_TCPTABLE)
GetTcpTable tcpt,l,0
x = tcpt.dwNumEntries
如果x & ltlC或x & gt那麽用信用證還是武力
lC = x
列表視圖1。列表項。清除
對於i = 0至x - 1
RemA = geta scip(TCP . table(I))。dwRemoteAddr)
RemP = ntohs(tcpt.table(i))。dwRemotePort)
LocP = ntohs(tcpt.table(i))。dwLocalPort)
列表視圖1。列表項。添加。我,瑞瑪
列表視圖1。ListItems(ListView1。ListItems.Count)。子項(1) = RemP
列表視圖1。ListItems(ListView1。ListItems.Count)。分項(2) = LocP
列表視圖1。ListItems(ListView1。ListItems.Count)。子項(3) = modNetstat。IP_States(狀態)
接下來我
如果…就會結束
結束功能
私有子窗體_Load()
調用網絡狀態函數
modNetstat。初始狀態
開始刷新網絡狀態列表。
可刷新的
末端接頭
private Sub listview 1 _ MouseUp(Button為整數,Shift為整數,x為Single,y為Single)
判斷鼠標右鍵是否按下。
如果Button = 2且ListView1。ListItems . Count & gt那麽0
調用控制按鈕,下面會提到。
弗曼。PopupMenu frmMenu.mnuConn
如果…就會結束
末端接頭
私有Sub tmrRefresh_Timer()
定期刷新網絡狀態列表。
可刷新的
末端接頭
公共子工具欄1 _ Button click(ByVal Button As MSComctlLib。按鈕)
選擇案例按鈕。索引
案例1
停止功能按鈕
If按鈕。Caption = "停止"
按鈕。Caption = "繼續"
按鈕。ToolTipText = "繼續開始工作"
tmrRefresh。啟用=假
停止刷新網絡狀態列表,反之亦然。
其他
按鈕。Caption = "停止"
按鈕。ToolTipText = "停止工作"
tmrRefresh。啟用=真
如果…就會結束
案例2
刷新按鈕功能
可刷新的
案例4
顯示日誌
Frmlog。顯示
結束選擇
末端接頭
好了,我們來定義壹下控制按鈕:)也就是右擊網絡狀態顯示的攔截連接。
創建壹個新的表單,命名為frmMenu,只需要有壹個菜單,如圖:
修改菜單屬性:
標題名稱
姆努康姆努康
攔截連接mnuDis
如圖所示:
好,添加如下代碼:
私有Sub mnuDis_Click()
Dim tcpt作為MIB_TCPTABLE
Dim l壹樣長
暗淡我壹樣長
Dim RemA作為字符串,RemP作為字符串,LocP作為字符串
i = Right(frmMain。列表視圖1。SelectedItem.Key,Len(frmMain。列表視圖1。SelectedItem . Key)-1)+1
RemA = frmMain。列表視圖1。列表項(壹)
RemP = frmMain。列表視圖1。列表項(壹)。分項(1)
LocP = frmMain。列表視圖1。列表項(壹)。分項(2)
l = Len(MIB_TCPTABLE)
GetTcpTable tcpt,l,0
TCP . table(I-1)。dwState = 12
斷開TCP連接,還記得開頭說的函數嗎?
settpentry TCP . table(I-1)
多項活動
寫入日誌
日誌RemA、RemP、LocP,“截取連接”
末端接頭
好了,最後有壹個日誌操作表單,建立了壹個名為Frmlog的表單。
壹個使用listview和command控件,並調整位置,如圖所示。
Listview屬性
名稱列表
列標題的索引文本大小可以自行調整。
1時間
2個IP
3遠程端口
4本地端口
5描述
添加如下代碼
私有子命令1_Click()
將r標註為字符串
R = MsgBox("防火墻日誌是檢查黑客入侵的有效手段!"“& ampvbCrLf & amp;vbCrLf &清除日誌?”,vbQuestion & ampVbYesNo,“註意!" )
如果妳按“是”,那麽
如果r = vbYes,則
Dim ff As Long
ff =自由文件
打開日誌寫空數據,即清空日誌。
打開應用程序。路徑與路徑。" \log.log "作為#ff輸出
關閉#ff
清空列表
lstLog。列表項。清除
如果…就會結束
末端接頭
程序運行後,我成功攔截了我之前開發的壹個竊取撥號密碼的特洛伊木馬,如下圖所示:
第壹次拿到密碼,沒有攔截。攔截後提示無法連接。