了解Scapy数据结构

时间:2015-05-26 11:06:59

标签: python networking data-structures scapy

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

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

我看过它是一本字典词典,但不是这本词典的字典。

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

这样一切都有意义(除了我没有以太网中的有效载荷,这将是IP之后的所有IP和有效载荷,这将是TCP之后的所有内容)

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

$('tr').on('mouseenter', function(){
    $(this).css({background:'#f00'});
});
$('tr').on('mouseleave', function(){
    $(this).css({background:''});
});

有了这个输出:

#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

希望这是有益的,你可以纠正我的错误。

1 个答案:

答案 0 :(得分:2)

this article阅读:

  

Scapy使用Python字典作为数据包的数据结构。每   packet是嵌套字典的集合,每个层都是一个   上一层的子字典,从最下层构建。   每个字段(例如以太网dst值或ICMP type值)是   相应图层中的键:值对。这些字段(和嵌套的   层)都是可变的,所以我们可以使用它来重新分配它们   赋值运算符。