2016-07-23 29 views
1

Ich schreibe ein Python-Skript, wo ich bestimmte Felder aus bestimmten Schichten von Paketen auswählen muss. packet.show() produziert:Scapy zeigt nicht alle Felder im Paket

###[ Padding ]### 
load  = '\x00\x00\x00\x00\x00\x00' 
None 
###[ Ethernet ]### 
    dst  = 00:0e:8c:f5:12:af 
    src  = 28:63:36:4b:c1:f0 
    type  = 0x800 
###[ IP ]### 
    version = 4L 
    ihl  = 5L 
    tos  = 0x0 
    len  = 167 
    id  = 52667 
    flags  = 
    frag  = 0L 
    ttl  = 30 
    proto  = tcp 
    chksum = 0x487c 
    src  = 192.168.2.100 
    dst  = 192.168.2.101 
    \options \ 
###[ TCP ]### 
     sport  = 49898 
     dport  = iso_tsap 
     seq  = 4514968 
     ack  = 11714804 
     dataofs = 5L 
     reserved = 0L 
     flags  = PA 
     window = 8192 
     chksum = 0x8bdf 
     urgptr = 0 
     options = [] 
###[ TPKT ]### 
      vrsn  = 3 
      reserved = 0 
      length = 127 
###[ ISO8073 Data ]### 
       li  = 2 
       code  = 0xfL 
       roa  = 0x0L 
       tpdu_no = 128 
###[ S7CommPacketRequest ]### 
       unknown = 0x32 
       type  = 1 
       reserved = 0 
       seq_no = 401 
       param_length= 110 
       data_length= 0 
       \param  \ 
        |###[ Raw ]### 
        | load  = '\x04\t\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00\x02\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00Q\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00P\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00S\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00U\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00R\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00T\x12\n\x10\x01\x00\x01\x00\x01\x84\x00\x00\x01\x12\n\x10\x08\x00\x01\x00\x01\x84\x00\x00\x10' 

Die Sache ist, dass ich bestimmte Daten von der Ethernet-Schicht benötigen, die von scapy nicht erfasst werden (zB der Opcode in Wireshark auf Ethernet-Ebene gezeigt)

Wireshark capture of packet at Ethernet layer

Does Wer weiß, wie man auf solche Felder zugreifen kann? (damit sie angezeigt werden?)

Antwort

0

Die opcode, auf die Sie sich beziehen, befindet sich nicht in der Ethernet-Schicht, sondern ist eine ARP-spezifische Option.

Zum Beispiel kann scapy kodieren und ARP-Pakete entschlüsseln, wenn sie empfangen sind:

send(Ether(dst=clientMAC)/ARP(op="who-has", psrc=gateway, pdst=client), 
    inter=RandNum(10,40), loop=1) 

Beachten Sie, dass die ARP-Schicht-Sites über die Etherschicht und hat die op Option, die Sie für

suchen sind
0

Ich erkannte, dass Opcode in ARP ist.

Etwas, das hier wichtig ist, ist, dass die Haslayer-Funktion nur verwendet werden sollte, wenn der Layer, nach dem Sie "suchen" möchten, nicht in allen Paketen (wie ARP) gekapselt ist. Ein Beispiel dafür ist:

for packet in allPackets: 
    if packet.haslayer("ARP"): 
     opCode=int(indPacket["ARP"].op)