系統環境: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下的抓包與解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林站長站網站的支持!
新聞熱點
疑難解答