from scapy.all import *
from scapy.utils import rdpcap
pkts=rdpcap("FileName.pcap") # could be used like this rdpcap("filename",500) fetches first 500 pkts
for pkt in pkts:
pkt[Ether].src= new_src_mac # i.e new_src_mac="00:11:22:33:44:55"
pkt[Ether].dst= new_dst_mac
pkt[IP].src= new_src_ip # i.e new_src_ip="255.255.255.255"
pkt[IP].dst= new_dst_ip
sendp(pkt) #sending packet at layer 2
ip_map = {"1.2.3.4": "10.0.0.1", "1.2.3.5": "10.0.0.2"}
for p in PcapReader("filename.cap"):
if IP not in p:
continue
p = p[IP]
# if you want to use a constant map, only let the following line
p.src = "10.0.0.1"
p.dst = "10.0.0.2"
# if you want to use the original src/dst if you don't find it in ip_map
p.src = ip_map.get(p.src, p.src)
p.dst = ip_map.get(p.dst, p.dst)
# if you want to drop the packet if you don't find both src and dst in ip_map
if p.src not in ip_map or p.dst not in ip_map:
continue
p.src = ip_map[p.src]
p.dst = ip_map[p.dst]
# as suggested by @AliA, we need to let Scapy compute the correct checksum
del(p.chksum)
# then send the packet
send(p)
4 回答
检查这个例子
评论:
使用rdpcap,wrpcap scapy方法从pcap格式化文件中读写
你可以使用
sniff(offline="filename")
读取数据包,你可以使用这样的prn参数sniff(offline="filename",prn=My_Function)
在这种情况下My_Functions将应用于每个pkt嗅探编写新ip或mac的正确方法是将其视为字符串ex:
ip="1.1.1.1"
,如上图所示 .在示例中:for循环中包含的sendp方法比发送其他循环发送数据包慢
性能提示:在python中使用for循环太慢使用map而不是如果你想要像C中的for循环这样的速度,Ref
上面使用的rdpcap一次读取文件,如果读取时可用的内存为1.5 Gb而你正在读2,3,... Gb文件则会失败 .
如果性能问题至关重要,可以使用winpcap但是你必须在C中编写更复杂的代码;使用python / scapy执行相同的任务非常简单但是它并不比c快
它取决于在所需性能水平上使用哪一个
如果我的猜测是正确的,你发送视频流数据包,在这种情况下我会使用winpcap如果我发送1百万像素视频或scapy在其他情况下(每帧较小)
如果使用C / winpcap,你将在阅读pcaps并更改数据并重新发送时获得很好的性能,但你必须知道同样的问题(大文件)你必须创建一个具有适当大小的缓冲区来使用它用于读取以相当高的性能发送数据包
如果数据包大小是恒定的(在大多数情况下这是罕见的,我猜)你可能有一个优势,可以充分利用你的可用内存
如果你想使用python / scapy整个"project/program"你可以在C / Wincap中创建高性能函数并编译为dll然后你可以将这个dll导入你的python程序,你可以在python程序中使用它 . 通过这种方式,您可以获得精彩简单的python / Scapy的优势,并且您只需在c中编写特定的功能,这样您就可以更快地完成工作,并且您的代码可以集中精力和可维护
如果我是你,我会让Scapy处理
Ether
图层,并使用send()
函数 . 例如:好吧,有了scapy,我想出了以下内容(抱歉我的Python) . 希望它会帮助某人 . 有一种可能更简单的方案,其中来自pcap文件的所有数据包都被读入内存,但这可能会导致大型捕获文件出现问题 .
为了正确的校验和,我还需要添加
del p[UDP].chksum