/usr/lib/python2.7/dist-packages/impacket/helper.py is in python-impacket 0.9.15-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 151 | # Copyright (c) 2003-2016 CORE Security Technologies
#
# 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
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)
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', '\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 = d.items()
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)
class ProtocolPacket(ip.ProtocolPacket):
__metaclass__ = ProtocolPacketMetaklass
def __init__(self, buff = None):
ip.ProtocolPacket.__init__(self, self.header_size, self.tail_size)
if buff:
self.load_packet(buff)
|