使用Python實(shí)現(xiàn)windows下的抓包與解析
系統(tǒng)環(huán)境:windows7,選擇windows系統(tǒng)是因?yàn)槲覍?duì)自己平時(shí)日常機(jī)器上的流量比較感興趣
python環(huán)境:python2.7 ,這里不選擇python3的原因,是因?yàn)榻酉聛硪玫降膕capy包在python3中安裝較于python2要麻煩得多。如果你習(xí)慣于用python3,數(shù)據(jù)包的分析完全可以放在3下面做,因?yàn)樽グ头治鍪莾蓚€(gè)完全獨(dú)立的過程。
需要的python包:scapy和dpkt
抓包代碼:
from scapy.sendrecv import sniff from scapy.utils import wrpcap dpkt = sniff(count = 100) #這里是針對(duì)單網(wǎng)卡的機(jī)子,多網(wǎng)卡的可以在參數(shù)中指定網(wǎng)卡 wrpcap("demo.pcap", dpkt)
你沒看錯(cuò),僅僅只需要兩行代碼就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的抓包功能。sniff函數(shù)負(fù)責(zé)嗅探數(shù)據(jù)包,而wrpcap函數(shù)將抓取到的數(shù)據(jù)包保存起來。
數(shù)據(jù)包的分析:
import dpkt import socket import datetime def printPcap(pcap): try: for timestamp, buf in pcap: eth = dpkt.ethernet.Ethernet(buf) #獲得以太包,即數(shù)據(jù)鏈路層包 print("ip layer:"+eth.data.__class__.__name__) #以太包的數(shù)據(jù)既是網(wǎng)絡(luò)層包 print("tcp layer:"+eth.data.data.__class__.__name__) #網(wǎng)絡(luò)層包的數(shù)據(jù)既是傳輸層包 print("http layer:" + eth.data.data.data.__class__.__name__) #傳輸層包的數(shù)據(jù)既是應(yīng)用層包 print('Timestamp: ',str(datetime.datetime.utcfromtimestamp(timestamp))) #打印出包的抓取時(shí)間 if not isinstance(eth.data, dpkt.ip.IP): print('Non IP Packet type not supported %s' % eth.data.__class__.__name__) continue ip = eth.data do_not_fragment =bool(ip.off & dpkt.ip.IP_DF) more_fragments =bool(ip.off & dpkt.ip.IP_MF) fragment_offset = ip.off & dpkt.ip.IP_OFFMASK print('IP: %s -> %s (len=%d ttl=%d DF=%d MF=%d offset=%d)' % (socket.inet_ntoa(ip.src), socket.inet_ntoa(ip.dst), ip.len, ip.ttl, do_not_fragment, more_fragments,fragment_offset)) except: pass def main(): f =open('demo.pcap','rb') pcap = dpkt.pcap.Reader(f) printPcap(pcap) if __name__ =='__main__': main()
結(jié)果顯示:
這是我打開360的路由器衛(wèi)士時(shí)抓取的數(shù)據(jù)包。這個(gè)軟件在打開時(shí)與路由器通信,獲得連接路由器的電腦和手機(jī)的列表。192.168.1.100是我的機(jī)器,192.168.1.1是路由器地址,其中可以看到windows發(fā)送的數(shù)據(jù)包的ttl值默認(rèn)是128,其他的系統(tǒng)默認(rèn)是64,與我們的理論常識(shí)是相符的。
TCP/IP五層分層的結(jié)構(gòu)和封包過程,附圖二張:
總結(jié)
以上所述是小編給大家介紹的使用Python實(shí)現(xiàn)windows下的抓包與解析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Python中使用ConfigParser解析ini配置文件實(shí)例
這篇文章主要介紹了Python中使用ConfigParser解析ini配置文件實(shí)例,本文給出了創(chuàng)建和讀取ini文件的例子,需要的朋友可以參考下2014-08-08django2用iframe標(biāo)簽完成網(wǎng)頁內(nèi)嵌播放b站視頻功能
這篇文章主要介紹了django2 用iframe標(biāo)簽完成 網(wǎng)頁內(nèi)嵌播放b站視頻功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06pandas重復(fù)行刪除操作df.drop_duplicates和df.duplicated的區(qū)別
本文主要介紹了pandas重復(fù)行刪除操作df.drop_duplicates和df.duplicated的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Python基礎(chǔ)教程之控制結(jié)構(gòu)詳解
Python中有三大控制結(jié)構(gòu),分別是順序結(jié)構(gòu)、分支結(jié)構(gòu)(選擇結(jié)構(gòu))以及循環(huán)結(jié)構(gòu),任何一個(gè)項(xiàng)目或者算法都可以使用這三種結(jié)構(gòu)來設(shè)計(jì)完成,這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之控制結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2021-11-11python中exec函數(shù)的實(shí)現(xiàn)
exec()是Python內(nèi)置的一個(gè)函數(shù),用于在運(yùn)行時(shí)執(zhí)行動(dòng)態(tài)生成的Python代碼,下面就來介紹一下python中exec函數(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Python TCP接收數(shù)據(jù)不全的問題解決
本文主要介紹了Python TCP接收數(shù)據(jù)不全的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07