Skip to content

Commit

Permalink
clean up the signature and the repr/str mess
Browse files Browse the repository at this point in the history
  • Loading branch information
trolldbois committed Aug 5, 2017
1 parent cbcdd0f commit 8a8e14c
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 8 deletions.
2 changes: 1 addition & 1 deletion haystack/reverse/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 6 additions & 1 deletion haystack/reverse/fieldtypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
2 changes: 2 additions & 0 deletions haystack/reverse/heuristics/constraints.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
15 changes: 9 additions & 6 deletions haystack/reverse/structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()])
Expand Down Expand Up @@ -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
Expand All @@ -611,20 +613,21 @@ 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
data = self._parent.bytes[_offset:_offset + word_size]
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:
Expand Down

0 comments on commit 8a8e14c

Please sign in to comment.