版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上計算機與信息學(xué)院計算機網(wǎng)絡(luò)系統(tǒng)實踐報告設(shè)計題目:嗅探器的設(shè)計與實現(xiàn)學(xué)生姓名:*學(xué) 號:2010*專業(yè)班級:信息安全*2013 年 9 月 25一、設(shè)計要求1.不限平臺,可以使用Libpcap、WinPcap 或 Linux的原始套接字;2.實現(xiàn)一個功能比較簡單的、具有圖形界面的Sniffer,主線程響應(yīng)用戶界面操作,工作線程完成抓包等工作;3.能夠解析出IP層和傳輸層的協(xié)議頭,能夠過濾TCP、UDP等數(shù)據(jù)包;4.能夠輸出文本方式傳送的數(shù)據(jù)包的內(nèi)容;5.能夠進(jìn)行簡單的流量統(tǒng)計。二、開發(fā)環(huán)境與工具操作系統(tǒng):windows7開發(fā)工具:visual studio開發(fā)語言:C+
2、附加庫 :Winpcap三、設(shè)計原理網(wǎng)絡(luò)嗅探器是一種常用的監(jiān)聽網(wǎng)絡(luò)的工具。所謂嗅探器( Sniffer) ,是一種利用計算機網(wǎng)絡(luò)接口截獲網(wǎng)絡(luò)數(shù)據(jù)的軟件或硬件,可用于網(wǎng)絡(luò)管理、網(wǎng)絡(luò)協(xié)議分析以及網(wǎng)絡(luò)安全等眾多方面。嗅探器不同于一般的鍵捕獲工具,后者只能捕獲當(dāng)?shù)亟K端控制臺上的按鍵內(nèi)容,而嗅探器所“嗅”到的是動態(tài)的以信息包形式( 如IP 數(shù)據(jù)包或者以太網(wǎng)包) 封裝的信息流。其中可能攜帶了重要數(shù)據(jù)或敏感信息??梢詫⑦@些捕獲到的信息包存檔,以利用相應(yīng)工具可以作進(jìn)一步分析。計算機網(wǎng)絡(luò)的設(shè)計為嗅探器的使用創(chuàng)造了最基本的條件。在目前的網(wǎng)絡(luò)環(huán)境中,所有計算機節(jié)點都是共享傳輸介質(zhì),任意節(jié)點發(fā)出或發(fā)往任意節(jié)點的數(shù)據(jù)幀
3、必將經(jīng)過網(wǎng)內(nèi)每一個節(jié)點的網(wǎng)絡(luò)接口,此時只需對嗅探節(jié)點的網(wǎng)絡(luò)接口( 網(wǎng)卡) 進(jìn)行適當(dāng)?shù)脑O(shè)置便可為實現(xiàn)嗅探的做好準(zhǔn)備工作。在計算機網(wǎng)絡(luò)系統(tǒng)中,網(wǎng)卡是用來接收網(wǎng)絡(luò)上其他節(jié)點發(fā)來的數(shù)據(jù)幀,其內(nèi)嵌的單片處理程序會檢測數(shù)據(jù)幀來源的MAC 地址,并根據(jù)網(wǎng)卡所設(shè)置的接收方式來是否接收處理數(shù)據(jù),如果認(rèn)為應(yīng)該處理,則網(wǎng)卡就會產(chǎn)生中斷信號通知中央處理器,接收該數(shù)據(jù)幀并傳輸給操作系統(tǒng)處理。否則就簡單丟棄,所對應(yīng)節(jié)點的網(wǎng)卡就截斷,計算機的中央處理器并不參與。網(wǎng)卡是網(wǎng)絡(luò)中節(jié)點主機的關(guān)鍵硬件設(shè)備。對數(shù)據(jù)的接收一般有四種設(shè)置模式: 廣播模式: 接收在網(wǎng)絡(luò)中進(jìn)行廣播數(shù)據(jù)信息。組播模式: 接收組播數(shù)據(jù)信息。單播模式: 只有匹配的
4、目的網(wǎng)卡才能接收數(shù)據(jù)信息?;祀s模式: 網(wǎng)卡能夠可以接收一切通過它的數(shù)據(jù)信息。4、 系統(tǒng)功能描述及軟件模塊劃分系統(tǒng)功能設(shè)計本系統(tǒng)的基本功能為實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的捕獲, 并將其數(shù)據(jù)內(nèi)容解析顯示。網(wǎng)絡(luò)數(shù)據(jù)包捕獲功能主要負(fù)責(zé)從網(wǎng)絡(luò)中捕獲和過濾數(shù)據(jù),這可以通過調(diào)用winPcap提供的豐富的API函數(shù)來實現(xiàn); 數(shù)據(jù)解析及顯示部分主要負(fù)責(zé)界面數(shù)據(jù)轉(zhuǎn)化、解析、處理、格式化、協(xié)議分析等, 這一部分主要通過MFC 來設(shè)計一個單文檔圖形用戶界面GUI,解析結(jié)果將通過MFC的類庫顯示到GUI中系統(tǒng)總系結(jié)構(gòu)網(wǎng)絡(luò)嗅探器的整體設(shè)計由三個模塊組成, 自底向上分別是嗅探器設(shè)置模塊, 數(shù)據(jù)包捕獲模塊, 解析和顯示模塊。嗅探器設(shè)置模塊
5、主要調(diào)用w inP c aP 提供的API,分為獲取網(wǎng)絡(luò)設(shè)備信息,設(shè)置并編譯過濾器,打開網(wǎng)絡(luò)設(shè)備三個步驟。數(shù)據(jù)包捕獲模塊創(chuàng)建了新的線程,利用了winPcap的非回調(diào)函數(shù)Pcap_ next_ex()函數(shù)從winPcap底層驅(qū)動的數(shù)據(jù)緩沖區(qū)中讀取數(shù)據(jù)包,并將數(shù)據(jù)包存儲在系統(tǒng)臨時文件中, 以便之后的分析。用Pcap_open_offline()函數(shù)從離線文件中讀取包。讀取到的任意一個符合捕獲條件數(shù)據(jù)包, 將其內(nèi)容解析, 并顯示本數(shù)據(jù)包。捕獲完成后, 進(jìn)人解析和顯示模塊。(嗅探器總體結(jié)構(gòu)如圖1 )圖1.嗅探器總體結(jié)構(gòu)五、設(shè)計步驟嗅探器的設(shè)置模塊a .獲取已連接的網(wǎng)絡(luò)設(shè)備列表, winPcap提供了p
6、cap_findalldevs_ex()函數(shù), 這個函數(shù)返回一個PcaP-if結(jié)構(gòu)的鏈表, 每個這樣的結(jié)構(gòu)都包含了一個適配器的詳細(xì)信息。b.打開網(wǎng)絡(luò)設(shè)備,winPcap提供了pcap_open()函數(shù),該函數(shù)第一參數(shù)制定要捕獲數(shù)據(jù)包的哪些部分, 第二參數(shù)用來制定適配器是否為混雜模式, 第三參數(shù)為讀取數(shù)據(jù)的超時時間, 當(dāng)適配器被打開后, 就可以進(jìn)行捕獲工作了;c.設(shè)置過濾器, winPcap中用來過濾數(shù)據(jù)包的函數(shù)是pcap_compile()和pc ap_setfilter()。pcap_compile()它將一個高層的布爾過濾表達(dá)式編譯成一個能夠被過濾引擎所解釋的低層的字節(jié)碼。pcap_set
7、filter()將一個過濾器與內(nèi)核捕獲會話相關(guān)聯(lián)。當(dāng)pcap_set_filter()被調(diào)用時, 這個過濾器將被應(yīng)用到來自網(wǎng)絡(luò)的所有數(shù)據(jù)包, 并且, 所有的符合要求的數(shù)據(jù)包(即那些經(jīng)過過濾器以后, 布爾表達(dá)式為真的包), 將會立即復(fù)制給應(yīng)用程序。數(shù)據(jù)包的捕獲模塊該部分創(chuàng)建了一個用于捕獲數(shù)據(jù)包的線程, 在該線程中調(diào)用winPcap提供的pcap_next_ex()函數(shù)從底層驅(qū)動數(shù)據(jù)緩沖區(qū)中讀取數(shù)據(jù)包, 該函數(shù)接受已打開的網(wǎng)絡(luò)設(shè)備句柄, 返回捕獲數(shù)據(jù)包的實體,并用pcap_dump函數(shù)將每一個數(shù)據(jù)包寫人臨時文件中。解析與顯示模塊該部分在接收到用戶發(fā)出的捕獲完成消息后, 將數(shù)據(jù)包從離線文件中逐條取出
8、并進(jìn)行解析和顯示。將解析完畢數(shù)據(jù)包中的各項內(nèi)容填人已經(jīng)預(yù)先聲明的協(xié)議的數(shù)據(jù)結(jié)構(gòu)中, 包括(序號,捕獲時間,以太幀長度,傳輸層協(xié)議,源IP 地址,目的IP地址,源MAC地址,目的MAC地址),然后將數(shù)據(jù)結(jié)構(gòu)添加到列表視圖中WinPcap是一個在Windows操作系統(tǒng)下的免費、公開的用于直接訪問網(wǎng)絡(luò)的開發(fā)工具包(編程API)。大多數(shù)Windows網(wǎng)絡(luò)應(yīng)用程序都是通過Winsock API(Windows套接口)這類高級編程接口訪問網(wǎng)絡(luò)的。這種方法允許在網(wǎng)絡(luò)上進(jìn)行簡單的數(shù)據(jù)傳送,因為操作系統(tǒng)的TCP/IP協(xié)議棧實現(xiàn)軟件會處理底層細(xì)節(jié)(協(xié)議操作、流程重組等等),并提供一個類似于讀寫文件的函數(shù)
9、接口。 然而,有時候“簡便方法”并不能滿足實際需要。有些程序希望繞過TCP/IP協(xié)議棧,直接處理底層網(wǎng)絡(luò)中的通信數(shù)據(jù),它們需要對網(wǎng)絡(luò)進(jìn)行底層進(jìn)行直接訪問,即在沒有類似協(xié)議棧(TCP/IP協(xié)議棧)的實體介入條件下對網(wǎng)絡(luò)進(jìn)行原始訪問。 絡(luò)程序?qū)嶋H上是繞開操作系統(tǒng)的TCP/IP協(xié)議棧直接通過底層網(wǎng)絡(luò)發(fā)送數(shù)據(jù),因此,網(wǎng)絡(luò)程序可以實現(xiàn)一些更低級、更靈活的功能。 2、WinPcap的目的和用途 開發(fā)WinPcap的目的是為Win32應(yīng)用程序提供一種直接訪問底層網(wǎng)絡(luò)的能力。通過WinPcap,網(wǎng)絡(luò)應(yīng)用程序可以實現(xiàn)如下功能: 1) 捕獲原
10、始數(shù)據(jù)包,包括發(fā)送到本主機以及在共享網(wǎng)絡(luò)上的數(shù)據(jù)包。 2) 數(shù)據(jù)過濾。在將數(shù)據(jù)包發(fā)送給應(yīng)用程序之前按照用戶的規(guī)定對捕獲的數(shù)據(jù)包進(jìn)行過濾。 3) 發(fā)送原始數(shù)據(jù)包。向網(wǎng)絡(luò)發(fā)送原始數(shù)據(jù)包。 4) 數(shù)據(jù)包統(tǒng)計。對網(wǎng)絡(luò)通信進(jìn)行統(tǒng)計。 3、基于WinPcap可以開發(fā)的網(wǎng)絡(luò)應(yīng)用程序 基于WinPcap可以開發(fā)很多網(wǎng)絡(luò)應(yīng)用程序,典型的包括: 1) 網(wǎng)絡(luò)和協(xié)議分析軟件2) 網(wǎng)絡(luò)監(jiān)聽軟件 3) 網(wǎng)絡(luò)通信量記錄軟件 4) 網(wǎng)絡(luò)數(shù)據(jù)生成軟件 5) 用
11、戶機網(wǎng)橋和路由器 6) 網(wǎng)絡(luò)入侵探測系統(tǒng) 7) 網(wǎng)絡(luò)掃描軟件 8) 網(wǎng)絡(luò)安全工具 二、WinPcap的體系結(jié)構(gòu)分析 1、WinPcap的組成與結(jié)構(gòu) 如圖2.1,WinPcap由一個數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序(NPF)、一個底層的動態(tài)連接庫(packet.dll)和一個高層的不依賴于操作系統(tǒng)的靜態(tài)庫(wpcap.dll)共三個部分構(gòu)成。這里,NPF在操作系統(tǒng)的內(nèi)核級,packet.dll、wpcap.dll在用戶級。 4 向9x系統(tǒng)的概念和NT系統(tǒng)的非常相似,只是在某
12、些實現(xiàn)上有點差異,比如說9x只支持ANSI編碼,而NT系統(tǒng)則提倡使用Unicode編碼。 簡單來講,WinPcap典型的開發(fā)和運行環(huán)境是windows NT/2000/XP。當(dāng)然,早期的WinPcap也支持windows 95/98/Me,但是,我們不推薦在windows 95/98/Me下開發(fā)和運行基于WinPcap的網(wǎng)絡(luò)應(yīng)用。 二、WinPcap的體系結(jié)構(gòu)分析 1、WinPcap的組成與結(jié)構(gòu) 如圖2.1,WinPcap由一個數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序(NPF)、一個底層的動態(tài)連接庫(packet.dll)和一個高
13、層的不依賴于操作系統(tǒng)的靜態(tài)庫(wpcap.dll)共三個部分構(gòu)成。這里,NPF在操作系統(tǒng)的內(nèi)核級,packet.dll、wpcap.dll在用戶級。 1)數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序 技術(shù)實現(xiàn)上,為了實現(xiàn)抓包,系統(tǒng)必須繞過操作系統(tǒng)的協(xié)議棧來訪問在網(wǎng)絡(luò)上傳輸?shù)脑紨?shù)據(jù)包(raw packet)。這就要求WinPcap的一部分運行在操作系統(tǒng)核心內(nèi)部,直接與網(wǎng)絡(luò)接口驅(qū)動交互。由于這個部分是系統(tǒng)依賴(system dependent)的,在Winpcap的解決方案中它被視為是一個設(shè)備驅(qū)動,稱作NPF(Netgroup Packet Filter)。
14、Winpcap開發(fā)小組針對Windows95,Windows98,WindowsME,Windows NT 4,Windows2000和WindowsXP提供了不同版本的驅(qū)動(在Windows95/98/ME中是VXD文件,在WindowsNT/2000中是SYS文件)。這些驅(qū)動不僅提供了基本的特性(例如抓包、發(fā)送原始數(shù)據(jù)包注入數(shù)據(jù)包),還有更高級的特性(例如可編程的過濾器系統(tǒng)和監(jiān)視引擎)。前者可以被用來約束一個抓包會話只針對網(wǎng)絡(luò)通信中的一個子集概括地講,數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序直接從數(shù)據(jù)鏈路層抓取網(wǎng)絡(luò)數(shù)據(jù)包并過濾,將數(shù)據(jù)包不加修改地傳遞給運行在用戶層的應(yīng)用程序。它在不同的W
15、INDOWS系統(tǒng)下是不同。數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序支持BPF過濾機制,可以靈活地設(shè)置過濾規(guī)則。 2)底層的動態(tài)連接庫(packet.dll)和高層靜態(tài)庫(wpcap.dll) 為了方便編程,WinPcap必須提供一個編程接口(API),這就是WinPcap的底層的動態(tài)連接庫(packet.dll)和高層靜態(tài)庫(wpcap.dll)。這里,packet.dll提供了一個底層API,伴隨著一個獨立于Microsoft操作系統(tǒng)的編程接口,這些API可以直接用來訪問驅(qū)動的函數(shù);wpcap.dll導(dǎo)出了一組更強大的與libpcap一致的高層抓包函數(shù)庫(capture prim
16、itives),這些函數(shù)使得數(shù)據(jù)包的捕獲以一種與網(wǎng)絡(luò)硬件和操作系統(tǒng)無關(guān)的方式進(jìn)行底層動態(tài)鏈接庫運行在用戶層,它將應(yīng)用程序和數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序隔離開來,使得應(yīng)用程序可以不加修改地在不同的WINDOWS系統(tǒng)上運行。高級的靜態(tài)鏈接庫和應(yīng)用程序編譯在一起,它使用低級動態(tài)鏈接庫提供的服務(wù),向應(yīng)用程序提供完善的監(jiān)聽接口。 概括來講,WinPcap包含了一個最優(yōu)化的內(nèi)核模式驅(qū)動稱作Netgroup Packet Filter(NPF),和一套與libpcap兼容的用戶級函數(shù)庫。WinPcap使Unix平臺下的應(yīng)用程序能方便的移植到Win32平臺下,并且它能使一套很大的Uni
17、x函數(shù)庫只需通過簡單的重新編譯就立刻在Win32平臺下使用。而且,由于網(wǎng)絡(luò)監(jiān)聽的重要性,WinPcap還為此提供了特殊的系統(tǒng)調(diào)用函數(shù)。實際上,Windows環(huán)境下的WinPcap與Unix環(huán)境下的Berkeley Packet Filter(BPF)在體系架構(gòu)上是基本一致的。在Unix環(huán)境下,程序員只需要了解Libpcap提供的編程接口即可,Libpcap將應(yīng)用程序與操作系統(tǒng)內(nèi)核之間的相互作用隱藏起來,提供了一套與用戶程序聯(lián)系的函數(shù)和強大的捕獲數(shù)據(jù)包的抽象接口。在Windows環(huán)境下,程序員主要基于wpcap.dll提供的編程接口開發(fā)應(yīng)用程序。當(dāng)然,程序要也可以使用pack
18、et.dll、NPF提供的編程接口,只是后者提供的API更加底層。六、關(guān)鍵問題及其解決方法界面初始化BOOL CzszhangDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOU
19、TBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);/ 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE);/ 設(shè)置小圖標(biāo)ShowWindow(SW_MINIMIZE);m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);m_listCtrl.Ins
20、ertColumn(0,_T("編號"),3,30); /1表示右,表示中,表示左m_listCtrl.InsertColumn(1,_T("時間"),3,130);m_listCtrl.InsertColumn(2,_T("長度"),3,72);m_listCtrl.InsertColumn(3,_T("源MAC地址"),3,140);m_listCtrl.InsertColumn(4,_T("目的MAC地址"),3,140);m_listCtrl.InsertColumn(5,_T(&quo
21、t;協(xié)議"),3,70);m_listCtrl.InsertColumn(6,_T("源IP地址"),3,145);m_listCtrl.InsertColumn(7,_T("目的IP地址"),3,145);m_combobox.AddString(_T("請選擇一個網(wǎng)卡接口(必選)");m_comboBoxRule.AddString(_T("請選擇過濾規(guī)則(可選)");if(sniffer_initCap()<0)return FALSE;/*初始化接口列表*/for(dev=alldev;de
22、v;dev=dev->next)if(dev->description)m_combobox.AddString(CString(dev->description); /*初始化過濾規(guī)則列表*/m_comboBoxRule.AddString(_T("tcp");m_comboBoxRule.AddString(_T("udp");m_comboBoxRule.AddString(_T("ip");m_comboBoxRule.AddString(_T("icmp");m_comboBoxRule
23、.AddString(_T("arp");m_combobox.SetCurSel(0);m_comboBoxRule.SetCurSel(0);m_buttonStop.EnableWindow(FALSE);m_buttonSave.EnableWindow(FALSE);return TRUE; / 除非將焦點設(shè)置到控件,否則返回TRUE捕獲數(shù)據(jù)包/開始捕獲int CzszhangDlg:sniffer_startCap()int if_index,filter_index,count;u_int netmask;struct bpf_program fcode;CS
24、tring Ncard;sniffer_initCap();/獲得接口和過濾器索引if_index = this->m_combobox.GetCurSel();filter_index = this->m_comboBoxRule.GetCurSel();if(0=if_index | CB_ERR = if_index)MessageBox(_T("請選擇一個合適的網(wǎng)卡接口");return -1;if(CB_ERR = filter_index)MessageBox(_T("過濾器選擇錯誤");return -1;/*獲得選中的網(wǎng)卡接口
25、*/dev=alldev;for(count=0;count<if_index-1;count+)dev=dev->next;if (adhandle= pcap_open_live(dev->name,/ 設(shè)備名 65536,/捕獲數(shù)據(jù)包長度 1,/ 混雜模式(非意味著是混雜模式) 1000,/ 讀超時設(shè)置 errbuf/ 錯誤信息 ) = NULL)MessageBox(_T("無法打開接口:"+CString(dev->description);pcap_freealldevs(alldev);return -1; /*檢查是否為以太網(wǎng)*/if
26、(pcap_datalink(adhandle)!=DLT_EN10MB)MessageBox(_T("這不適合于非以太網(wǎng)的網(wǎng)絡(luò)!");pcap_freealldevs(alldev);return -1;if(dev->addresses!=NULL)netmask=(struct sockaddr_in *)(dev->addresses->netmask)->sin_addr.S_un.S_addr;elsenetmask=0xffffff; /編譯過濾器if(0=filter_index)char filter = ""i
27、f (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 )MessageBox(_T("語法錯誤,無法編譯過濾器");pcap_freealldevs(alldev);return -1;elseCString str;char *filter;int len,x;this->m_comboBoxRule.GetLBText(filter_index,str);len = str.GetLength()+1;filter = (char*)malloc(len);for(x=0;x<len;
28、x+)filterx = str.GetAt(x);if (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 )MessageBox(_T("語法錯誤,無法編譯過濾器");pcap_freealldevs(alldev);return -1;/設(shè)置過濾器if (pcap_setfilter(adhandle, &fcode)<0)MessageBox(_T("設(shè)置過濾器錯誤");pcap_freealldevs(alldev);return -1;/* 設(shè)置數(shù)據(jù)包存儲路
29、徑*/CFileFind file;char thistime30;struct tm *ltime;memset(filepath,0,512);memset(filename,0,64);if(!file.FindFile(_T("SavedData")CreateDirectory(_T("SavedData"),NULL);time_t nowtime;time(&nowtime);ltime=localtime(&nowtime);strftime(thistime,sizeof(thistime),"%Y%m%d %
30、H%M%S",ltime);strcpy(filepath,"SavedData");strcat(filename,thistime);strcat(filename,".zsz");strcat(filepath,filename);dumpfile =pcap_dump_open(adhandle, filepath);if(dumpfile=NULL)MessageBox(_T("文件創(chuàng)建錯誤!");return -1; pcap_freealldevs(alldev);/*接收數(shù)據(jù),新建線程處理*/LPDWORD
31、threadCap=NULL;m_ThreadHandle=CreateThread(NULL,0,sniffer_CapThread,this,0,threadCap);if(m_ThreadHandle=NULL)int code=GetLastError();CString str;str.Format(_T("創(chuàng)建線程錯誤,代碼為%d."),code);MessageBox(str);return -1;return 1;數(shù)據(jù)包處理DWORD WINAPI sniffer_CapThread(LPVOID lpParameter)int res,nItem ;str
32、uct tm *ltime;CString timestr,buf,srcMac,destMac;time_t local_tv_sec;struct pcap_pkthdr *header; /數(shù)據(jù)包頭const u_char *pkt_data=NULL,*pData=NULL; /網(wǎng)絡(luò)中收到的字節(jié)流數(shù)據(jù)u_char *ppkt_data;CzszhangDlg *pthis = (CzszhangDlg*) lpParameter;if(NULL = pthis->m_ThreadHandle)MessageBox(NULL,_T("線程句柄錯誤"),_T(&q
33、uot;提示"),MB_OK);return -1;while(res = pcap_next_ex( pthis->adhandle, &header, &pkt_data) >= 0)if(res = 0)/超時continue;struct datapkt *data = (struct datapkt*)malloc(sizeof(struct datapkt);memset(data,0,sizeof(struct datapkt);if(NULL = data)MessageBox(NULL,_T("空間已滿,無法接收新的數(shù)據(jù)包&qu
34、ot;),_T("Error"),MB_OK);return -1; /分析出錯或所接收數(shù)據(jù)包不在處理范圍內(nèi)if(analyze_frame(pkt_data,data,&(pthis->npacket)<0)continue; /將數(shù)據(jù)包保存到打開的文件中if(pthis->dumpfile!=NULL)pcap_dump(unsigned char*)pthis->dumpfile,header,pkt_data);/更新各類數(shù)據(jù)包計數(shù)pthis->sniffer_updateNPacket();/將本地化后的數(shù)據(jù)裝入一個鏈表中,以
35、便后來使用ppkt_data = (u_char*)malloc(header->len);memcpy(ppkt_data,pkt_data,header->len);pthis->m_localDataList.AddTail(data);pthis->m_netDataList.AddTail(ppkt_data);/*預(yù)處理,獲得時間、長度*/data->len = header->len;/鏈路中收到的數(shù)據(jù)長度local_tv_sec = header->ts.tv_sec;ltime = localtime(&local_tv_se
36、c);data->time0 = ltime->tm_year+1900;data->time1 = ltime->tm_mon+1;data->time2 = ltime->tm_mday;data->time3 = ltime->tm_hour;data->time4 = ltime->tm_min;data->time5 = ltime->tm_sec;/*為新接收到的數(shù)據(jù)包在listControl中新建一個item*/buf.Format(_T("%d"),pthis->npkt);nIt
37、em = pthis->m_listCtrl.InsertItem(pthis->npkt,buf);/*顯示時間戳*/timestr.Format(_T("%d/%d/%d %d:%d:%d"),data->time0,data->time1,data->time2,data->time3,data->time4,data->time5);pthis->m_listCtrl.SetItemText(nItem,1,timestr);/*顯示長度*/buf.Empty();buf.Format(_T("%d&q
38、uot;),data->len);pthis->m_listCtrl.SetItemText(nItem,2,buf);/*顯示源MAC*/buf.Empty();buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->src0,data->ethh->src1,data->ethh->src2,data->ethh->src3,data->ethh->src4,data->ethh->src5);pthis->m_list
39、Ctrl.SetItemText(nItem,3,buf);/*顯示目的MAC*/buf.Empty();buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->dest0,data->ethh->dest1,data->ethh->dest2,data->ethh->dest3,data->ethh->dest4,data->ethh->dest5);pthis->m_listCtrl.SetItemText(nItem,4,buf)
40、;/*獲得協(xié)議*/pthis->m_listCtrl.SetItemText(nItem,5,CString(data->pktType);/*獲得源IP*/buf.Empty();if(0x0806= data->ethh->type)buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_srcip0,data->arph->ar_srcip1,data->arph->ar_srcip2,data->arph->ar_srcip3);else if(0x0800 =
41、data->ethh->type) struct in_addr in;in.S_un.S_addr = data->iph->saddr;buf = CString(inet_ntoa(in);else if(0x86dd =data->ethh->type )int n;for(n=0;n<8;n+)if(n<=6)buf.AppendFormat(_T("%02x:"),data->iph6->saddrn);elsebuf.AppendFormat(_T("%02x"),data->
42、;iph6->saddrn);pthis->m_listCtrl.SetItemText(nItem,6,buf);/*獲得目的IP*/buf.Empty();if(0x0806 = data->ethh->type)buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_destip0,data->arph->ar_destip1,data->arph->ar_destip2,data->arph->ar_destip3);else if(0x0800 = data-&
43、gt;ethh->type)struct in_addr in;in.S_un.S_addr = data->iph->daddr;buf = CString(inet_ntoa(in);else if(0x86dd =data->ethh->type )int n;for(n=0;n<8;n+)if(n<=6)buf.AppendFormat(_T("%02x:"),data->iph6->daddrn);elsebuf.AppendFormat(_T("%02x"),data->iph6-&
44、gt;daddrn);pthis->m_listCtrl.SetItemText(nItem,7,buf);/*對包計數(shù)*/pthis->npkt+;return 1;數(shù)據(jù)解析函數(shù)/*分析鏈路層*/int analyze_frame(const u_char * pkt,struct datapkt * data,struct pktcount *npacket)int i;struct ethhdr *ethh = (struct ethhdr*)pkt;data->ethh = (struct ethhdr*)malloc(sizeof(struct ethhdr);if
45、(NULL = data->ethh)return -1;for(i=0;i<6;i+)data->ethh->desti = ethh->desti;data->ethh->srci = ethh->srci;npacket->n_sum+;data->ethh->type = ntohs(ethh->type);/處理ARP還是IP包?switch(data->ethh->type)case 0x0806:return analyze_arp(u_char*)pkt+14,data,npacket); /m
46、ac 頭大小為break;case 0x0800:return analyze_ip(u_char*)pkt+14,data,npacket);break;case 0x86dd:return analyze_ip6(u_char*)pkt+14,data,npacket);return -1;break;default:npacket->n_other+;return -1;break;return 1;/*分析網(wǎng)絡(luò)層:ARP*/int analyze_arp(const u_char* pkt,datapkt *data,struct pktcount *npacket)int i;
47、struct arphdr *arph = (struct arphdr*)pkt;data->arph = (struct arphdr*)malloc(sizeof(struct arphdr);if(NULL = data->arph )return -1;/復(fù)制IP及MACfor(i=0;i<6;i+)if(i<4)data->arph->ar_destipi = arph->ar_destipi;data->arph->ar_srcipi = arph->ar_srcipi;data->arph->ar_dest
48、maci = arph->ar_destmaci;data->arph->ar_srcmaci= arph->ar_srcmaci;data->arph->ar_hln = arph->ar_hln;data->arph->ar_hrd = ntohs(arph->ar_hrd);data->arph->ar_op = ntohs(arph->ar_op);data->arph->ar_pln = arph->ar_pln;data->arph->ar_pro = ntohs(arph-
49、>ar_pro);strcpy(data->pktType,"ARP");npacket->n_arp+;return 1;/*分析網(wǎng)絡(luò)層:IP*/int analyze_ip(const u_char* pkt,datapkt *data,struct pktcount *npacket)int i;struct iphdr *iph = (struct iphdr*)pkt;data->iph = (struct iphdr*)malloc(sizeof(struct iphdr);if(NULL = data->iph)return -1
50、;data->iph->check = iph->check;npacket->n_ip+;data->iph->saddr = iph->saddr;data->iph->daddr = iph->daddr;data->iph->frag_off = iph->frag_off;data->iph->id = iph->id;data->iph->proto = iph->proto;data->iph->tlen = ntohs(iph->tlen);dat
51、a->iph->tos = iph->tos;data->iph->ttl = iph->ttl;data->iph->ihl = iph->ihl;data->iph->version = iph->version;data->iph->op_pad = iph->op_pad;int iplen = iph->ihl*4;/ip頭長度switch(iph->proto)case PROTO_ICMP:return analyze_icmp(u_char*)iph+iplen,data,np
52、acket);break;case PROTO_TCP:return analyze_tcp(u_char*)iph+iplen,data,npacket);break;case PROTO_UDP:return analyze_udp(u_char*)iph+iplen,data,npacket);break;default :return-1;break;return 1;/*分析網(wǎng)絡(luò)層:IPV6*/int analyze_ip6(const u_char* pkt,datapkt *data,struct pktcount *npacket)int i;struct iphdr6 *ip
53、h6 = (struct iphdr6*)pkt;data->iph6 = (struct iphdr6*)malloc(sizeof(struct iphdr6);if(NULL = data->iph6)return -1;npacket->n_ip6+;data->iph6->version = iph6->version;data->iph6->flowtype = iph6->flowtype;data->iph6->flowid = iph6->flowid;data->iph6->plen = n
54、tohs(iph6->plen);data->iph6->nh = iph6->nh;data->iph6->hlim =iph6->hlim;for(i=0;i<16;i+)data->iph6->saddri = iph6->saddri;data->iph6->daddri = iph6->daddri;switch(iph6->nh)case 0x3a:return analyze_icmp6(u_char*)iph6+40,data,npacket);break;case 0x06:return
55、 analyze_tcp(u_char*)iph6+40,data,npacket);break;case 0x11:return analyze_udp(u_char*)iph6+40,data,npacket);break;default :return-1;break;return 1;/*分析傳輸層:ICMP*/int analyze_icmp(const u_char* pkt,datapkt *data,struct pktcount *npacket)struct icmphdr* icmph = (struct icmphdr*)pkt;data->icmph = (st
56、ruct icmphdr*)malloc(sizeof(struct icmphdr);if(NULL = data->icmph)return -1;data->icmph->chksum = icmph->chksum;data->icmph->code = icmph->code;data->icmph->seq =icmph->seq;data->icmph->type = icmph->type;strcpy(data->pktType,"ICMP");npacket->n_
57、icmp+;return 1;/*分析傳輸層:ICMPv6*/int analyze_icmp6(const u_char* pkt,datapkt *data,struct pktcount *npacket)int i;struct icmphdr6* icmph6 = (struct icmphdr6*)pkt;data->icmph6 = (struct icmphdr6*)malloc(sizeof(struct icmphdr6);if(NULL = data->icmph6)return -1;data->icmph6->chksum = icmph6->chksum;data->icmph6->code = icmph6->code;data->icmph6->seq =icmph6->seq;data->icmph6->type = icmph6->type;data->icmph6->op_len = icmph6->op_len;data->icmph6->op_type = icmph6->op_type;for(i=0;i<6;i+)data->icmph6->o
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版安全防范設(shè)備安裝與保安人員勞務(wù)合同2篇
- 2025版太陽能光伏發(fā)電系統(tǒng)安裝與安全檢驗合同3篇
- 《養(yǎng)老保險宣傳方案》課件
- 2025年度個人投資理財合同4篇
- 2025版萬科物業(yè)知識共享與培訓(xùn)服務(wù)合同3篇
- 2025版戶外廣告牌清洗及維護服務(wù)合同3篇
- 2025版司機車輛維護保養(yǎng)合同3篇
- 二零二五年度大數(shù)據(jù)分析服務(wù)借款合同協(xié)議2篇
- 2025年度鋁單板智能制造技術(shù)改造項目合同4篇
- 2025版我國行政救濟制度優(yōu)化與執(zhí)行監(jiān)督合同3篇
- 2025-2030年中國陶瓷電容器行業(yè)運營狀況與發(fā)展前景分析報告
- 二零二五年倉儲配送中心物業(yè)管理與優(yōu)化升級合同3篇
- 2025屆廈門高三1月質(zhì)檢期末聯(lián)考數(shù)學(xué)答案
- 音樂作品錄制許可
- 江蘇省無錫市2023-2024學(xué)年高三上學(xué)期期終教學(xué)質(zhì)量調(diào)研測試語文試題(解析版)
- 拉薩市2025屆高三第一次聯(lián)考(一模)英語試卷(含答案解析)
- 開題報告:AIGC背景下大學(xué)英語教學(xué)設(shè)計重構(gòu)研究
- 師德標(biāo)兵先進(jìn)事跡材料師德標(biāo)兵個人主要事跡
- 連鎖商務(wù)酒店述職報告
- 《實踐論》(原文)毛澤東
- 第三單元名著導(dǎo)讀《紅星照耀中國》(公開課一等獎創(chuàng)新教學(xué)設(shè)計+說課稿)
評論
0/150
提交評論