scapy基本操作
scapy是一款基于Python强大的数据包处理工具。它可以用来发送各类定制的数据包也可以用于数据包解析。
由于毕业论文需要对数据包进行预处理(数据清洗,数据归一化等),使用scapy进行数据处理。
本文是scapy学习过程中使用到的基本操作总结。安装及验证参考官网即可
参考资源:
官网:https://scapy.net/
官方文档:https://scapy.readthedocs.io/en/latest/index.html
其他:
- 使用scapy向数据包添加以太网填充
- 使用Scapy来填充HTTP数据包
- 从scapy中获取PCAP文件中的IP地址
- python数据包之利器scapy用法!
- Windows下使用scapy+python2.7实现对pcap文件的读写操作
- Scapy中文使用文档
基本使用
import scapy
from scapy.all import *
读取数据包以及包数据打印
from scapy.all import *
infile = "pkts.pcapng"
pkts = rdpcap(infile)
pkt = pkts[0] # 取所有数据包中第一个数据包
pkt.show() # 打印数据包信息
hexdump(pkt) # 打印十六进制数据pktraw = raw(pkt) # 将数据包转换成二进制字符串
print(pktraw) # 打印二进制字符串
判断数据包是 ARP or IP or OTHERS 数据包
- 使用
haslayer()
函数:
from scapy.all import *inflie = "pkts.pcapng"
pkts = rdpcap(inflie) # 打开pcap文件
pkt = pkts[0]
if pkt.haslayer(ARP):print("ARP")
elif pkt.haslayer('IP'): # 引号可以和上面一样不加print("IP")
else:print("OTHERS")
- 使用
in
操作:
from scapy.all import *inflie = "pkts.pcapng"
pkts = rdpcap(inflie) # 打开pcap文件
pkt = pkts[0]
if 'ARP' in pkt: # 引号可以和上面一样不加print("ARP")
elif IP in pkt:print("IP")
else:print("OTHERS")
使用.show()打印IP数据包
from scapy.all import *inflie = "pkts.pcapng"
pkts = rdpcap(inflie) # 打开pcap文件
for pkt in pkts: # 遍历文件中的packetif pkt.haslayer(IP):pkt.show()
打印结果:
打印IP数据包的IP
from scapy.all import *inflie = "pkts.pcapng"
pkts = rdpcap(inflie) # 打开pcap文件
for pkt in pkts: # 遍历文件中的packetif pkt.haslayer(IP):print("src : ", pkt[IP].fields['src']) # fields 根据打印出的IP数据包(上图)中的“key”进行填写即可print("dst : ", pkt[IP].fields['dst'])
将pcap文件中的IP数据包提取出来,存到一个新的文件
from scapy.all import *
import osinfliestr = "pkts.pcapng"
outfilestr = "out.pcapng"outfile = PcapWriter(outfilestr, append=True, sync=True) # 新的pcap文件pkts = rdpcap(infliestr) # 打开原始pcap文件
i = 0
for pkt in pkts: # 遍历文件中的packetif IP in pkt:outfile.write(pkt)i += 1
print("ip nums : ", i)
outfile.flush()
outfile.close()