2012-01-04 7 views
11

के साथ पीपीपीओई टैग पार्सिंग मैं स्कैपी के साथ पीपीपीओई डिस्कवरी पैकेट को सही ढंग से विच्छेदन करने की कोशिश कर रहा हूं। यहां बताया गया है कि स्कैपी उदाहरण कैसे दिखाता है PADI पैकेट:स्कैपी

>>> p = Ether("\xff\xff\xff\xff\xff\xff\x08\x00'\xf3<5\x88c\x11\t\x00\x00\x00\x0c\x01\x01\x00\x00\x01\x03\x00\x04\xe0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") 
>>> p.show() 
###[ Ethernet ]### 
    dst= ff:ff:ff:ff:ff:ff 
    src= 08:00:27:f3:3c:35 
    type= 0x8863 
###[ PPP over Ethernet Discovery ]### 
    version= 1L 
    type= 1L 
    code= PADI 
    sessionid= 0x0 
    len= 12 
###[ Raw ]### 
     load= '\x01\x01\x00\x00\x01\x03\x00\x04\xe0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 

मैं उस कच्चे पेलोड को पार्स करना चाहता हूं। यह पेलोड सिर्फ एक सूची पीपीपीओई टैग है। प्रत्येक टैग में दो बाइट कोड फ़ील्ड, दो बाइट लंबाई फ़ील्ड और एक मान होता है (यह निश्चित रूप से पिछले फ़ील्ड द्वारा दी गई लंबाई है)।

from scapy.all import * 

class PPPoETag(Packet): 
    name = "PPPoE Tag" 
    fields_desc = [ ShortEnumField('tag_type', None, 
            {0x0000: 'End-Of-List', 
            0x0101: 'Service-Name', 
            0x0102: 'AC-Name', 
            0x0103: 'Host-Uniq', 
            0x0104: 'AC-Cookie', 
            0x0105: 'Vendor-Specific', 
            0x0110: 'Relay-Session-Id', 
            0x0201: 'Service-Name-Error', 
            0x0202: 'AC-System-Error', 
            0x0203: 'Generic-Error'}), 
        FieldLenField('tag_len', None, length_of='tag_value', fmt='H'), 
        StrLenField('tag_value', '', length_from=lambda pkt:pkt.tag_len)] 
    def extract_padding(self, s): 
     return '', s 

class PPPoED_Tags(Packet): 
    name = "PPPoE Tag List" 
    fields_desc = [ PacketListField('tag_list', None, PPPoETag) ] 

bind_layers(PPPoED, PPPoED_Tags, type=1) 

नहीं काफी यकीन है कि अगर यह सही है और सबसे अच्छा तरीका है:

यह इस सब का प्रतिनिधित्व करने पर मेरे प्रयास है। सुधार पर कोई सलाह?

+1

वास्तव में एक जवाब के रूप में इस प्रदान करने के बाद से यह नहीं करता है के लायक नहीं विशेष रूप से स्कैपी पर लागू नहीं होता है, लेकिन डीपीकेटी का थोड़ा अलग दृष्टिकोण है जो आपको कुछ विचार दे सकता है .. http://code.google.com/p/dpkt/source/browse/trunk/dpkt/pppoe.py – synthesizerpatel

+1

क्या हैं आप सामान्य सलाह मांग रहे हैं या क्या आपके पास एक विशिष्ट सवाल है? – Moshe

+0

@ मोशे: मेरा विशिष्ट सवाल यह था कि स्पीपी के साथ पीपीपीओई टैग को सही ढंग से कैसे पार्स किया जाए। लेकिन अंत में मैंने पीपीपीओई पैकेट से मैन्युअल रूप से किसी भी पुस्तकालय के बिना सभी जानकारी को पार्स करने के लिए स्विच किया है, क्योंकि यह बहुत आसान साबित हुआ है। – thor

उत्तर

-1

इसी तरह के निम्न स्तर की समस्या के लिए अपने कोड में (एसओटी, ईओटी, न्यूल, बेल, इत्यादि जैसे एएससीआईआईआई नियंत्रण कोड आधारित सूचना डेलीमीटर जैसे सीरियल पोर्ट प्रोटोकॉल की कच्ची धारा को पार्स करना) मैंने रेगेक्स और मानक का एक सेट इस्तेमाल किया तुलनाकारक। दूसरों द्वारा समझ के लिए कोड में संरचना करना आसान था, और प्रीकंपिल्ड रेगेक्स का उपयोग करके भी बहुत तेज़ था।

& बैठे बिना सटीक पायथन को कोडिंग के बिना, अगर मैं किसी भी गैर सिस्टम निर्भरताओं को जोड़ने के बिना फ़ील्ड प्राप्त करना चाहता था, तो आईडी इस छद्म कोड की तरह लगभग कुछ उपयोग करता है।

Start Loop over packet content. 
     Match any Tag 
      Match specific tag type 
       set array index based on tag type 
      extract length of value 
      extract tag value 
      store value in array at the index set above 
      slice off all the entire now matched & extracted tag. 
     Loop until end no more tags match. 
    End of loop 
+0

यह उतना ही कम है जितना मैंने अंत में किया। वैसे भी, इस सवाल को बंद करने के लिए अपना जवाब स्वीकार कर रहे हैं। – thor

+0

अब, ऐसा कुछ है जो आप हर दिन नहीं देखते - नकारात्मक स्कोर के साथ एक स्वीकृत उत्तर – Mawg

1

मैं इस बजाय करना होगा, बस Scapy के Dot11Elt कार्यान्वयन के साथ की तरह (प्लस इसे सही ढंग से पैडिंग के रूप में End-Of-List टैग के बाद बाइट्स समझता है):

class PPPoE_Tag(Packet): 
    name = "PPPoE Tag" 
    fields_desc = [ ShortEnumField('tag_type', None, 
            {0x0000: 'End-Of-List', 
            0x0101: 'Service-Name', 
            0x0102: 'AC-Name', 
            0x0103: 'Host-Uniq', 
            0x0104: 'AC-Cookie', 
            0x0105: 'Vendor-Specific', 
            0x0110: 'Relay-Session-Id', 
            0x0201: 'Service-Name-Error', 
            0x0202: 'AC-System-Error', 
            0x0203: 'Generic-Error'}), 
        FieldLenField('tag_len', None, length_of='tag_value', fmt='H'), 
        StrLenField('tag_value', '', length_from=lambda pkt:pkt.tag_len)] 

bind_layers(PPPoED, PPPoE_Tag, type=1) 
bind_layers(PPPoE_Tag, Padding, tag_type=0) 
bind_layers(PPPoE_Tag, PPPoE_Tag) 
संबंधित मुद्दे