使用Python實現(xiàn)windows下的抓包與解析
系統(tǒng)環(huán)境:windows7,選擇windows系統(tǒng)是因為我對自己平時日常機器上的流量比較感興趣
python環(huán)境:python2.7 ,這里不選擇python3的原因,是因為接下來要用到的scapy包在python3中安裝較于python2要麻煩得多。如果你習(xí)慣于用python3,數(shù)據(jù)包的分析完全可以放在3下面做,因為抓包和分析是兩個完全獨立的過程。
需要的python包:scapy和dpkt
抓包代碼:
from scapy.sendrecv import sniff
from scapy.utils import wrpcap
dpkt = sniff(count = 100) #這里是針對單網(wǎng)卡的機子,多網(wǎng)卡的可以在參數(shù)中指定網(wǎng)卡
wrpcap("demo.pcap", dpkt)
你沒看錯,僅僅只需要兩行代碼就可以實現(xià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))) #打印出包的抓取時間
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ù)據(jù)包。這個軟件在打開時與路由器通信,獲得連接路由器的電腦和手機的列表。192.168.1.100是我的機器,192.168.1.1是路由器地址,其中可以看到windows發(fā)送的數(shù)據(jù)包的ttl值默認(rèn)是128,其他的系統(tǒng)默認(rèn)是64,與我們的理論常識是相符的。
TCP/IP五層分層的結(jié)構(gòu)和封包過程,附圖二張:

總結(jié)
以上所述是小編給大家介紹的使用Python實現(xiàn)windows下的抓包與解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Python中字符串列表的相互轉(zhuǎn)換實際應(yīng)用場景
在Python編程中,經(jīng)常會遇到需要將字符串列表相互轉(zhuǎn)換的情況,這涉及到將逗號分隔的字符串轉(zhuǎn)換為列表,或者將列表中的元素連接成一個字符串,本文將深入討論這些情景,并提供豐富的示例代碼,幫助讀者更全面地理解字符串列表的轉(zhuǎn)換操作2023-12-12
python用10行代碼實現(xiàn)對黃色圖片的檢測功能
這篇文章主要介紹了python用10行代碼實現(xiàn)對黃色圖片的檢測功能,涉及Python基于圖片庫PIL對圖片的檢測技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
Python Django框架實現(xiàn)應(yīng)用添加logging日志操作示例
這篇文章主要介紹了Python Django框架實現(xiàn)應(yīng)用添加logging日志操作,結(jié)合實例形式分析了Django框架中添加Python內(nèi)建日志模塊相關(guān)操作技巧,需要的朋友可以參考下2019-05-05

