예제 #1
0
 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)
예제 #2
0
    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()
예제 #3
0
 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