美文网首页Python
Python学习:scapy库的Packet与str相互转换

Python学习:scapy库的Packet与str相互转换

作者: khaos | 来源:发表于2021-08-08 18:59 被阅读0次

    1.问题

    python的scapy库,是构造TCP/IP报文的利器,并且支持asn.1,搞过电路交换协议的人一定会明白基于asn.1协议的描述复杂度。

    使用中遇到的一个比较麻烦的问题,scapy抓到的Packet如何在网络中传输,如何在使用端还原到Packet类型。

    2.方案

    2.1.Packet转换为str

    Packet转换为str很简单,直接上代码:

    from scapy.all import *
    
    pkts = sniff('eth1', count=1, timeout=5)
    pkts[0].show()
    pkt_str = str(raw(pkts[0]))
    print(pkt_str)
    

    2.2.str转换为Packet

    str转换为Packet看上去不那么容易,遇到过两个问题:

    • 还原到Packet类型,需要bytesstr转换为bytes一直没有试成功;
    • 还原到Packet类型,调用show方法,没有解析出席完整的报文结构;

    对于问题1的方法:

    from scapy.all import *
    
    pkts = sniff('eth1', count=1, timeout=5)
    pkts[0].show()
    pkt_str = str(raw(pkts[0]))
    print(pkt_str)
    pkt_bytes = eval(pkt_str)
    print(pkt_bytes)
    

    利用eval方法,str转换到bytes很容易,不需要对str的编码格式设置,比较方便。

    对于问题2的方法:

    from scapy.all import *
    
    pkts = sniff('eth1', count=1, timeout=5)
    pkts[0].show()
    pkt_str = str(raw(pkts[0]))
    print(pkt_str)
    pkt_bytes = eval(pkt_str)
    pkt_old = Ether(pkt_bytes)
    pkt_old.show()
    

    scapy解析报文的时候,需要指定第一层什么时候结构,不然无法进行完整的解析,不明白sniff的原理,如果知道报文是以太网结构,直接使用类型Ether构造报文Packet,再调用show方法就能完整的解析了。

    解决了上述两个问题,就可以方便在网络中传输scapyPacket结构。

    3.讨论

    既然使用scapy是网络方面的库,系统往往不是单一进程就能完成的,会涉及到网络传输,Packetstr相互转换的问题解决了,就离正式的方案不远了。本文讨论的方法,网上还是比较难找到一个完整的方法,所以贴上来供大家学习使用。

    上述的方法,还有一个问题使用sniff抓到的包,如何确定首层是什么报文呢?这里再附送一个方法,把Packet转换成json格式,这样就容易判断了,代码如下:

    def packet2json(pkt: Packet):
        js = dict()
        for key in pkt.fields.keys():
            js[key] = str(pkt.fields[key])
    
        if isinstance(pkt.payload, NoPayload):
            return js
        js[pkt.payload.name] = packet2json(pkt.payload)
        return js
    

    enjoy!!!

    相关文章

      网友评论

        本文标题:Python学习:scapy库的Packet与str相互转换

        本文链接:https://www.haomeiwen.com/subject/xkvovltx.html