def MemoryEditor_Refresh_Button_clicked_cb(self, button, data=None): dlength = len(self.memoryeditor_hexview.payload) data = self.read_memory(self.memoryeditor_hexview.base_addr, dlength) if data is None: self.memoryeditor_window.hide() self.show_error(_('Cannot read memory')) return old_addr = self.memoryeditor_hexview.get_current_addr() self.memoryeditor_hexview.payload = misc.str2bytes(data) self.memoryeditor_hexview.show_addr(old_addr)
def browse_memory(self, addr=None): # select a region contains addr try: self.read_maps() except: self.show_error( _('Cannot retrieve memory maps of that process, maybe it has ' 'exited (crashed), or you don\'t have enough privileges')) return selected_region = None if addr: for m in self.maps: if m['start_addr'] <= addr and addr < m['end_addr']: selected_region = m break if selected_region: if selected_region['flags'][0] != 'r': # not readable self.show_error(_('Address %x is not readable') % (addr, )) return else: self.show_error(_('Address %x is not valid') % (addr, )) return else: # just select the first readable region for m in self.maps: if m['flags'][0] == 'r': selected_region = m break if selected_region is None: self.show_error(_('Cannot find a readable region')) return addr = selected_region['start_addr'] # read region if necessary start_addr = max(addr - 1024, selected_region['start_addr']) end_addr = min(addr + 1024, selected_region['end_addr']) if self.last_hexedit_address[0] != start_addr or \ self.last_hexedit_address[1] != end_addr: data = self.read_memory(start_addr, end_addr - start_addr) if data is None: self.show_error(_('Cannot read memory')) return self.last_hexedit_address = (start_addr, end_addr) self.memoryeditor_hexview.payload = misc.str2bytes(data) self.memoryeditor_hexview.base_addr = start_addr # set editable flag self.memoryeditor_hexview.editable = ( selected_region['flags'][1] == 'w') if addr: self.memoryeditor_hexview.show_addr(addr) self.memoryeditor_window.show()
def bytes2value(self, typename, databytes): if databytes is None: return None if typename in TYPENAMES_G2STRUCT: return struct.unpack(TYPENAMES_G2STRUCT[typename], databytes)[0] elif typename == 'string': return misc.decode(databytes, 'replace') elif typename == 'bytearray': databytes = misc.str2bytes(databytes) return ' '.join(['%02x' % (i, ) for i in databytes]) else: return databytes