了解 Scapy 数据结构

Understanding Scapy data structure

你好,我一直在努力研究 Scapy 数据结构,我的意思是,数据包的存储方式和访问方式。

因此,我不想仅仅使用 sintax 并依赖它,而是想做一些研究,以便更好地了解并熟悉其背后的内容。

我看到它是字典的字典,但不是这个字典是由什么组成的。

我遇到了我认为背后的结构,如果我错了,我希望你能纠正我,但我认为这是有道理的:一个对象字典,其中每个对象都是一个 TCP/IP层。

这样一切都有意义(除了我没有 Ether 中的有效载荷,它会在 IP 之后和 IP 中的有效载荷,这将是 TCP 之后的一切)

无论如何,我认为这将有助于阐明 scapy 结构, 虽然我知道它不是 100% 准确:

#Scapy

class Ether:

    def __init__(self,dst='ff:ff:ff:ff:ff:ff',src='00:00:00:00:00:00',type=0):

        self.dst=dst
        self.src=src
        self.type=type



class IP:

    def __init__(self,version=4,ihl=None,tos=0,leng=None,idd=1
                 ,flags=None,frag=0,ttl=64,proto=06,chksum=None,src='127.0.0.1',dst='127.0.0.1'):


        self.version = version
        self.ihl = ihl
        self.tos = tos
        self.leng = leng
        self.idd = idd
        self.flags = flags
        self.frag = frag
        self.ttl = ttl
        self.proto = proto
        self.chksum = chksum
        self.src = src
        self.dst = dst



class TCP:

    def __init__(self,sport=21,dport=80,seq=0,ack=0,dataofs=None,reserved=0
                 ,flags=0,window=8192,chksum=None,urgptr=0,options=0,payload=''):

        self.sport=sport;
        self.dport=dport;
        self.seq=seq
        self.ack=ack
        self.dataofs=dataofs
        self.reserved=reserved
        self.flags=flags
        self.window=window
        self.chksum=chksum
        self.urgptr=urgptr
        self.options=options
        self.payload=payload



pkt1 = {'Ether':Ether(src='ff:aa:bb:aa:dd:aa'),'IP':IP(src='192.168.1.10',dst='192.168.1.1')}

pkt2 = {'IP':IP(dst='8.8.8.8'),'TCP':TCP(dport=80)}

print pkt1['IP'].src

pkts = []

pkts.append(pkt1)

pkts.append(pkt2)

for pkt in pkts:

    print pkt['IP'].dst

print pkts[0]['Ether'].src

有这个输出:

GET / HTTP/1.1

192.168.1.1
8.8.8.8
ff:aa:bb:aa:dd:aa

希望这对您有所启发,您可以纠正我的错误。

正在阅读 this article

Scapy uses Python dictionaries as the data structure for packets. Each packet is a collection of nested dictionaries with each layer being a child dictionary of the previous layer, built from the lowest layer up. Each field (such as the Ethernet dst value or ICMP type value) is a key:value pair in the appropriate layer. These fields (and nested layers) are all mutable so we can reassign them in place using the assignment operator.