代码之家  ›  专栏  ›  技术社区  ›  Helmut Grohne

如何腌制一个小包?

  •  12
  • Helmut Grohne  · 技术社区  · 15 年前

    我要泡菜 scapy 小包裹。大多数时候这是可行的,但有时候pickler会抱怨函数对象。根据经验法则:ARP包泡菜很好。某些UDP数据包存在问题。

    6 回复  |  直到 10 年前
        1
  •  7
  •   Helmut Grohne    10 年前

    我的解决方案(受欺诈邮件列表的启发)如下:

    class PicklablePacket:
        """A container for scapy packets that can be pickled (in contrast
        to scapy packets themselves)."""
        def __init__(self, pkt):
            self.contents = bytes(pkt)
            self.time = pkt.time
    
        def __call__(self):
            """Get the original scapy packet."""
            pkt = scapy.Ether(self.contents)
            pkt.time = self.time
            return pkt
    

    任何我想通过的地方 scapy Packet 通过A Queue 我只是把它包在 PicklablePacket __call__ 之后。我不知道不以这种方式保留的数据。然而,这种方法只适用于 Ethernet 小包。(所有在常规网卡(而不是WLAN)上嗅到的数据包都是以太网)它也可以扩展到其他类型。

        2
  •  4
  •   Paul Rubel    15 年前

    如果“pickle”是指常规序列化,则可以始终使用PCAP导入/导出方法: rdpcap and wrpcap .

    wrpcap("pkt.pcap",pkt)
    pkt = rdpcap("pkt.pcap")
    

    或者您可以启动您的进程并在另一个进程中获取数据包。如果您可以匹配某些模式,则假设已知端口或源IP tcpdump可以工作:

    tcpdump -i eth0 -w FOO.pcap host 172.20.33.12 and \(udp or arp\)
    

    然后,您可以按如下方式读取生成的PCAP:

    pkts = rdpcap('FOO.pcap')
    
        3
  •  3
  •   Gregg Lind    15 年前

    (这更多是供参考,因此不需要投票)

    scapy list scapy.ml@secdev.org得到了很好的监控,并具有很强的响应性。如果你在这里得不到答案,也试试那里。

        4
  •  1
  •   Community Mohan Dere    9 年前

    受此启发 question 一个人可以使用 dill 图书馆(或其他如Spickle等-见 pypi search pickle )保存伪造的数据包。例如,使用 sudo easy_install dill sudo pip install dill . 下面是一个基本的使用场景:

    import dill as pickle
    # E.g. Dump an array of packets stored in variable mypackets to a file
    pickle.dump(mypackets, open('mypackets.dill-pickle', 'w'))
    # Restore them from the file
    mypackets = pickle.load(open('mypackets.dill-pickle', 'rb'))
    

    当然,也可以使用scapy的本机函数将数据包转储到PCAP文件(tcpdump/wireshark等可以读取),如果一个数据包只有一个数组:

    wrpcap("packets_array.pcap",packets_array)
    
        5
  •  0
  •   piro    15 年前

    你可以把 Packet 分类并注入 __getstate__ __setstate__ 方法将对象中的函数从可选取表示形式转换为可选取表示形式。见 here 有关详细信息。

    def packet_getstate(self):
        # todo
    
    def packet_setstate(self, state):
        # todo
    
    from scapy.packet import Packet
    Packet.__getstate__ = packet_getstate
    Packet.__setstate__ = packet_setstate
    
        6
  •  0
  •   Hephestos    10 年前

    要使picklabepacket类与scapy 3.0.0一起使用,可以使用以下类定义:

    class PicklablePacket:
    """A container for scapy packets that can be pickled (in contrast
    to scapy packets themselves).
    This works for python 3.5.1 and scapy 3.0.0 """
    
    def __init__(self, pkt):
        self.__contents = pkt.__bytes__()
        self.__time = pkt.time
    
    def __call__(self):
        """Get the original scapy packet."""
        pkt = scapy.all.Ether(self.__contents)
        pkt.time = self.__time
        return pkt