def trigger_write_instruction(self, item): if not self.dwarf.keystone_installed: details = '' try: import keystone.keystone_const except Exception as e: details = str(e) utils.show_message_box( 'keystone-engine not found. Install it to enable instructions patching', details=details) return accept, inst, arch, mode = WriteInstructionDialog().show_dialog( input_content='%s %s' % (self.item(item.row(), 1).text(), self.item(item.row(), 2).text()), arch=self.ks_arch, mode=self.ks_mode) self.ks_arch = 'KS_ARCH_' + arch.upper() self.ks_mode = 'KS_MODE_' + mode.upper() if accept and len(inst) > 0: import keystone try: ks = keystone.Ks( getattr(keystone.keystone_const, self.ks_arch), getattr(keystone.keystone_const, self.ks_mode)) encoding, count = ks.asm(inst) asm_widget = self.item(item.row(), 0) offset = asm_widget.get_offset() if self.dwarf.dwarf_api('writeBytes', [asm_widget.get_address(), encoding]): new_data = bytearray(self.range.data) for i in range(0, len(encoding)): try: new_data[self.asm_data_start + offset + i] = encoding[i] except Exception as e: if isinstance(e, IndexError): break self.range.data = bytes(new_data) self.disa() except Exception as e: self.dwarf.log(e)
def trigger_write_instruction(self): if len(self.selectedItems()) == 0: return item = self.selectedItems()[0] accept, inst, arch, mode = WriteInstructionDialog().show_dialog( input_content='%s %s' % (self.item(item.row(), 1).text(), self.item(item.row(), 2).text()), arch=self.ks_arch, mode=self.ks_mode) self.ks_arch = 'KS_ARCH_' + arch.upper() self.ks_mode = 'KS_MODE_' + mode.upper() if accept and len(inst) > 0: import keystone try: ks = keystone.Ks( getattr(keystone.keystone_const, self.ks_arch), getattr(keystone.keystone_const, self.ks_mode)) encoding, count = ks.asm(inst) asm_widget = self.item(item.row(), 0) offset = asm_widget.get_offset() if self.app.dwarf_api('writeBytes', [asm_widget.get_address(), encoding]): new_data = bytearray(self.range.data) for i in range(0, len(encoding)): try: new_data[self.asm_data_start + offset + i] = encoding[i] except Exception as e: if isinstance(e, IndexError): break self.range.data = bytes(new_data) self.disa() except Exception as e: self.app.get_log_panel().log(str(e))