From 55d16977f218f1ded9d4a19f3084bf4587c42bc0 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 9 Aug 2014 15:43:58 +0200 Subject: [PATCH] GUI: resolved issue #77 (find command) --- .../Project/Src/Gui/CPUDisassembly.cpp | 51 ++++++++++++++++++- x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 2 + .../Project/Src/Utils/Configuration.cpp | 2 + 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 39a2708f..7065ba1c 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -472,6 +472,12 @@ void CPUDisassembly::setupRightClickContextMenu() // Menu mSearchMenu = new QMenu("&Search for", this); + // Command + mSearchCommand = new QAction("C&ommand", this); + mSearchCommand->setShortcutContext(Qt::WidgetShortcut); + this->addAction(mSearchCommand); + connect(mSearchCommand, SIGNAL(triggered()), this, SLOT(findCommand())); + // Constant mSearchConstant = new QAction("&Constant", this); connect(mSearchConstant, SIGNAL(triggered()), this, SLOT(findConstant())); @@ -529,6 +535,7 @@ void CPUDisassembly::refreshShortcutsSlot() mSearchPattern->setShortcut(ConfigShortcut("ActionFindPattern")); mEnableHighlightingMode->setShortcut(ConfigShortcut("ActionHighlightingMode")); mCopySelection->setShortcut(ConfigShortcut("ActionCopy")); + mSearchCommand->setShortcut(ConfigShortcut("ActionFind")); } void CPUDisassembly::gotoOrigin() @@ -782,7 +789,6 @@ void CPUDisassembly::assembleAt() return; int_t wRVA = getInitialSelection(); uint_t wVA = rvaToVa(wRVA); - LineEditDialog mLineEdit(this); QString addr_text = QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); QByteArray wBuffer; @@ -804,6 +810,7 @@ void CPUDisassembly::assembleAt() QBeaEngine* disasm = new QBeaEngine(); Instruction_t instr = disasm->DisassembleAt(reinterpret_cast(wBuffer.data()), wMaxByteCountToRead, 0, 0, wVA); + LineEditDialog mLineEdit(this); mLineEdit.setText(instr.instStr); mLineEdit.setWindowTitle("Assemble at " + addr_text); mLineEdit.setCheckBoxText("&Fill with NOP's"); @@ -1127,3 +1134,45 @@ void CPUDisassembly::copyDisassembly() } Bridge::CopyToClipboard(clipboard); } + +void CPUDisassembly::findCommand() +{ + if(!DbgIsDebugging()) + return; + + LineEditDialog mLineEdit(this); + mLineEdit.enableCheckBox(true); + mLineEdit.setCheckBoxText("Entire &Block"); + mLineEdit.setCheckBox(ConfigBool("Disassembler", "FindCommandEntireBlock")); + mLineEdit.setWindowTitle("Find Command"); + if(mLineEdit.exec() != QDialog::Accepted) + return; + Config()->setBool("Disassembler", "FindCommandEntireBlock", mLineEdit.bChecked); + + char error[MAX_ERROR_SIZE] = ""; + unsigned char dest[16]; + int asmsize = 0; + uint_t va = rvaToVa(getInitialSelection()); + + if(!DbgFunctions()->Assemble(va + mMemPage->getSize() / 2, dest, &asmsize, mLineEdit.editText.toUtf8().constData(), error)) + { + QMessageBox msg(QMessageBox::Critical, "Error!", "Failed to assemble instruction \"" + mLineEdit.editText + "\" (" + error + ")"); + msg.setWindowIcon(QIcon(":/icons/images/compile-error.png")); + msg.setParent(this, Qt::Dialog); + msg.setWindowFlags(msg.windowFlags() & (~Qt::WindowContextHelpButtonHint)); + msg.exec(); + return; + } + + QString addr_text = QString("%1").arg(va, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + + if(!mLineEdit.bChecked) + { + int_t size = mMemPage->getSize(); + DbgCmdExec(QString("findasm \"%1\", %2, .%3").arg(mLineEdit.editText).arg(addr_text).arg(size).toUtf8().constData()); + } + else + DbgCmdExec(QString("findasm \"%1\", %2").arg(mLineEdit.editText).arg(addr_text).toUtf8().constData()); + + emit displayReferencesWidget(); +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index f77b4b19..370c8dc1 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -76,6 +76,7 @@ public slots: void copySelectionNoBytes(); void copyAddress(); void copyDisassembly(); + void findCommand(); private: @@ -114,6 +115,7 @@ private: QAction* mGotoPrevious; QAction* mGotoNext; QAction* mReferenceSelectedAddress; + QAction* mSearchCommand; QAction* mSearchConstant; QAction* mSearchStrings; QAction* mSearchCalls; diff --git a/x64_dbg_gui/Project/Src/Utils/Configuration.cpp b/x64_dbg_gui/Project/Src/Utils/Configuration.cpp index ac81ffaa..d5ba98fd 100644 --- a/x64_dbg_gui/Project/Src/Utils/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Utils/Configuration.cpp @@ -149,6 +149,7 @@ Configuration::Configuration() : QObject() disassemblyBool.insert("MemorySpaces", false); disassemblyBool.insert("FillNOPs", false); disassemblyBool.insert("Uppercase", false); + disassemblyBool.insert("FindCommandEntireBlock", false); defaultBools.insert("Disassembler", disassemblyBool); //uint settings @@ -238,6 +239,7 @@ Configuration::Configuration() : QObject() defaultShortcuts.insert("ActionFindReferencesToSelectedAddress", Shortcut(tr("Actions -> Find References to Selected Address"), "Ctrl+R")); defaultShortcuts.insert("ActionFindPattern", Shortcut(tr("Actions -> Find Pattern"), "Ctrl+B")); defaultShortcuts.insert("ActionHighlightingMode", Shortcut(tr("Actions -> Highlighting Mode"), "Ctrl+H")); + defaultShortcuts.insert("ActionFind", Shortcut(tr("Actions -> Find"), "Ctrl+F")); defaultShortcuts.insert("ActionIncreaseRegister", Shortcut(tr("Actions -> Increase Register"), "+")); defaultShortcuts.insert("ActionDecreaseRegister", Shortcut(tr("Actions -> Decrease Register"), "-"));