1. 程式人生 > >python+pypcap+dpkt抓取IP資料包

python+pypcap+dpkt抓取IP資料包

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)