sniffer設計與實現_第1頁
sniffer設計與實現_第2頁
sniffer設計與實現_第3頁
sniffer設計與實現_第4頁
sniffer設計與實現_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、程序實踐四網絡安全與網絡管理實踐報告軟件學院實驗成績表2010年版1. 實踐目的(1) 掌握sniffer程序原理;(2) 學習Wincap編程(3) 能夠使用Wincap實現數據包的捕獲(4) 設計和實現一個sniffer程序(5) 掌握ARP欺騙原理,并能夠實施ARP欺騙2. 實踐內容(1)使用Winpcap實現數據包的捕獲:;(2)分析數據包:處理捕獲的數據包,解析出其協議類型、源MAC地址、目的MAC地址、源IP地址、目的IP地址、源端口、目的端口和數據部分,然后將這些信息保存在文件中。最終根據文件內容統計以下協議的數據流量:網絡層:IP,ICMP;傳輸層:TCP,UDP。(3)將捕獲

2、的信息存放在數據庫中,根據捕獲的信息進行流量統計;(4)ARP欺騙:截獲網絡上的數據包,對其進行分析,獲取源和目的地址,用該數據包的目的IP地址來偽裝自己的IP地址,并按照ARP報文格式,對該數據包的發送者發送ARP欺騙包,并驗收ARP欺騙成功。(5)界面化:利用MFC構建圖形界面,便于用戶操作。3. 實踐過程1 Sniffer網絡嗅探器使用MFC構建圖形界面,工程基于對話框模式建立。工程共有兩個對話框,分別為主對話框IDD_WINCAPA_DLG,其類名為CWincapaDlg,以及新建的對話框IDD_DIALOG,其類名為CAdapaterSelDlg,其作用是在進入主對話框之前選擇網卡設

3、備。 類CAdapaterSelDlg:如截圖顯示,對話框內使用了Combo Box控件,并在ClassWizard里定義了CComboBox的變量m_selAdapter,在類CAdapaterSelDlg中定義了一個public的變量int m_selIndex。在ClassWizard中添加三個成員函數:virtual void OnOK();/把選中的設備的序號賦值到m_selIndex中virtual BOOL OnInitDialog();/初始化對話框,把已經查找出來的網絡設備顯示在下拉列表中virtual void OnCancel();/彈出對話框,并退出程序 獲取本地網卡列

4、表所使用的函數以及代碼在實驗指導書中都有,這里就不過多介紹了。主對話框:主對話框中使用了check box控件,list control控件,以及五個button控件。在ClassWizard里定義變量:list control控件變量CListCtrlm_list,BOOL型的check box變量m_arpFilter;m_icmpFilter;m_ipFilter;m_tcpFilter; m_udpFilter。在WincapaDlg.cpp中定義結構體:struct ETHDR/以太網頭部 u_char eh_dst6; u_char eh_src6; u_short eh_type

5、;/IP?ARP?;typedef struct ip_header/* IPv4 header */ u_char ver_ihl; / Version (4 bits) + Internet header length (4 bits) u_char tos; / Type of service u_short tlen; / Total length u_short identification; / Identification u_short flags_fo; / Flags (3 bits) + Fragment offset (13 bits) u_char ttl; / Ti

6、me to live u_char proto; / Protocol u_short crc; / Header checksum u_int saddr; / Source address u_int daddr; / Destination address u_int op_pad; / Option + Paddingip_header;struct TCPPacketHead /* TCP header*/u_short SourPort;u_short DestPort;u_int SeqNo;u_int AckNo;u_char HLen;u_char Flag;u_short

7、WndSize;u_short ChkSum;u_short UrgPtr;struct UDPPacketHead/* UDP header*/ u_short sport; / Source port u_short dport; / Destination port u_short len; / Datagram length u_short crc; / Checksum;struct ICMPPacketHead /*ICMP header*/u_char type;u_char code;u_short chkSum;typedef struct ARP_header/ARP he

8、aderu_char hardware;u_char proto; / Protocolu_short haddresslen;u_short paddresslen;u_char type;u_char smaddr6;/source mac addressu_int saddr;/soure ip addressu_char dmaddr6;/destination mac addressu_int daddr;/destination ip addressARP_header;在ClassWizard里添加成員函數: OnInitDialog(), OnSysCommand(UINT n

9、ID, LPARAM lParam),OnPaint(),HCURSOR OnQueryDragIcon()等。下面會做具體介紹:BOOL CWincapaDlg:OnInitDialog()函數中,對對話框進行初始化,主要是對list control控件的初始化操作,添加“數據”,“大小”,“目的端口”,“目的MAC地址”,“目的地址”,“源端口”,“源MAC地址”,“源地址”,“序號”共十列。主要代碼如下:m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);m_list.InsertColumn(0,"

10、數據",LVCFMT_LEFT,335);m_list.InsertColumn(0,"大小",LVCFMT_LEFT,40);CFont *font = CFont:FromHandle(HFONT):GetStockObject(DEFAULT_GUI_FONT);void CWincapaDlg:OnStart()函數是在ClassWizard對IDD_START按鈕添加的響應函數,主要是進行數據包的捕獲,因為MFC中對pcap_loop()函數不兼容,所以在工程中我使用了線程函數,如上代碼所示,而在OnStart()函數中調用線程AfxBeginThrea

11、d(threadFunc, (LPVOID)this);即可是捕獲數據包。流程圖中為wincap捕獲數據包的流程:線程函數UINT threadFunc (LPVOID p)CWincapaDlg *pDlg = static_cast<CWincapaDlg *>(p) ;int res;struct pcap_pkthdr *header;const u_char *pkt_data;while(!isStop && (res = pcap_next_ex(adhandle, &header, &pkt_data) >= 0)if(res

12、= 0)/Timeout elapsed continue;u_char a= 's'pDlg->intepretPacket(&a, header, pkt_data);/解釋報文if(res = -1)CString tmp;tmp.Format("Error reading the packets: %sn", pcap_geterr(adhandle);AfxMessageBox(tmp);exit(1);pcap_close(adhandle);return -1;void CWincapaDlg:applyFilter(pcap_t

13、 *fp, char *packet_filter, bpf_u_int32 NetMask, struct bpf_program fcode)函數設置過濾規則。在OnStart()函數中調用此函數。通過m_arpFilter; m_icmpFilter; m_ipFilter; m_tcpFilter; m_udpFilter,當選中其中某項時,變量的值變為TRUE型(默認為FALSE),把過濾表達式線程相應的網絡協議類型。比如,選中arp協議項,通過判斷m_arpFilter=TRUE,strcpy(packet_filter,"arp");將過濾表達式設置為arp,

14、使用pcap_compile(fp, &fcode, packet_filter, 1, NetMask)以及pcap_setfilter(fp, &fcode)設置過濾規則。void CWincapaDlg:intepretPacket(u_char *param, const pcap_pkthdr *header, const u_char *pkt_data)函數,主要是分析數據包,根據接收的數據包的字段類型進行分類。如線程代碼所示,在線程中調用此函數。將分析出的數據包的協議, 源MAC地址,目的MAC地址,源地址,源端口,目的地址,目的端口,大小, 數據等信息都通過格

15、式化xx.Format()函數轉換為其對應的格式,添加到list control列表中。下面的流程圖為區分四種協議的流程圖。ARP:以太網的協議類型值為0x0806;IP:以太網的協議類型值為0x0800;UDP:IP的協議類型值為17;TCP: IP的協議類型值為6;ICMP IP的協議類型值為1。void CWincapaDlg:insertData( CString s1, CString s2, CString s3, CString s4, CString s5, CString s6, CString s7, CString s8,CString s9,CString s10)函數

16、將分析出的數據包信息寫入list control列表,函數在intepretPacket()中調用。部分代碼如下:int index;index = m_list.InsertItem(0,s1);m_list.SetItem(index,1,LVIF_TEXT,s2, 0, 0, 0,0);void CWincapaDlg:OnStop()函數是在ClassWizard對IDD_STOP按鈕添加的響應函數,停止捕獲數據包,并顯示已經捕獲的不同協議數據包的數量。在工程中定義4個static int的全局變量,c_tcp,c_udp,c_icmp,c_arp,在OnStart函數中對其值初始化為

17、0,在intepretPacket函數中在相應的協議中進行累加,最后用MessageBox把其值顯示出來。以下為設置ARP過濾的捕獲停止的截圖:void CWincapaDlg:OnClear()函數是在ClassWizard對IDD_CLEAR按鈕添加的響應函數,清除list control列表中的數據內容,使用m_list.DeleteAllItems()。void CWincapaDlg:OnSavelist()函數在ClassWizard對IDD_SAVELIST按鈕添加的響應函數,用于將list control列表中的數據內容存放在數據庫中。我所使用的數據庫為MYSQL,在數據庫中建

18、立了命名為sniffer的表單,在安裝數據庫時,設定用戶名為root,密碼為123。連接數據庫使用的代碼:if(m_list.GetItemCount()=0)MessageBox("沒有數據要存儲!");return;u_int i;MYSQL *db;db=mysql_init(0);/初始化數據庫CString str1,str2,str3,str4,str5,str6,str7,str8,str9,str10,sqls;if(mysql_real_connect(db,"localhost","root","123&

19、quot;,"sniffer",3306,NULL,0)/連接數據庫for(i=1;i<=num;i+)str1=m_list.GetItemText(num-i,0);str2=m_list.GetItemText(num-i,1);str3=m_list.GetItemText(num-i,2);/把列表中的數據插入數據庫中sqls="INSERT INTO sniffer VALUES('"+str1+"','"+str2+"','"+str3+"

20、9;,'"+str4+"',)"mysql_query(db,sqls);MessageBox("存儲成功!");截圖如下:存儲顯示數據庫內容:void CWincapaDlg:OnExit()函數是在ClassWizard對IDD_EXIT按鈕添加的響應函數,退出程序。SendMessage(WM_CLOSE);關閉對話框。2 ARP欺騙ARP工作原理首先,每臺主機都會在自己的ARP緩沖區中建立一個 ARP列表,以表示IP地址和MAC地址的對應關系。當源主機需要將一個數據包要發送到目的主機時,會首先檢查自己 ARP列表中是否存

21、在該 IP地址對應的MAC地址,如果有就直接將數據包發送到這個MAC地址;如果沒有,就向本地網段發起一個ARP請求的廣播包,查詢此目的主機對應的MAC地址。此ARP請求數據包里包括源主機的IP地址、硬件地址、以及目的主機的IP地址。網絡中所有的主機收到這個ARP請求后,會檢查數據包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此數據包;如果相同,該主機首先將發送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已經存在該IP的信息,則將其覆蓋,然后給源主機發送一個 ARP響應數據包,告訴對方自己是它需要查找的MAC地址;源主機收到這個ARP響應數據包后,將得到的目的主機的

22、IP地址和MAC地址添加到自己的ARP列表中,并利用此信息開始數據的傳輸。如果源主機一直沒有收到ARP響應數據包,表示ARP查詢失敗。ARP欺騙過程ARP協議并不只在發送了ARP請求才接收ARP應答。當計算機接收到ARP應答數據包的時候,就會對本地的ARP緩存進行更新,將應答中的IP和MAC地址存儲在ARP緩存中。所以在網絡中,有人發送一個自己偽造的ARP應答,網絡可能就會出現問題。設一個網絡環境中,網內有三臺主機,分別為主機A、B、C。主機詳細信息如下描述: 02 MAC: 00-16-d3-fb-8c-c5B的地址為:IP:.101 MAC: 00-1e-ec-94-e8-0cC的地址為:

23、IP:.103 MAC: 00-22-15-22-81-88正常情況下A和C之間進行通訊,但是此時B向A發送一個自己偽造的ARP應答,而這個應答中的數據為發送方IP地址是03(C的IP地址),MAC地址是00-1e-ec-94-e8-0c(C的MAC地址本來應該是00-22-15-22-81-88,這里被偽造了)。當A接收到B偽造的ARP應答,就會更新本地的ARP緩存(A被欺騙了),這時B就偽裝成C了。同時,B同樣向C發送一個ARP應答,應答包中發送方IP.102(A的IP地址),MAC地址是00-1e-ec-94-e8-0c(A的MAC地址本來應該是00-16-d3-f

24、b-8c-c5),當C收到B偽造的ARP應答,也會更新本地ARP緩存(C也被欺騙了),這時B就偽裝成了A。這樣主機A和C都被主機B欺騙,A和C之間通訊的數據都經過了B。實驗截圖:欺騙成功實驗關鍵代碼(發送ARP數據包):arp_packet packet;/設置目的MAC地址packet.eth.dest_mac0=00;packet.eth.dest_mac1=16;packet.eth.dest_mac2=d3;packet.eth.dest_mac3=fb;packet.eth.dest_mac4=8c;packet.eth.dest_mac5=c5;/假設源MAC地址為本地IP地址pa

25、cket.eth. source_mac 0=00;packet.eth. source_mac 1=1e;packet.eth. source_mac 2=ec;packet.eth. source_mac 3=94;packet.eth. source_mac 4=e8;packet.eth. source_mac 5=0c;/填充數據包packet.eth.eh_type=htons(0x0806);/ARPpacket.arp.hardware_type=htons(0x0001);tocol_type=htons(0x0800);packet.arp.ad

26、d_len=0x06;_len=0x04;packet.arp.option=htons(0x0002);packet.arp.saddr=arp->daddr;packet.arp.daddr=arp->saddr;memcpy(packet.arp.dest_addr,arp->sour_addr,6);memcpy(packet.arp.sour_addr,packet1,6); for (i = 0; i <18; i+)packet.arp.paddingi = 1;psend=(unsigned char*)&packet

27、;/強制轉換發送的數據包的類型/發送數據包pcap_sendpacket(adhandle,psend,sizeof(psend);3 試驗中出現的問題以及解決方案(1) Combo Box控件無法下拉工程運行時發現,對話框中的下拉列表只能顯示第一個網卡的信息。解決方法:把鼠標放在下拉列表的處,當光標的形狀變成上下箭頭時,點擊下拉框的中間白點,向下拉即可。(2) Wincap中的部分函數與MFC中的函數redefine,重定義在link過程中,出現wincap中的一些函數以及變量重定義的錯誤,比如pcap_complile等。#define WIN32_LEAN_AND_MEAN#includ

28、e<windows.h>#include<winsock2.h>(3)編譯時出現如下問題: packet32.h(231) : error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage'  解決方法:1.向winpcap庫的packet32.h文件中加入如下代碼,且應位于“struct npf_if_addr”定義之前:    #ifndef _SS_PAD1SIZE   

29、60;        struct sockaddr_storage                  u_char sa_len;                 u_char sa_family; 

30、0;               u_char padding128;          ;         #endif   2.將sockaddr_storage   改成   sockaddr。 (4)添加mysql時出現錯誤解決方式:把mysql的Include,Lib.debug目錄添加進VC6.0的環境變量中;針對每一個項目,先用VC打開項目,然后在"Project->Settings",擇"Link",在"Object/library modules"的輸入框里添加"libmysql.lib "。在StdAfx.h文件中加上 #i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論