From 8a8e14c675a25afbda5b87af84437c3ef2b088e3 Mon Sep 17 00:00:00 2001 From: Loic Jaquemet Date: Sat, 5 Aug 2017 01:24:28 -0600 Subject: [PATCH] clean up the signature and the repr/str mess --- haystack/reverse/context.py | 2 +- haystack/reverse/fieldtypes.py | 7 ++++++- haystack/reverse/heuristics/constraints.py | 2 ++ haystack/reverse/structure.py | 15 +++++++++------ 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/haystack/reverse/context.py b/haystack/reverse/context.py index 2fabad6..906c8de 100644 --- a/haystack/reverse/context.py +++ b/haystack/reverse/context.py @@ -192,7 +192,7 @@ def save_reversed_types(self): # FIXME dirty members_addresses = all_records_types[record_type.type_name] nb_total += len(members_addresses) - # FIXME : extract from here to main reverse loop / type reversers + # FIXME : extract from here to main reverse loop / signature type reversers from haystack.reverse.heuristics import constraints rev = constraints.ConstraintsReverser(self.memory_handler) txt = rev.verify(r_type_name, members_addresses) diff --git a/haystack/reverse/fieldtypes.py b/haystack/reverse/fieldtypes.py index a377e77..9ec9eda 100644 --- a/haystack/reverse/fieldtypes.py +++ b/haystack/reverse/fieldtypes.py @@ -126,7 +126,12 @@ def get_field_at_offset(self, offset): @property def signature(self): - return ''.join([f.signature for f in self.get_fields()]) + # return ''.join([f.signature for f in self.get_fields()]) + return [f.signature for f in self.get_fields()] + + @property + def signature_text(self): + return ''.join(['%s%d' % (f.signature[0], f.signature[1]) for f in self.get_fields()]) @property def size(self): diff --git a/haystack/reverse/heuristics/constraints.py b/haystack/reverse/heuristics/constraints.py index a2212ba..409f0d3 100644 --- a/haystack/reverse/heuristics/constraints.py +++ b/haystack/reverse/heuristics/constraints.py @@ -41,6 +41,8 @@ def verify(self, _record_type_name, members_addresses): _context = self.__process_context.get_context_for_address(ref_addr) _item = _context.get_record_for_address(ref_addr) _record_type = _item.record_type + lines.append('# size: %d' % _record_type.size) + lines.append('# signature: %s' % _record_type.signature_text) # try to apply the fields template to all members of the list for list_item_addr in members_addresses: _context = self.__process_context.get_context_for_address(list_item_addr) diff --git a/haystack/reverse/structure.py b/haystack/reverse/structure.py index 98a863a..beb6272 100644 --- a/haystack/reverse/structure.py +++ b/haystack/reverse/structure.py @@ -476,10 +476,12 @@ def __str__(self): return 'struct_%x' % self.__address def get_signature_text(self): - return ''.join(['%s%d' % (f.signature[0], f.signature[1]) for f in self.record_type.get_fields()]) + # return ''.join(['%s%d' % (f.signature[0], f.signature[1]) for f in self.record_type.get_fields()]) + return self.record_type.signature_text def get_signature(self): - return [f.signature for f in self.record_type.get_fields()] + # return [f.signature for f in self.record_type.get_fields()] + return self.record_type.signature def get_type_signature_text(self): return ''.join([f.signature[0].upper() for f in self.record_type.get_fields()]) @@ -594,7 +596,7 @@ def get_value_for_field(self, max_len=120): # call the .value property instead my_bytes = self.__get_value_for_field_inner(max_len) if isinstance(my_bytes, str): - bl = len(str(my_bytes)) + bl = len(my_bytes) if bl >= max_len: my_bytes = my_bytes[:max_len // 2] + '...' + \ my_bytes[-(max_len // 2):] # idlike to see the end @@ -611,12 +613,13 @@ def __get_value_for_field_inner(self, max_len=120): if self._field_decl.is_string(): if _type == fieldtypes.STRING16: try: - my_bytes = "%s" % (repr(self._parent.bytes[_offset:_offset + _size].decode('utf-16'))) + # my_bytes = "%s" % (repr(self._parent.bytes[_offset:_offset + _size].decode('utf-16'))) + my_bytes = "%s" % self._parent.bytes[_offset:_offset + _size].decode('utf-16') except UnicodeDecodeError as e: log.error('ERROR ON : %s', repr(self._parent.bytes[_offset:_offset + _size])) my_bytes = self._parent.bytes[_offset:_offset + _size] else: - my_bytes = "'%s'" % (self._parent.bytes[_offset:_offset + _size]) + my_bytes = "%s" % (self._parent.bytes[_offset:_offset + _size]) elif self._field_decl.is_integer(): # what about endianness ? endianess = '<' # FIXME dsa self.endianess @@ -624,7 +627,7 @@ def __get_value_for_field_inner(self, max_len=120): val = self._parent.target.get_target_ctypes_utils().unpackWord(data, endianess) return val elif self._field_decl.is_zeroes(): - my_bytes = repr('\\x00'*_size) + my_bytes = '\\x00'*_size elif self._field_decl.is_array(): my_bytes = self._parent.bytes[_offset:_offset + _size] elif self._field_decl.padding or _type == fieldtypes.UNKNOWN: