Skip to content

Instantly share code, notes, and snippets.

@syakesaba
Last active October 2, 2016 15:37
Show Gist options
  • Select an option

  • Save syakesaba/20707ab6b8f47d3e258b511ee3e9c774 to your computer and use it in GitHub Desktop.

Select an option

Save syakesaba/20707ab6b8f47d3e258b511ee3e9c774 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# encoding: utf-8
from scapy.packet import Packet
import json
class JsonPacket(Packet):
name = "JsonPacket"
fields_desc = []
json_valid_types = (dict,list,unicode,str,int,long,float,bool,None)
#Override
def build_done(self,pkt):
return json.dumps(self._jsonize_packet(pkt), indent=4)
def _jsonize_packet(self, pkt):
layers = [layer for layer in self._walk_layers(pkt)]
out = []
for layer in layers:
layer_name = layer.name if layer.name else layer.__name__
out.append({layer_name:self._serialize_fields(layer,{})})
return out
def _walk_layers(self, pkt):
i=1
layer = self.getlayer(i)
while layer:
yield layer
i += 1
layer = self.getlayer(i)
def _serialize_fields(self, layer, serialized_fields={}):
if hasattr(layer, "fields_desc"):
for field in layer.fields_desc:
self._extract_fields(layer, field, serialized_fields)
return serialized_fields
def _extract_fields(self, layer, field, extracted={}):
value = layer.__getattr__(field.name)
if type(value) in self.json_valid_types:
extracted.update({field.name:value})
else:
local_serialized = {}
extracted.update({field.name:local_serialized})
self._serialize_fields(field, local_serialized)
if __name__ == "__main__":
from scapy.main import interact
from scapy.all import *
x = JsonPacket()/Ether()/IP()/TCP()/Raw("ABC")
print x
interact(mydict=locals())
###
$ ./jsonize.py
[
{
"Ethernet": {
"src": "00:00:00:00:00:00",
"dst": "ff:ff:ff:ff:ff:ff",
"type": 2048
}
},
{
"IP": {
"frag": 0,
"src": "127.0.0.1",
"proto": 6,
"tos": 0,
"dst": "127.0.0.1",
"chksum": {},
"len": {},
"options": [],
"version": 4,
"flags": 0,
"ihl": {},
"ttl": 64,
"id": 1
}
},
{
"TCP": {
"reserved": 0,
"seq": 0,
"ack": 0,
"dataofs": {},
"urgptr": 0,
"window": 8192,
"flags": 2,
"chksum": {},
"dport": 80,
"sport": 20,
"options": {}
}
},
{
"Raw": {
"load": "ABC"
}
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment