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 __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)
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)
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)
def get_qr(self): return get_bits(self.bitmap,15)
def get_rcode(self): return get_bits(self.bitmap, 0, 4)
def get_ra(self): return get_bits(self.bitmap, 7)
def get_rd(self): return get_bits(self.bitmap, 8)
def get_tc(self): return get_bits(self.bitmap, 9)
def get_aa(self): return get_bits(self.bitmap, 10)
def get_opcode(self): return get_bits(self.bitmap, 11, 4)
def get_qr(self): return get_bits(self.bitmap, 15)
def get_rcode(self): return get_bits(self.bitmap,0,4)
def get_ra(self): return get_bits(self.bitmap,7)
def get_rd(self): return get_bits(self.bitmap,8)
def get_tc(self): return get_bits(self.bitmap,9)
def get_aa(self): return get_bits(self.bitmap,10)
def get_opcode(self): return get_bits(self.bitmap,11,4)