使用Python實現windows下的抓包與解析,pythonwindows
系統內容:windows7,選擇windows系統是因為我對自己平時日常機器上的流量比較感興趣
python環境:python2.7 ,這裡不選擇python3的原因,是因為接下來要用到的scapy包在python3中安裝較於python2要麻煩得多。如果你習慣於用python3,資料包的分析完全可以放在3下面做,因為抓包和分析是兩個完全獨立的過程。
需要的python包:scapy和dpkt
抓包代碼:
from scapy.sendrecv import snifffrom scapy.utils import wrpcapdpkt = sniff(count = 100) #這裡是針對單網卡的機子,多網卡的可以在參數中指定網卡wrpcap("demo.pcap", dpkt)
你沒看錯,僅僅只需要兩行代碼就可以實現一個簡單的抓包功能。sniff函數負責嗅探資料包,而wrpcap函數將抓取到的資料包儲存起來。
資料包的分析:
import dpktimport socketimport datetimedef printPcap(pcap):try:for timestamp, buf in pcap:eth = dpkt.ethernet.Ethernet(buf) #獲得以太包,即資料連結層包print("ip layer:"+eth.data.__class__.__name__) #以太包的資料既是網路層包print("tcp layer:"+eth.data.data.__class__.__name__) #網路層包的資料既是傳輸層包print("http layer:" + eth.data.data.data.__class__.__name__) #傳輸層包的資料既是應用程式層包print('Timestamp: ',str(datetime.datetime.utcfromtimestamp(timestamp))) #列印出包的抓取時間if not isinstance(eth.data, dpkt.ip.IP):print('Non IP Packet type not supported %s' % eth.data.__class__.__name__)continueip = eth.datado_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_OFFMASKprint('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:passdef main():f =open('demo.pcap','rb')pcap = dpkt.pcap.Reader(f)printPcap(pcap)if __name__ =='__main__':main()
結果顯示:
這是我開啟360的路由器衛士時抓取的資料包。這個軟體在開啟時與路由器通訊,獲得連線路由器的電腦和手機的列表。192.168.1.100是我的機器,192.168.1.1是路由器地址,其中可以看到windows發送的資料包的ttl值預設是128,其他的系統預設是64,與我們的理論常識是相符的。
TCP/IP五層分層的結構和封包過程,附圖二張:
總結
以上所述是小編給大家介紹的使用Python實現windows下的抓包與解析,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對幫客之家網站的支援!