代码之家  ›  专栏  ›  技术社区  ›  rbaleksandar

使用scapy更改数据包-编辑数据包的有效负载后自动更新属性(长度、校验和等)

  •  1
  • rbaleksandar  · 技术社区  · 8 年前

    我当前正在修改 pcap 文件(在Linux系统上)使用 scapy 在巨蟒中。我这样做有两个原因:

    • 我需要改变一些包的负载的特定部分,然后重放这些包,以便我正在测试的软件接收更改的数据,以便我观察其行为。
    • 有了一些包(原始负载),当我尝试使用时,会收到“消息太长” tcpreplay 斯卡皮 自己的 sendp(...) . 削减负荷(如果我没有弄错的话)应该可以让我绕过这个问题。

    以下是我所做的一个小例子(我使用 ipython ):

    from scapy.all import rdpcap, wrpcap
    from scapy.utils import sendp
    import re
    
    # Load PCAP file. In my case I have 24 packets
    pkts = rdpcap('dump.pcap')
    
    # Change the load of packet 16 by removing some of the data inside
    pkts[16].load = re.sub(r'<Stop[0-9]+>[0-9]+</Stop[0-9]+>', '', pkts[16].load)
    
    # Write the changes to a new file
    wrpcap('dump_edited.pcap', pkts)
    
    # and send those (the operation requires admin privileges!)
    sendp(pkts) # or use tcpreplay in the terminal
    

    现在的问题是,以这种方式编辑负载意味着与之相关的其他属性将不会得到更新。例如,如果长度以前是 二千九百八十二 (使用) pkts[16].show() 您可以获得包属性的详细概述)在编辑其加载后,长度仍然相同。校验和也不会改变。这当然是意料之中的,因为我所做的只是直接编辑字符串,它显然不会触发任何包属性的更新。

    我刚刚发现 斯卡皮 所以这个问题可能太明显了,但是有没有一种方法可以改变负载,使其属性也自动更新?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Cukic0d    8 年前

    狡猾的避免做没有编码器想要的事情。例如,您必须能够手动为测试指定错误的校验和,而不必对其进行草率的修改。

    一般来说,当一个财产 None 然后scapy自动计算该值。例如,将所有校验和和长度设置为 没有 ,scapy将在构建时根据包为您计算它们。

    如果你不想写,你也可以用

    pkt = Ether(bytes(pkt))
    

    (假设乙醚是最低层),将值设置为“无”后,也会重新计算校验和

    同时也将生成一个数据包 wrpcap(..) , bytes(packet) packet.show2()

    这样可以解决你的问题