python+pypcap+dpkt抓取IP資料包
阿新 • • 發佈:2019-02-17
1.簡介
pypcap庫是一款基於libpcap封裝的為python語言提供介面的抓包庫。
dpkt則是用來解析資料包的庫。
pip install pypcap
pip install dpkt
2.
#coding:utf-8
import pcap
import dpkt
import time
import math
import os
sniffer = pcap.pacp(name=None,promisc=True,immediate=True) #嗅探器,可以沒有引數,沒用,sniffer一直在抓包並把資料來源源不斷存入記憶體
#一個個解包,迴圈
for timestamp,raw_buf in sniffer: #timestamp時間戳,raw_buf包中的原始資料
output1 = {}
output2 = {}
output3 = {}
output4 = {}
eth = dpkt.ethernet.Ethernet(raw_buf) #dpkt.ethernet.ethernet()是利用dpkt庫解包的方法。這句話的含義是解析乙太網幀(即第一次剝離),可以得到源mac地址、目的mac地址等內容。
#判斷這個包是不是IP資料報
if not isinstance(eth.data,dpkt.ip.IP):
print 'Non IP Packet type not supported %s\n' % eth.data._class_._name_
continue
#Grab ip packet
packet = eth.data. #讓乙太網幀的ip資料報部分等於一個新的物件,packet
#取出分片資訊
df = bool(packet.off & dpkt.ip.IP_DF)
mf = bool(packet.off & dpkt.ip.IP_MF)
offset = packet.off & dpkt.ip.IP_OFFMASK
output1 = {'time':time,strftime("%Y -%m-%d %H:%M:%S",(time.localtime(timestamp)))}. #直接輸出timestamp,造成的問題便是輸出的是一串秒數。這裡使用一個time.localtime()函式進行轉換,再用time.strftime格式化成固定字串進行輸出
output2 = {'src':'%d.%d.%d.%d'%tuple(map(ord,list(packet.src))),'dst':'%d.%d.%d.%d'%tuple(map(ord,list(packet.dst)))}. #直接輸出packet.src和packet.dst,那麼我們得到的將會是一串/0x16/x98/0xaf 這樣的亂碼
#python的編碼問題。這裡使用了一個語句,'%d.%d.%d.%d'%tuple(map(ord,list(packet.src))) 來對packet.src進行轉換。%後面那串的大意就是將packet.src轉換為list列表,然後使用ord方法返回字元在ASCII碼中對應整數,再將這串整數轉化為一個元組,'%d.%d.%d.%d'% 的意思是將後面的元組按單引號中的格式輸出
output3 = {'protocol':packet.p.'len':packet.len,'ttl':packet.ttl}
output4 = {'df':df,'mf':mf,'offset':offset,'checksum':packet.sum}
print (output1)
print (output2)
print (output3)
print (output4)