計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)與安全技術(shù) 課件9 網(wǎng)絡(luò)抓包程序設(shè)計(jì)_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)與安全技術(shù) 課件9 網(wǎng)絡(luò)抓包程序設(shè)計(jì)_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)與安全技術(shù) 課件9 網(wǎng)絡(luò)抓包程序設(shè)計(jì)_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)與安全技術(shù) 課件9 網(wǎng)絡(luò)抓包程序設(shè)計(jì)_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)與安全技術(shù) 課件9 網(wǎng)絡(luò)抓包程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)與安全技術(shù)》第9章

網(wǎng)絡(luò)抓包程序設(shè)計(jì)1學(xué)習(xí)內(nèi)容:(1)網(wǎng)絡(luò)抓包軟件體系結(jié)構(gòu)分析;(2)基于WinPcap的抓包程序設(shè)計(jì);(3)基于sharpCap的抓包程序設(shè)計(jì);(4)基于原始套接字的抓包程序設(shè)計(jì)。學(xué)習(xí)目標(biāo):(1)了解網(wǎng)絡(luò)抓包方法;(2)學(xué)會(huì)選用WinPcap或SharpCap進(jìn)行抓包編程;(3)學(xué)會(huì)利用原始套接字進(jìn)行網(wǎng)絡(luò)抓包程序設(shè)計(jì)。29.1

網(wǎng)絡(luò)抓包軟件體系結(jié)構(gòu)分析網(wǎng)絡(luò)抓包是對(duì)網(wǎng)絡(luò)上收發(fā)的各層數(shù)據(jù)包進(jìn)行捕獲,以便進(jìn)行協(xié)議分析。在結(jié)構(gòu)上涉及到網(wǎng)絡(luò)層、核心技術(shù)和用戶交互層次,內(nèi)容豐富。39.1.1網(wǎng)絡(luò)抓包技術(shù)分析(1)基于WinPcap:在Windows平臺(tái)下訪問(wèn)數(shù)據(jù)鏈路層,能夠應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)包的構(gòu)造、捕獲和分析。該開源組件已經(jīng)達(dá)到了工業(yè)標(biāo)準(zhǔn)的應(yīng)用要求,便于程序員進(jìn)行開發(fā)。(2)基于SharpCap:SharpCap是把WinPcap用C#重新封裝而來(lái)的。在C#編程時(shí),需要先安裝Winpcap組件,再引用以上SharpPcap的2個(gè)庫(kù)文件PacketDotNet.dll,SharpPcap.dll。

/projects/sharppcap/files/SharpPcap/4.2.0/。(3)基于原始套接字技術(shù)49.1.2WinPcap的體系結(jié)構(gòu)59.2

基于WinPcap的抓包程序設(shè)計(jì)9.2.1WinPcap編程基礎(chǔ)一般采用C++語(yǔ)言調(diào)用WinPcap功能函數(shù)。wpcap.dll為了獲得與釋放已連接的網(wǎng)絡(luò)適配器設(shè)備列表,提供了下列函數(shù):在文件\wpcap\libpcap\pcap\pcap.h中:structpcap_if;structpcap_addr;intpcap_findalldevs(pcap_if_t**alldevsp,char*errbuf);voidpcap_freealldevs(pcap_if_t*alldevsp);在文件wpcap\libpcap\remote-ext.h中:intpcap_findalldevs_ex(char*source,structpcap_rmtauth*auth,pcap_if_t**alldevs,char*errbuf);6WinPcap功能函數(shù)的調(diào)用關(guān)系圖:79.2.2WinPcap應(yīng)用實(shí)例下面給出幾個(gè)實(shí)例,分別是獲取網(wǎng)卡、抓包和發(fā)包程序。(1)獲取網(wǎng)卡信息

通過(guò)獲取適配器列表,并在屏幕上顯示出來(lái),如果沒(méi)有找到適配器,將打印錯(cuò)誤信息。并在程序結(jié)束時(shí)釋放設(shè)備列表。(2)抓包

本程序俘獲局域網(wǎng)內(nèi)UDP報(bào)文。(3)發(fā)包

要在命令行下運(yùn)行,給與參數(shù):網(wǎng)卡描述符。或者添加代碼findalldevs()。9.3

基于sharpCap的抓包程序設(shè)計(jì)8usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSharpPcap;namespacecapExample1{classProgram{staticvoidMain(string[]args){stringver=SharpPcap.Version.VersionString;

Console.WriteLine("SharpPcap{0},capExample1.cs",ver);vardevices=CaptureDeviceList.Instance;//獲取網(wǎng)卡列表

if(devices.Count<1){Console.WriteLine("本機(jī)沒(méi)有網(wǎng)卡");return;}......}}}9.3.1SharpPcap應(yīng)用入門示例用于顯示本地網(wǎng)卡信息。運(yùn)行結(jié)果:9109.3.2常用數(shù)據(jù)結(jié)構(gòu)和函數(shù)PcapDevice類是整個(gè)操作的核心。(1)獲得網(wǎng)絡(luò)設(shè)備一個(gè)系統(tǒng)的網(wǎng)絡(luò)設(shè)備可能不止一個(gè),因而使用了一個(gè)列表類來(lái)保存所有的設(shè)備。這里使用了一個(gè)靜態(tài)方法進(jìn)行操作:PcapDeviceListdevices=SharpPcap.GetAllDevices();11(2)抓包過(guò)程1)打開設(shè)備:device.PcapOpen(true,1000);2)抓包操作:有3種方法:

F1device.PcapStartCapture();

異步方式,調(diào)用之后立即返回。具體抓下來(lái)的包由PcapOnPacketArrival事件處理。需要停止的時(shí)候,調(diào)用device.PcapStopCapture()進(jìn)行關(guān)閉。

