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)
原帖链接:https://blog.csdn.net/weixin_39138707/article/details/74612637