當前位置:編程學習大全網 - 編程語言 - 專家指導:我想用VB寫壹個安全軟件。

專家指導:我想用VB寫壹個安全軟件。

VB防火墻開發原理2007-01-08 13:06以下為轉載內容,本人對本文不享有任何權利,也不承擔由此產生的任何責任。。

信息來源:/

防火墻主要由日誌、網絡狀態列表和網絡狀態控制(如攔截)組成。所以我們需要三個界面,壹個是主界面——狀態列表。壹個是日誌界面,壹個是控制界面。

打開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。列表項。清除

如果…就會結束

末端接頭

程序運行後,我成功攔截了我之前開發的壹個竊取撥號密碼的特洛伊木馬,如下圖所示:

第壹次拿到密碼,沒有攔截。攔截後提示無法連接。

  • 上一篇:二次函數在生活中的應用論文?
  • 下一篇:期望是什麽意思(是因為欲望和期望值太高了)
  • copyright 2024編程學習大全網