F2device.PcapCapture(intpacketCount);半同步方式,調(diào)用后直到抓到packetCount數(shù)量的包才返回。具體抓下來(lái)的包,由PcapOnPacketArrival事件處理。

注意:如果傳入SharpPcap.INFINITE將不退出,永遠(yuǎn)都在接收,且程序就停在這個(gè)語(yǔ)句了。

F3packet=device.PcapGetNextPacket()同步方式,調(diào)用后直接等待收到的下一個(gè)包,并獲得該包。

注意:如果超時(shí),就可能還沒(méi)有獲得包體就退出該過(guò)程。這時(shí)packet=null,所以使用該方法每次都要對(duì)包進(jìn)行檢測(cè)。3)關(guān)閉:device.Close();12(3)包體分析在捕捉到包后,就需要根據(jù)實(shí)際的包進(jìn)行轉(zhuǎn)換了。

if(packetisTCPPacket){TCPPackettcp=(TCPPacket)packet;}由于需要轉(zhuǎn)換的包類型很多,具體都在Tamir.IPLib.Packets里面。應(yīng)該與過(guò)濾機(jī)制配合使用,只對(duì)自己有用的包分析。(4)過(guò)濾機(jī)制包過(guò)濾是抓包程序的必備機(jī)制,要想對(duì)某次捕捉進(jìn)行過(guò)濾,就必須在設(shè)備打開后、開始抓包前設(shè)置設(shè)備的過(guò)濾參數(shù)。

//tcpdumpfiltertocaptureonlyTCP/IPpacketsstringfilter="ipandtcp";//Associatethefilterwiththiscapturedevice.PcapSetFilter(filter);注意的是,filter是一個(gè)文本,遵循了tcpdumpsyntax。13(5)其它功能(1)保存功能SharpPcap還能保存捕獲的包,需要在抓包前設(shè)置Dump的文件。device.PcapDumpOpen(capFile);抓到包后,把需要的包保存起來(lái):device.PcapDump(packet);還可以把包文件當(dāng)作一個(gè)脫機(jī)設(shè)備來(lái)使用:device=SharpPcap.GetPcapOfflineDevice(capFile);然后這個(gè)設(shè)備也可以捕捉包,使用起來(lái)和真實(shí)的一樣(當(dāng)然不會(huì)有超時(shí)了)。(2)對(duì)設(shè)備直接發(fā)包相對(duì)于捕捉包,也可以發(fā)送包。提供了2種方法:1)直接發(fā)送包

device.PcapSendPacket(bytes);2)使用設(shè)備的發(fā)送隊(duì)列device.PcapSendQueue(squeue,true);比較而言,第1種方法容易,第2種方法高效。149.4

基于原始套接字的抓包程序設(shè)計(jì)流式/數(shù)據(jù)包套接字只能提供傳輸層及傳輸層以上的編程服務(wù),而原始套接字可以提供上至應(yīng)用層、下至鏈路層的編程服務(wù)。通過(guò)設(shè)置網(wǎng)卡為混雜模式,原始套接字能夠嗅探當(dāng)前網(wǎng)絡(luò)流經(jīng)本網(wǎng)卡的所有數(shù)據(jù)包。159.4.1設(shè)計(jì)實(shí)例16數(shù)據(jù)過(guò)濾過(guò)濾條件:網(wǎng)絡(luò)協(xié)議:TCP,UDP,ICMP主機(jī)IP主機(jī)端口號(hào)179.4.2關(guān)鍵代碼分析(1)原始套接字調(diào)用publicvoidBindSocket(stringIP)

{

IPAddressipAddress=IPAddress.Parse(IP);

this.socket=newSocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.IP);

try

{

socket.Blocking=false;

socket.Bind(newIPEndPoint(ipAddress,0));

}

catch(ExceptionE)

{

throw(E);

}

}publicvoidSetOption()

{

try

{

socket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.HeaderIncluded,1);

byte[]IN=newbyte[4]{1,0,0,0};

byte[]OUT=newbyte[4];

intret_code=-1;

ret_code=socket.IOControl(SIO_RCVALL,IN,OUT);

ret_code=OUT[0]+OUT[1]+OUT[2]+OUT[3];

}

catch(ExceptionE)

{

throw(E);

}

}(2)接收協(xié)議分析18采用異步套接字方式接收數(shù)據(jù)。一旦數(shù)據(jù)來(lái)到,則執(zhí)行異步回調(diào)函數(shù)CallReceive()。privatevoidBeginReceive()

{

isStop=false;

if(socket!=null)

{

objectstate=null;

state=socket;

socket.BeginReceive(receive_buf_bytes,0,receive_buf_bytes.Length,SocketFlags.None,newAsyncCallback(CallReceive),state);

}

}privatevoidCallReceive(IAsyncResultar)//異步回調(diào)

{

intreceived_bytes=0;

Socketm_socket=(Socket)ar.AsyncState;

if(m_socket!=null)

{

if(isStop==false)

{

received_bytes=socket.EndReceive(ar);

Receive(receive_buf_bytes,received_bytes);

}

if(isStop==false)

{

BeginReceive();

}

}

}19(3)網(wǎng)絡(luò)監(jiān)聽(tīng)privateMyTryRaw[]Sniffers;

publicSnifferService()

{

string[]IPList=GetLocalIPList();

Sniffers=newMyTryRaw[IPList.Length];

for(inti=0;i<IPList.Length;i++)

{

try

{

Sniffers[i]=newMyTryRaw();

Sniffers[i].BindSocket(IPList[i])

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論