Beispiel #1
0
 def __init__(self, rname=None, rtype=1, rclass=1, ttl=0, rdata=None):
     self.rname = rname
     self.rtype = rtype
     self.rclass = rclass
     self.ttl = ttl
     self.rdata = rdata
     # TODO Add property getters/setters
     if self.rtype == QTYPE.OPT:
         self.edns_len = self.rclass
         self.edns_do = get_bits(self.ttl, 15)
         self.edns_ver = get_bits(self.ttl, 16, 8)
         self.edns_rcode = get_bits(self.ttl, 24, 8)
Beispiel #2
0
 def __init__(self,rname=None,rtype=1,rclass=1,ttl=0,rdata=None):
     self.rname = rname
     self.rtype = rtype
     self.rclass = rclass
     self.ttl = ttl
     self.rdata = rdata
     # TODO Add property getters/setters
     if self.rtype == QTYPE.OPT:
         self.edns_len = self.rclass
         self.edns_do = get_bits(self.ttl,15)
         self.edns_ver = get_bits(self.ttl,16,8)
         self.edns_rcode = get_bits(self.ttl,24,8)
 def decode_name(self, last=-1):
     """
         Orig docstring: Decode label at current offset in buffer (following pointers
         to cached elements where necessary)
         This method has overwritten because of Kitty. Sometimes it produces fuzzed data
         with iso-8859-1 encodings that the original DNS lib can not handle because that type
         of DNS domain label not exists in real world scenario but here it is.
     """
     label = []
     done = False
     while not done:
         (length,) = self.unpack("!B")
         if get_bits(length, 6, 2) == 3:
             # Pointer
             self.offset -= 1
             pointer = get_bits(self.unpack("!H")[0], 0, 14)
             save = self.offset
             if last == save:
                 raise BufferError(
                     f"Recursive pointer in DNSLabel [offset={self.offset:d},pointer={pointer:d},"
                     f"length={len(self.data):d}]")
             if pointer < self.offset:
                 self.offset = pointer
             else:
                 # Pointer can't point forwards
                 raise BufferError(
                     f"Invalid pointer in DNSLabel [offset={self.offset:d},pointer={pointer:d},"
                     f"length={len(self.data):d}]")
             label.extend(self.decode_name(save).label)
             self.offset = save
             done = True
         else:
             if length > 0:
                 l = self.get(length)
                 try:
                     l.decode()
                 except:
                     l.decode('iso-8859-1')
                 label.append(l)
             else:
                 done = True
     return DNSLabel(label)
Beispiel #4
0
 def decode_name(self, last=-1):
     """
         Decode label at current offset in buffer (following pointers
         to cached elements where necessary)
     """
     label = []
     done = False
     while not done:
         (length, ) = self.unpack("!B")
         if get_bits(length, 6, 2) == 3:
             # Pointer
             self.offset -= 1
             pointer = get_bits(self.unpack("!H")[0], 0, 14)
             save = self.offset
             if last == save:
                 raise BufferError(
                     "Recursive pointer in DNSLabel [offset=%d,pointer=%d,length=%d]"
                     % (self.offset, pointer, len(self.data)))
             if pointer < self.offset:
                 self.offset = pointer
             else:
                 # Pointer can't point forwards
                 raise BufferError(
                     "Invalid pointer in DNSLabel [offset=%d,pointer=%d,length=%d]"
                     % (self.offset, pointer, len(self.data)))
             label.extend(self.decode_name(save).label)
             self.offset = save
             done = True
         else:
             if length > 0:
                 l = self.get(length)
                 try:
                     l.decode()
                 except UnicodeDecodeError:
                     raise BufferError("Invalid label <%s>" % l)
                 label.append(l)
             else:
                 done = True
     return DNSLabel(label)
Beispiel #5
0
 def decode_name(self,last=-1):
     """
         Decode label at current offset in buffer (following pointers
         to cached elements where necessary)
     """
     label = []
     done = False
     while not done:
         (length,) = self.unpack("!B")
         if get_bits(length,6,2) == 3:
             # Pointer
             self.offset -= 1
             pointer = get_bits(self.unpack("!H")[0],0,14)
             save = self.offset
             if last == save:
                 raise BufferError("Recursive pointer in DNSLabel [offset=%d,pointer=%d,length=%d]" % 
                         (self.offset,pointer,len(self.data)))
             if pointer < self.offset:
                 self.offset = pointer
             else:
                 # Pointer can't point forwards
                 raise BufferError("Invalid pointer in DNSLabel [offset=%d,pointer=%d,length=%d]" % 
                         (self.offset,pointer,len(self.data)))
             label.extend(self.decode_name(save).label)
             self.offset = save
             done = True
         else:
             if length > 0:
                 l = self.get(length)
                 try:
                     l.decode()
                 except UnicodeDecodeError:
                     raise BufferError("Invalid label <%s>" % l)
                 label.append(l)
             else:
                 done = True
     return DNSLabel(label)
Beispiel #6
0
 def get_qr(self):
     return get_bits(self.bitmap,15)
Beispiel #7
0
 def get_rcode(self):
     return get_bits(self.bitmap, 0, 4)
Beispiel #8
0
 def get_ra(self):
     return get_bits(self.bitmap, 7)
Beispiel #9
0
 def get_rd(self):
     return get_bits(self.bitmap, 8)
Beispiel #10
0
 def get_tc(self):
     return get_bits(self.bitmap, 9)
Beispiel #11
0
 def get_aa(self):
     return get_bits(self.bitmap, 10)
Beispiel #12
0
 def get_opcode(self):
     return get_bits(self.bitmap, 11, 4)
Beispiel #13
0
 def get_qr(self):
     return get_bits(self.bitmap, 15)
Beispiel #14
0
 def get_rcode(self):
     return get_bits(self.bitmap,0,4)
Beispiel #15
0
 def get_ra(self):
     return get_bits(self.bitmap,7)
Beispiel #16
0
 def get_rd(self):
     return get_bits(self.bitmap,8)
Beispiel #17
0
 def get_tc(self):
     return get_bits(self.bitmap,9)
Beispiel #18
0
 def get_aa(self):
     return get_bits(self.bitmap,10)
Beispiel #19
0
 def get_opcode(self):
     return get_bits(self.bitmap,11,4)