了解 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.
你好,我一直在努力研究 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 ICMPtype
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.