Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

# SECUREAUTH LABS. Copyright 2018 SecureAuth Corporation. All rights reserved. 

# 

# This software is provided under under a slightly modified version 

# of the Apache Software License. See the accompanying LICENSE file 

# for more information. 

# 

# Description: 

# Helper used to build ProtocolPackets 

# 

# Author: 

# Aureliano Calvo 

 

 

import struct 

import functools 

from six import add_metaclass 

 

import impacket.ImpactPacket as ip 

 

 

def rebind(f): 

functools.wraps(f) 

def rebinder(*args, **kwargs): 

return f(*args, **kwargs) 

 

return rebinder 

 

class Field(object): 

def __init__(self, index): 

self.index = index 

 

def __call__(self, k, d): 

getter = rebind(self.getter) 

getter_name = "get_" + k 

getter.__name__ = getter_name 

getter.__doc__ = "Get the %s field" % k 

d[getter_name] = getter 

 

setter = rebind(self.setter) 

setter_name = "set_" + k 

setter.__name__ = setter_name 

setter.__doc__ = "Set the %s field" % k 

d["set_" + k] = setter 

 

d[k] = property(getter, setter, doc="%s property" % k) 

 

class Bit(Field): 

def __init__(self, index, bit_number): 

Field.__init__(self, index) 

self.mask = 2 ** bit_number 

self.off_mask = (~self.mask) & 0xff 

 

def getter(self, o): 

return (o.header.get_byte(self.index) & self.mask) != 0 

 

def setter(self, o, value=True): 

b = o.header.get_byte(self.index) 

58 ↛ 59line 58 didn't jump to line 59, because the condition on line 58 was never true if value: 

b |= self.mask 

else: 

b &= self.off_mask 

 

o.header.set_byte(self.index, b) 

 

class Byte(Field): 

 

def __init__(self, index): 

Field.__init__(self, index) 

 

def getter(self, o): 

return o.header.get_byte(self.index) 

 

def setter(self, o, value): 

o.header.set_byte(self.index, value) 

 

class Word(Field): 

def __init__(self, index, order="!"): 

Field.__init__(self, index) 

self.order = order 

 

def getter(self, o): 

return o.header.get_word(self.index, self.order) 

 

def setter(self, o, value): 

o.header.set_word(self.index, value, self.order) 

 

class Long(Field): 

def __init__(self, index, order="!"): 

Field.__init__(self, index) 

self.order = order 

 

def getter(self, o): 

return o.header.get_long(self.index, self.order) 

 

def setter(self, o, value): 

o.header.set_long(self.index, value, self.order) 

 

class ThreeBytesBigEndian(Field): 

def __init__(self, index): 

Field.__init__(self, index) 

 

def getter(self, o): 

b=o.header.get_bytes()[self.index:self.index+3].tostring() 

#unpack requires a string argument of length 4 and b is 3 bytes long 

(value,)=struct.unpack('!L', b'\x00'+b) 

return value 

 

def setter(self, o, value): 

# clear the bits 

mask = ((~0xFFFFFF00) & 0xFF) 

masked = o.header.get_long(self.index, ">") & mask 

# set the bits  

nb = masked | ((value & 0x00FFFFFF) << 8) 

o.header.set_long(self.index, nb, ">") 

 

 

class ProtocolPacketMetaklass(type): 

def __new__(cls, name, bases, d): 

d["_fields"] = [] 

items = list(d.items()) 

121 ↛ 123line 121 didn't jump to line 123, because the condition on line 121 was never false if not object in bases: 

bases += (object,) 

for k,v in items: 

if isinstance(v, Field): 

d["_fields"].append(k) 

v(k, d) 

 

d["_fields"].sort() 

 

def _fields_repr(self): 

return " ".join( "%s:%s" % (f, repr(getattr(self, f))) for f in self._fields ) 

def __repr__(self): 

 

return "<%(name)s %(fields)s \nchild:%(r_child)s>" % { 

"name": name, 

"fields": self._fields_repr(), 

"r_child": repr(self.child()), 

} 

 

d["_fields_repr"] = _fields_repr 

d["__repr__"] = __repr__ 

 

return type.__new__(cls, name, bases, d) 

 

@add_metaclass(ProtocolPacketMetaklass) 

class ProtocolPacket(ip.ProtocolPacket): 

def __init__(self, buff = None): 

ip.ProtocolPacket.__init__(self, self.header_size, self.tail_size) 

if buff: 

self.load_packet(buff)