Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在scapy中使用更改的src/dst从pcap发送数据包_Python_Pcap_Scapy - Fatal编程技术网

Python 在scapy中使用更改的src/dst从pcap发送数据包

Python 在scapy中使用更改的src/dst从pcap发送数据包,python,pcap,scapy,Python,Pcap,Scapy,我正在尝试用scapy发送以前记录的流量(以pcap格式捕获)。目前我被困在剥离原来的乙醚层。流量是在另一台主机上捕获的,我基本上需要更改IP和以太层src和dst。我设法替换了IP层并重新计算校验和,但以太层给我带来了麻烦 是否有人有过从捕获文件重新发送数据包的经验,并对IP和以太层(src和dst)进行了更改?另外,捕获量相当大,有这么多的流量,scapy的性能如何?好吧,有了scapy,我想到了以下几点(很抱歉我的Python)。希望它能帮助别人。有一种可能更简单的方案,将pcap文件中的

我正在尝试用scapy发送以前记录的流量(以pcap格式捕获)。目前我被困在剥离原来的乙醚层。流量是在另一台主机上捕获的,我基本上需要更改IP和以太层src和dst。我设法替换了IP层并重新计算校验和,但以太层给我带来了麻烦


是否有人有过从捕获文件重新发送数据包的经验,并对IP和以太层(src和dst)进行了更改?另外,捕获量相当大,有这么多的流量,scapy的性能如何?

好吧,有了scapy,我想到了以下几点(很抱歉我的Python)。希望它能帮助别人。有一种可能更简单的方案,将pcap文件中的所有数据包读入内存,但这可能会导致大型捕获文件出现问题

从scapy.all导入*
全球src_ip、dst_ip
src_ip=1.1.1.1
dst_ip=2.2.2.2
infle=“dump.pcap”
尝试:
my_reader=PcapReader(内嵌)
my_send(my_reader)
除IOError外:
打印“读取文件%s内容失败”%e
系统出口(1)
def my_发送(rd,计数=100):
pkt_cnt=0
p_out=[]
对于rd中的p:
pkt_cnt+=1
np=p.有效载荷
np[IP].dst=dst_IP
np[IP].src=src\u IP
del np[IP].chksum
p_out.append(np)
如果pkt_cnt%count==0:
发送(包列表(p_out))
p_out=[]
#发送最后一批中的剩余部分
发送(包列表(p_out))
打印“发送的数据包总数%d”%pkt\u cn
检查此示例

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
评论:

  • 使用rdpcap、wrpcap scapy方法读取和写入pcap格式的文件
  • 您可以使用
    sniff(offline=“filename”)
    读取数据包,您可以像这样使用prn参数
    sniff(offline=“filename”,prn=My_函数)
    在这种情况下,My_函数将应用于每个被嗅探的pkt
  • <> LI>编写新IP或MAC的正确方法是将其视为字符串EX:<代码> IP=“1.1.1.1”等等,如上所述。
  • 示例:for循环中包含的sendp方法比使用其他循环发送数据包慢
  • 性能提示:在python中,使用for循环速度太慢,如果您想要像C中的for循环那样的速度
  • 上面使用的rdpcap立即读取文件,如果读取时可用内存为1.5 Gb,而您正在读取2,3,。。Gb文件,它将失败
  • 如果性能问题对您至关重要,您可以使用,但您必须用C编写更复杂的代码;使用python/scapy执行相同的任务非常简单,但并不比c快
  • 这取决于所需的性能级别
  • 如果我的猜测是正确的,那么您发送的是视频流数据包。在这种情况下,如果我发送的是100万像素的视频,我会使用winpcap;在其他情况下,我会使用scapy(每帧较小的大小)
  • 在使用C/winpcap的情况下,您将在读取PCAP、更改数据和重新发送方面获得很好的性能,但您必须注意同样的问题(大文件),您必须创建一个大小合适的缓冲区,以便使用它以相当高的性能读取和发送数据包
  • 如果数据包大小是恒定的(我想这在大多数情况下是很少见的),那么您可能会有一个优势,那就是最大限度地利用可用内存
  • 如果您想在整个“项目/程序”中使用python/scapy,您可以在C/Wincap中创建高性能函数并编译为dll,然后您可以将此dll导入python程序,并在python程序中使用。通过这种方式,您可以获得出色的easy python/Scapy的好处,并且您只需要用c编写特定的函数,这样您就可以更快地完成工作,并使代码具有针对性和可维护性

如果我是你,我会让Scapy处理以太层,并使用
send()
函数。例如:


为了获得正确的校验和,我还需要添加
delp[UDP]。chksum

scapy
是一个很好的工具,但是您必须使用
scapy
来完成这项工作吗?还有其他的解决方案可以为此进行优化……迈克,你可以推荐什么“其他工具”?在我看来,Scapy是完成这项任务的自然选择。Abdurahman,感谢您提供的提示,尤其是关于性能问题的提示!Scapy是一个很好的工具,但可能不适合重交通模拟(至少“开箱即用”)。关于您对使用内置
map
的建议,我不确定这是否会提高性能,假定scapy send/sendp方法接收一个数据包列表作为参数,并且在函数本身内部,它们有一个
for
循环(
\uu gen\u send
函数)。因此,您通过逐个数据包调用
map
而不是直接将数据包列表传递给send/sendp所获得的结果可能会与内部
for
循环一起丢失。对于我来说,我遇到的唯一问题是错误的IP校验和,通过在发送之前添加del p.chksum(p)很容易解决
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)