Skip to content

Commit b21d0ca

Browse files
committed
initial commit
0 parents  commit b21d0ca

File tree

11 files changed

+183
-0
lines changed

11 files changed

+183
-0
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Universal Header Decoder
2+
=================
3+
4+

hdec.py

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
import sys
2+
import bitstring # sudo pip install bitstring
3+
from bitstring import BitStream, Bits
4+
import struct
5+
6+
class Field:
7+
def __init__(self, name, bits, types, prefix = ""):
8+
self.name = name
9+
self.bits = bits
10+
self.types = types
11+
self.prefix = prefix
12+
13+
def __repr__(self):
14+
return self.name + " (" + str(self.bits) + ")"
15+
16+
def getBits(self):
17+
return self.bits
18+
19+
def getName(self):
20+
return self.name
21+
22+
def getTypes(self):
23+
t = []
24+
for ty in self.types:
25+
if ty[-1] == 'E':
26+
t.append((ty[:-1], True))
27+
else:
28+
t.append((ty, False))
29+
return t
30+
31+
def getPrefix(self):
32+
return self.prefix
33+
34+
35+
def parseDefinition(definition, bits = []):
36+
with open(definition) as df:
37+
d = df.readlines()
38+
for l in d:
39+
p = l.split(":")
40+
if len(p) == 2:
41+
bits.append(Field(p[0].strip(), (p[1].strip()), ["hex", "int", "bin"], definition))
42+
elif len(p) == 3:
43+
types = list(map(lambda x: x.strip(), p[2].strip().split(",")))
44+
bits.append(Field(p[0].strip(), (p[1].strip()), types, definition))
45+
return bits
46+
47+
def endianness(x, endian, bits):
48+
if endian:
49+
if bits == 32:
50+
return (((x << 24) & 0xFF000000) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | ((x >> 24) & 0x000000FF))
51+
elif bits == 16:
52+
return (((x << 8) & 0xFF00) | ((x >> 8) & 0x00FF))
53+
else:
54+
return x
55+
else:
56+
return x
57+
58+
def main(argv):
59+
if len(argv) < 4:
60+
print("Usage: " + argv[0] + " <header dump> <type (hex|bin|raw)> <definition>")
61+
return
62+
63+
filename = argv[1]
64+
typ = argv[2]
65+
definition = []
66+
for argc in range(3, len(argv)):
67+
definition.append(argv[argc])
68+
69+
print("File: " + filename)
70+
print("Definition: " + ", ".join(definition))
71+
print("Type: " + typ)
72+
73+
bits = []
74+
for d in definition:
75+
bits = parseDefinition(d, bits)
76+
77+
content = None
78+
field = None
79+
with open(filename) as f:
80+
if typ == "hex":
81+
content = f.read().strip()
82+
field = BitStream("0x" + content)
83+
84+
if typ == "bin":
85+
content = f.read().strip()
86+
field = BitStream("0b" + content)
87+
88+
if typ == "raw":
89+
field = BitStream(f)
90+
91+
parsed = {}
92+
pos = 0
93+
last_header = None
94+
for bit in bits:
95+
field.pos = pos
96+
97+
bitlen = 0
98+
lenexpr = bit.getBits()
99+
for p in parsed.keys():
100+
lenexpr = lenexpr.replace(p, str(parsed[p]))
101+
try:
102+
bitlen = eval(lenexpr)
103+
except:
104+
print("Error: " + str(bit.getBits()) + " is not a valid size!")
105+
return
106+
107+
val = field.read(bitlen)
108+
parsed[bit.getName()] = val.uint
109+
pos += bitlen
110+
if last_header is not bit.getPrefix():
111+
last_header = bit.getPrefix()
112+
print("")
113+
114+
out = bit.getName() + ": "
115+
for t, endian in bit.getTypes():
116+
if t == "hex":
117+
out += "0x" + val.hex + " "
118+
if t == "int":
119+
out += str(endianness(val.uint, endian, int(bitlen))) + " "
120+
if t == "bin":
121+
out += "0b" + val.bin + " "
122+
if t == "str":
123+
s = ""
124+
for si in range(0, len(str(val)[2:]), 2):
125+
out += str(chr(int(str(val)[si + 2:si + 4], 16)))
126+
print(out)
127+
128+
if __name__ == "__main__":
129+
main(sys.argv)
130+
131+

header/BMP

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
Magic: 16: hex, str
2+
FileSize: 32: intE
3+
Zero: 32: hex
4+
Position: 32: intE
5+
HeaderLen: 32: intE
6+
Width: 32: intE
7+
Height: 32: intE
8+
Layers: 16: intE
9+
Depth: 16: intE
10+
Compression: 32: intE
11+
DataLength: 32: intE
12+
XPixelMeter: 32: intE
13+
YPixelMeter: 32: intE
14+
UsedColors: 32: intE
15+
ImportantColors: 32: intE

header/ICMPv6

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Type: 8: int, hex
2+
Code: 8: int, hex
3+
Checksum: 16: hex
4+
Identifier: 16: hex
5+
Sequence: 16: hex
6+
Payload: (Length - 8) * 8: hex

header/IPHC

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Start: 3: bin
2+
TF: 2: bin, int
3+
NextHeader: 1: bin
4+
HopLimit: 2: bin, int
5+
CID: 1: bin
6+
SAC: 1: bin
7+
SAM: 2: bin, int
8+
M: 1: bin
9+
DAC: 1: bin
10+
DAM: 2: bin, int

header/IPv6

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Version: 4: int
2+
TrafficClass: 8: hex
3+
FlowLabel: 20: hex
4+
Length: 16: int
5+
NextHeader: 8: hex, int
6+
HopLimit: 8: int
7+
Source: 128: hex
8+
Destination: 128: hex

header/UDP

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
SourcePort: 16: int, hex
2+
DestinationPort: 16: int, hex
3+
Length: 16: int, hex
4+
Checksum: 16: hex
5+
Payload: Length * 8 - 64: hex
6+

sample/6lowpan_iphc.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6a330100003a

sample/bitmap.bmp

300 KB
Binary file not shown.

sample/ipv6_icmpv6.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6001000000183a40fe8000000000000002124b0006a0f908fe8000000000000002124b00068a090f8000b9240000000004040404040404040404040404040404

0 commit comments

Comments
 (0)