網(wǎng)絡(luò)協(xié)議分析獲取并解析ARP_第1頁
網(wǎng)絡(luò)協(xié)議分析獲取并解析ARP_第2頁
網(wǎng)絡(luò)協(xié)議分析獲取并解析ARP_第3頁
網(wǎng)絡(luò)協(xié)議分析獲取并解析ARP_第4頁
網(wǎng)絡(luò)協(xié)議分析獲取并解析ARP_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

./成績:網(wǎng)絡(luò)協(xié)議分析報(bào)告題目:獲取并解析網(wǎng)絡(luò)中的ARP數(shù)據(jù)包學(xué)院:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)__0411203__2012211699__李傳根要求與功能編程序,獲取網(wǎng)絡(luò)中的ARP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫入日志文件。運(yùn)行格式:程序名日志文件原理與方法2.0什么是ARP地址解析協(xié)議〔AddressResolutionProtocol,ARP〕是在僅知道主機(jī)的IP地址時(shí)確定其物理地址的一種協(xié)議。因IPv4和以太網(wǎng)的廣泛應(yīng)用,其主要用作將IP地址翻譯為以太網(wǎng)的MAC地址,但其也能在ATM和FDDIIP網(wǎng)絡(luò)中使用。從IP地址到物理地址的映射有兩種方式:表格方式和非表格方式。ARP具體說來就是將網(wǎng)絡(luò)層〔IP層,也就是相當(dāng)于OSI的第三層〕地址解析為數(shù)據(jù)連接層〔MAC層,也就是相當(dāng)于OSI的第二層〕的MAC地址。 在以太網(wǎng)協(xié)議中規(guī)定,同一局域網(wǎng)中的一臺(tái)主機(jī)要和另一臺(tái)主機(jī)進(jìn)行直接通信,必須要知道目標(biāo)主機(jī)的MAC地址。而在TCP/IP協(xié)議棧中,網(wǎng)絡(luò)層和傳輸層只關(guān)心目標(biāo)主機(jī)的IP地址。這就導(dǎo)致在以太網(wǎng)中使用IP協(xié)議時(shí),數(shù)據(jù)鏈路層的以太網(wǎng)協(xié)議接到上層IP協(xié)議提供的數(shù)據(jù)中,只包含目的主機(jī)的IP地址。于是需要一種方法,根據(jù)目的主機(jī)的IP地址,獲得其MAC地址。這就是ARP協(xié)議要做的事情。所謂地址解析〔addressresolution〕就是主機(jī)在發(fā)送幀前將目標(biāo)IP地址轉(zhuǎn)換成目標(biāo)MAC地址的過程。另外,當(dāng)發(fā)送主機(jī)和目的主機(jī)不在同一個(gè)局域網(wǎng)中時(shí),即便知道目的主機(jī)的MAC地址,兩者也不能直接通信,必須經(jīng)過路由轉(zhuǎn)發(fā)才可以。所以此時(shí),發(fā)送主機(jī)通過ARP協(xié)議獲得的將不是目的主機(jī)的真實(shí)MAC地址,而是一臺(tái)可以通往局域網(wǎng)外的路由器的某個(gè)端口的MAC地址。于是此后發(fā)送主機(jī)發(fā)往目的主機(jī)的所有幀,都將發(fā)往該路由器,通過它向外發(fā)送。這種情況稱為ARP代理〔ARPProxy〕。2.1、ARP協(xié)議與工作原理ARP協(xié)議是"AddressResolutionProtocol"〔地址解析協(xié)議〕的縮寫。在局域網(wǎng)中,網(wǎng)絡(luò)中實(shí)際傳輸?shù)氖?幀",幀里面是有目標(biāo)主機(jī)的MAC地址的。在以太網(wǎng)中,一個(gè)主機(jī)要和另一個(gè)主機(jī)進(jìn)行直接通信,必須要知道目標(biāo)主機(jī)的MAC地址。但這個(gè)目標(biāo)MAC地址是如何獲得的呢?它就是通過地址解析協(xié)議獲得的。所謂"地址解析"就是主機(jī)在發(fā)送幀前將目標(biāo)IP地址轉(zhuǎn)換成目標(biāo)MAC地址的過程。ARP協(xié)議的基本功能就是通過目標(biāo)設(shè)備的IP地址,查詢目標(biāo)設(shè)備的MAC地址,以保證通信的順利進(jìn)行。ARP的基本運(yùn)行過程:主機(jī)A希望發(fā)送數(shù)據(jù)分組給主機(jī)B,但不知道B的物理地址。A發(fā)送廣播報(bào)文,要求B主機(jī)用用他的物理地址來響應(yīng)。上所有的主機(jī)都接收到這個(gè)分組。B識(shí)別自己的IP地址,發(fā)送響應(yīng)報(bào)文,告訴A自己的物理地址。2.2、ARP的分組格式物理幀頭〔14B〕ARP幀結(jié)構(gòu)〔28B〕填充數(shù)據(jù)〔18B〕CRC〔4B>圖一ARP分組格式目的MAC〔6B〕源MAC〔6B〕類型〔2B>圖二物理幀頭0 8 16 24 32硬件類型〔Ethernet:0x1〕上層協(xié)議類型〔IP:0x0800〕硬件地址長度〔0x6〕IP地址長度〔0x4〕操作〔請(qǐng)求:0x1;應(yīng)答:0x2〕源MAC地址源MAC地址源IP地址源IP地址目的MAC地址目的MAC地址目的IP地址圖三ARP幀結(jié)構(gòu)2.3工作原理源主機(jī)在傳輸數(shù)據(jù)前,首先要對(duì)數(shù)據(jù)進(jìn)行封裝,在該過程中會(huì)把目的主機(jī)的IP地址和MAC地址封裝進(jìn)去。在通信的初始階段,我們能夠知道目的主機(jī)的IP地址,而MAC地址是不知道的。這時(shí)如果目的主機(jī)和源主機(jī)在同一網(wǎng)絡(luò)內(nèi),源主機(jī)會(huì)以第二層廣播的方式發(fā)送ARP請(qǐng)求報(bào)文。ARP請(qǐng)求報(bào)文中含有源主機(jī)的IP地址和MAC地址,以與目的主機(jī)的IP地址。當(dāng)報(bào)文通過廣播的方式到達(dá)目的主機(jī)時(shí),目的主機(jī)會(huì)響應(yīng)請(qǐng)求報(bào)文,并返回ARP響應(yīng)報(bào)文,從而源主機(jī)就可以獲得目的主機(jī)的MAC地址,同樣目的主機(jī)也可以獲得源主機(jī)的MAC地址。如果目的主機(jī)和源主機(jī)地址不在同一個(gè)網(wǎng)絡(luò)中,源主機(jī)發(fā)送的IP數(shù)據(jù)包會(huì)送到交換機(jī)的默認(rèn)網(wǎng)關(guān),而默認(rèn)網(wǎng)關(guān)的MAC地址同樣可以通過ARP協(xié)議獲取。經(jīng)過ARP協(xié)議解析IP地址之后,主機(jī)會(huì)在緩存中保存IP地址和MAC地址的映射條目,此后再進(jìn)行數(shù)據(jù)交換只要從緩存中讀取映射條目即可。2.4ARP包的填充將命令行的參數(shù)作適當(dāng)?shù)霓D(zhuǎn)換后填到ARP分組結(jié)構(gòu)的個(gè)字段中即可。要注意的是,填充請(qǐng)求包時(shí),因?yàn)榘贓thernet上廣播,所以,物理幀頭的"目的MAC"字段要填充為FFFFFFFFFFFF;而ARP幀結(jié)構(gòu)中的目的MAC可填充任意值,因?yàn)樗藭r(shí)不起作用。"填充數(shù)據(jù)"字段要填充為0。源程序核心函數(shù)說明#include<conio.h>#include<fstream.h>#include<iomanip.h>#include"pcap.h"#include<winsock2.h>#pragmacomment<lib,"ws2_32.lib">#pragmacomment<lib,"wpcap.lib">//定義ARP包數(shù)據(jù)structarppkt{ unsignedshorthdtyp;//硬件類型 unsignedshortprotyp;//協(xié)議類型 unsignedcharhdsize;//硬件地址長度 unsignedcharprosize;//協(xié)議地址長度 unsignedshortop;//〔操作類型〕操作值:ARP/RARP u_charsmac[6];//源MAC地址 u_charsip[4];//源IP地址 u_chardmac[6];//目的MAC地址 u_chardip[4];//目的IP地址};voidpacket_handler<constpcap_pkthdr*header,constu_char*pkt_data,ostream&out>{//從ARP包中找到頭部位置arppkt*arph=<arppkt*><pkt_data+14>; //輸出源IP地址for<inti=0;i<3;i++>out<<int<arph->sip[i]><<'.';out.setf<ios::left>;out<<setw<3><<int<arph->sip[3]><<"";out.unsetf<ios::left>; //輸出源MAC地址 charoldfillchar=out.fill<'0'>; out.setf<ios::uppercase>;for<i=0;i<5;i++>out<<hex<<setw<2><<int<arph->smac[i]><<'-';out<<hex<<setw<2><<int<arph->smac[5]><<"";out.fill<oldfillchar>;out.unsetf<ios::hex|ios::uppercase>; //輸出目的IP地址for<i=0;i<3;i++>out<<int<arph->dip[3]><<'.'; out.unsetf<ios::left>; out<<setw<3><<int<arph->dip[3]><<''; out.unsetf<ios::left>; //輸出目的MAC地址 out.fill<'0'>; out.setf<ios::uppercase>; for<i=0;i<5;i++> out<<hex<<setw<2><<int<arph->dmac[i]><<'-'; out<<hex<<setw<2><<int<arph->dmac[5]><<""; out.fill<oldfillchar>; out.unsetf<ios::hex|ios::uppercase>; //輸出操作類型 out<<ntohs<arph->op><<""; //輸出操作時(shí)間 structtm*ltime; ltime=localtime<&header->ts.tv_sec>; out.fill<'0'>; out<<ltime->tm_hour<<':'<<setw<2><<ltime->tm_min<<':'<<setw<2><<ltime->tm_sec; out.fill<oldfillchar>; out<<endl;}voidmain<intargc,char*argv[]>//命令行參數(shù){ //檢查輸入命令格式 if<argc!=2> { cout<<"Pleaseinputcommand:ParseArpoutput_file"<<endl; return; } //初始化網(wǎng)絡(luò)設(shè)備相關(guān)參數(shù) pcap_if_t*alldevs; pcap_if_t*d; pcap_t*adhandle; charerrbuf[PCAP_ERRBUF_SIZE]; u_intnetmask; charpacket_filter[]="etherproto\\arp"; structbpf_programfcode; structpcap_pkthdr*header; constu_char*pkt_data; //獲取網(wǎng)絡(luò)設(shè)備列表 if<pcap_findalldevs<&alldevs,errbuf>==-1> { cout<<"Errorinpcap_findalldevs:"<<errbuf; return; } //選取一個(gè)Ethernet網(wǎng)卡 for<d=alldevs;d;d=d->next> { // 網(wǎng)卡設(shè)為混雜模式,接收所有幀 if<<adhandle=pcap_open_live<d->name,1000,1,300,errbuf>>==NULL> { cout<<"\nUnabletoopentheadapter."; pcap_freealldevs<alldevs>; return; } //檢查數(shù)據(jù)鏈路是否為Ethernet if<pcap_datalink<adhandle>==DLT_EN10MB&&d->addresses!=NULL> break; }if<d==NULL>{cout<<"\nNointerfacesfound!MakesureWinpcapisinstalled.\n";return;}//獲得子網(wǎng)掩碼netmask=<<sockaddr_in*><d->addresses->netmask>>->sin_addr.S_un.S_addr;//編譯過濾器,只捕獲ARP包if<pcap_compile<adhandle,&fcode,packet_filter,1,netmask><0>{cout<<"\nUnabletocompilethepacketfilter.Checkthesyntax.\n";pcap_freealldevs<alldevs>;return;}//設(shè)置過濾器if<pcap_setfilter<adhandle,&fcode><0>{cout<<"\nErrorsettingthefilter.\n";pcap_freealldevs<alldevs>;return;}//顯示提示信息與每項(xiàng)含義cout<<"listeningon"<<d->description<<"..."<<endl<<endl;ofstreamfout<argv[1],ios::app>;//日志記錄文件//為了查看日志時(shí)的方便,其中加入了日期記錄time_tt;time<&t>;fout.seekp<0,ios::end>;if<fout.tellp<>!=0>fout<<endl;fout<<"\t\tARPrequest<1>/reply<2>on"<<ctime<&t>;cout<<"SourIpAddr"<<""<<"SourMACAddress"<<""<<"DesIpAddr"<<""<<"DesMACAddress"<<""<<"OP"<<""<<"Time"<<endl;fout<<"SourIpAddr"<<""<<"SourMACAddress"<<""<<"DesIpAddr"<<""<<"DesMACAddress"<<""<<"OP"<<""<<"Time"<<endl;//釋放設(shè)備列表pcap_freealldevs<alldevs>;//開始截獲ARP包intresult;while<<result=pcap_next_ex<adhandle,&header,&pkt_data>>>=0>{//循環(huán)解析ARP數(shù)據(jù)包if<result==0>continue; //解析ARP包,結(jié)果輸出到屏幕與文件packet_handler<header,pkt_data,cout>;packet_handler<header,pkt_data,fout>;}}實(shí)驗(yàn)環(huán)境與平臺(tái)搭建操作系統(tǒng):windows8運(yùn)行環(huán)境:MicrosoftVisualC++6.0開發(fā)包:wincapSDK,以與最新platformSDK的一些庫文件把wincapSDK里面的庫文件以與lib包含到源程序中,避免包含wincap頭文件時(shí)出現(xiàn)找不到頭文件的錯(cuò)誤具體方法:在菜單欄中->工具->選項(xiàng)—>目錄,然后選擇include要包含的庫的路徑下載最新platformSDK里面的部分庫文件strsafe.h,然后添加到vc6.0安裝目錄里面的include文件夾里面,源程序需要用到這個(gè)頭文件,但是vc6.0里面沒有這個(gè)開發(fā)語言:C語言,C++實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)結(jié)果:相關(guān)擴(kuò)展與分析:算法和代碼提示:調(diào)用socket〔〕打開協(xié)議簇為PF_PACKET的原始套接字,這樣我們就可以收到數(shù)據(jù)鏈路幀:intfd=socket<PF_PACKET,SOCK_RAM,htons<ETH_P_ALL>>;對(duì)打開的套接字調(diào)用ioct1〔〕,將網(wǎng)卡設(shè)置為混雜模式,這樣我們就可以接受到局域網(wǎng)中所有的包〔包括目的地址不是本機(jī)的幀〕:structifreqreq;memset<&req,0,sizeof<req>>;strncpy<req.ifr_name,"eth0",strlen<"eth0">+1>;ioctl<fd,SIOCGIFFLAS,&req>;req.ifr_flags|=IFF_PROMISC;//設(shè)置為混雜模式icotl<fd,SIOCGIFFLAGS,&req>;利用recvfrom〔〕接收包:recvform<fd,buffer,sizeof<buffer>,0,<structsockaddr*>&from,&from_len>;接收到包后,判斷是否為ARP包,若是ARP包則進(jìn)行處理,否則丟棄。If<<ntohs<eth_header->ether_type>==0x0806>&&<ntohs<arp_header->ar_hrd>==0x0001>&&<ntohs<arp_he

溫馨提示

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

評(píng)論

0/150

提交評(píng)論