diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp index 53e06fcf..b1996b79 100644 --- a/src/core/Cutter.cpp +++ b/src/core/Cutter.cpp @@ -762,10 +762,14 @@ QString CutterCore::getInstructionOpcode(RVA addr) return fromOwnedCharPtr(ret); } -void CutterCore::editInstruction(RVA addr, const QString &inst) +void CutterCore::editInstruction(RVA addr, const QString &inst, bool fillWithNops) { CORE_LOCK(); - rz_core_write_assembly(core, addr, inst.trimmed().toStdString().c_str()); + if (fillWithNops) { + rz_core_write_assembly_fill(core, addr, inst.trimmed().toStdString().c_str()); + } else { + rz_core_write_assembly(core, addr, inst.trimmed().toStdString().c_str()); + } emit instructionChanged(addr); } diff --git a/src/core/Cutter.h b/src/core/Cutter.h index 9552fd82..4263a8a8 100644 --- a/src/core/Cutter.h +++ b/src/core/Cutter.h @@ -259,7 +259,7 @@ public: /* Edition functions */ QString getInstructionBytes(RVA addr); QString getInstructionOpcode(RVA addr); - void editInstruction(RVA addr, const QString &inst); + void editInstruction(RVA addr, const QString &inst, bool fillWithNops = false); void nopInstruction(RVA addr); void jmpReverse(RVA addr); void editBytes(RVA addr, const QString &inst); diff --git a/src/dialogs/EditInstructionDialog.cpp b/src/dialogs/EditInstructionDialog.cpp index d619bb51..041aea91 100644 --- a/src/dialogs/EditInstructionDialog.cpp +++ b/src/dialogs/EditInstructionDialog.cpp @@ -2,12 +2,20 @@ #include "ui_EditInstructionDialog.h" #include "core/Cutter.h" +#include + EditInstructionDialog::EditInstructionDialog(InstructionEditMode editMode, QWidget *parent) : QDialog(parent), ui(new Ui::EditInstructionDialog), editMode(editMode) { ui->setupUi(this); ui->lineEdit->setMinimumWidth(400); ui->instructionLabel->setWordWrap(true); + if (editMode == EDIT_TEXT) { + ui->fillWithNops->setVisible(true); + ui->fillWithNops->setCheckState(Qt::Checked); + } else { + ui->fillWithNops->setVisible(false); + } setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint)); connect(ui->lineEdit, &QLineEdit::textEdited, this, &EditInstructionDialog::updatePreview); @@ -22,6 +30,15 @@ void EditInstructionDialog::on_buttonBox_rejected() close(); } +bool EditInstructionDialog::needsNops() const +{ + if (editMode != EDIT_TEXT) { + return false; + } + + return ui->fillWithNops->checkState() == Qt::Checked; +} + QString EditInstructionDialog::getInstruction() const { return ui->lineEdit->text(); diff --git a/src/dialogs/EditInstructionDialog.h b/src/dialogs/EditInstructionDialog.h index f343ed7d..1235a734 100644 --- a/src/dialogs/EditInstructionDialog.h +++ b/src/dialogs/EditInstructionDialog.h @@ -20,18 +20,18 @@ public: QString getInstruction() const; void setInstruction(const QString &instruction); + bool needsNops() const; private slots: void on_buttonBox_accepted(); - void on_buttonBox_rejected(); void updatePreview(const QString &input); private: std::unique_ptr ui; - InstructionEditMode - editMode; // true if editing intruction **bytes**; false if editing instruction **text** + // defines if the user is editing bytes or asm + InstructionEditMode editMode; }; #endif // EDITINSTRUCTIONDIALOG_H diff --git a/src/dialogs/EditInstructionDialog.ui b/src/dialogs/EditInstructionDialog.ui index 6ff8661b..98d53131 100644 --- a/src/dialogs/EditInstructionDialog.ui +++ b/src/dialogs/EditInstructionDialog.ui @@ -7,7 +7,7 @@ 0 0 400 - 118 + 151 @@ -37,6 +37,18 @@ + + 5 + + + 5 + + + 5 + + + 5 + @@ -82,6 +94,16 @@ + + + + Fill all remaining bytes with NOP opcodes + + + true + + + diff --git a/src/menus/DisassemblyContextMenu.cpp b/src/menus/DisassemblyContextMenu.cpp index 873907d2..f3f2dcfb 100644 --- a/src/menus/DisassemblyContextMenu.cpp +++ b/src/menus/DisassemblyContextMenu.cpp @@ -708,9 +708,10 @@ void DisassemblyContextMenu::on_actionEditInstruction_triggered() e.setInstruction(oldInstructionOpcode); if (e.exec()) { + bool fillWithNops = e.needsNops(); QString userInstructionOpcode = e.getInstruction(); if (userInstructionOpcode != oldInstructionOpcode) { - Core()->editInstruction(offset, userInstructionOpcode); + Core()->editInstruction(offset, userInstructionOpcode, fillWithNops); } } }