diff --git a/src/gui/Src/Gui/MemoryMapView.cpp b/src/gui/Src/Gui/MemoryMapView.cpp index 02f14aa6..9f31871b 100644 --- a/src/gui/Src/Gui/MemoryMapView.cpp +++ b/src/gui/Src/Gui/MemoryMapView.cpp @@ -11,6 +11,7 @@ #include "MiscUtil.h" #include "GotoDialog.h" #include "WordEditDialog.h" +#include "VirtualModDialog.h" MemoryMapView::MemoryMapView(StdTable* parent) : StdTable(parent), @@ -140,6 +141,10 @@ void MemoryMapView::setupContextMenu() mDumpMemory = new QAction(tr("&Dump Memory to File"), this); connect(mDumpMemory, SIGNAL(triggered()), this, SLOT(dumpMemory())); + //Add virtual module + mAddVirtualMod = new QAction(tr("Add virtual module"), this); + connect(mAddVirtualMod, SIGNAL(triggered()), this, SLOT(addVirtualModSlot())); + refreshShortcutsSlot(); connect(Config(), SIGNAL(shortcutsUpdated()), this, SLOT(refreshShortcutsSlot())); } @@ -160,9 +165,9 @@ void MemoryMapView::contextMenuSlot(const QPoint & pos) if(!DbgIsDebugging()) return; QMenu wMenu(this); //create context menu - wMenu.addAction(mDumpMemory); wMenu.addAction(mFollowDisassembly); wMenu.addAction(mFollowDump); + wMenu.addAction(mDumpMemory); wMenu.addAction(mYara); wMenu.addAction(mEntropy); wMenu.addAction(mFindPattern); @@ -171,6 +176,7 @@ void MemoryMapView::contextMenuSlot(const QPoint & pos) wMenu.addAction(mMemoryAllocate); wMenu.addAction(mMemoryFree); wMenu.addAction(mFindAddress); + wMenu.addAction(mAddVirtualMod); wMenu.addSeparator(); wMenu.addAction(mPageMemoryRights); wMenu.addSeparator(); @@ -204,6 +210,8 @@ void MemoryMapView::contextMenuSlot(const QPoint & pos) mMemoryRemove->setVisible(false); } + mAddVirtualMod->setVisible(!DbgFunctions()->ModBaseFromAddr(selectedAddr)); + wMenu.exec(mapToGlobal(pos)); //execute context menu } @@ -582,3 +590,17 @@ void MemoryMapView::findAddressSlot() selectAddress(DbgValFromString(mGoto.expressionText.toUtf8().constData())); } } + +void MemoryMapView::addVirtualModSlot() +{ + auto base = duint(getCellContent(getInitialSelection(), 0).toULongLong(nullptr, 16)); + auto size = duint(getCellContent(getInitialSelection(), 1).toULongLong(nullptr, 16)); + VirtualModDialog mDialog(this); + mDialog.setData("", base, size); + if(mDialog.exec() != QDialog::Accepted) + return; + QString modname; + if(!mDialog.getData(modname, base, size)) + return; + DbgCmdExec(QString("virtualmod \"%1\", %2, %3").arg(modname).arg(ToHexString(base)).arg(ToHexString(size)).toUtf8().constData()); +} diff --git a/src/gui/Src/Gui/MemoryMapView.h b/src/gui/Src/Gui/MemoryMapView.h index 45172173..85455fa3 100644 --- a/src/gui/Src/Gui/MemoryMapView.h +++ b/src/gui/Src/Gui/MemoryMapView.h @@ -40,6 +40,7 @@ public slots: void dumpMemory(); void selectAddress(duint va); void findAddressSlot(); + void addVirtualModSlot(); private: QString getProtectionString(DWORD Protect); @@ -68,6 +69,7 @@ private: QAction* mMemoryAllocate; QAction* mMemoryFree; QAction* mFindAddress; + QAction* mAddVirtualMod; duint mCipBase; }; diff --git a/src/gui/Src/Gui/VirtualModDialog.cpp b/src/gui/Src/Gui/VirtualModDialog.cpp new file mode 100644 index 00000000..47c34552 --- /dev/null +++ b/src/gui/Src/Gui/VirtualModDialog.cpp @@ -0,0 +1,40 @@ +#include "VirtualModDialog.h" +#include "ui_VirtualModDialog.h" +#include "StringUtil.h" + +VirtualModDialog::VirtualModDialog(QWidget* parent) : + QDialog(parent), + ui(new Ui::VirtualModDialog) +{ + ui->setupUi(this); + setModal(true); + setFixedSize(this->size()); //fixed size + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint | Qt::MSWindowsFixedSizeDialogHint); +} + +VirtualModDialog::~VirtualModDialog() +{ + delete ui; +} + +bool VirtualModDialog::getData(QString & modname, duint & base, duint & size) +{ + modname = ui->editName->text(); + if(!modname.length()) + return false; + bool ok = false; + base = duint(ui->editBase->text().toLongLong(&ok, 16)); + if(!ok || !DbgMemIsValidReadPtr(base)) + return false; + size = duint(ui->editSize->text().toLongLong(&ok, 16)); + if(!ok || ! size) + return false; + return true; +} + +void VirtualModDialog::setData(const QString & modname, duint base, duint size) +{ + ui->editName->setText(modname); + ui->editBase->setText(ToHexString(base)); + ui->editSize->setText(ToHexString(size)); +} diff --git a/src/gui/Src/Gui/VirtualModDialog.h b/src/gui/Src/Gui/VirtualModDialog.h new file mode 100644 index 00000000..9272b1b9 --- /dev/null +++ b/src/gui/Src/Gui/VirtualModDialog.h @@ -0,0 +1,26 @@ +#ifndef VIRTUALMODDIALOG_H +#define VIRTUALMODDIALOG_H + +#include +#include "Imports.h" + +namespace Ui +{ + class VirtualModDialog; +} + +class VirtualModDialog : public QDialog +{ + Q_OBJECT + +public: + explicit VirtualModDialog(QWidget* parent = 0); + ~VirtualModDialog(); + bool getData(QString & modname, duint & base, duint & size); + void setData(const QString & modname, duint base, duint size); + +private: + Ui::VirtualModDialog* ui; +}; + +#endif // VIRTUALMODDIALOG_H diff --git a/src/gui/Src/Gui/VirtualModDialog.ui b/src/gui/Src/Gui/VirtualModDialog.ui new file mode 100644 index 00000000..6ed5de6a --- /dev/null +++ b/src/gui/Src/Gui/VirtualModDialog.ui @@ -0,0 +1,130 @@ + + + VirtualModDialog + + + + 0 + 0 + 400 + 101 + + + + Virtual Module + + + + + + + + &Name: + + + editName + + + + + + + + + + + + + + + + &Base: + + + editBase + + + + + + + + + + + + + + &Size: + + + editSize + + + + + + + + + + + + + + + + &OK + + + true + + + + + + + &Cancel + + + + + + + + + + + buttonCancel + clicked() + VirtualModDialog + reject() + + + 254 + 75 + + + 303 + 98 + + + + + buttonOk + clicked() + VirtualModDialog + accept() + + + 136 + 80 + + + 113 + 98 + + + + + diff --git a/src/gui/x64dbg.pro b/src/gui/x64dbg.pro index eafdfde0..f73e2e90 100644 --- a/src/gui/x64dbg.pro +++ b/src/gui/x64dbg.pro @@ -167,7 +167,8 @@ SOURCES += \ Src/Gui/FavouriteTools.cpp \ Src/Gui/BrowseDialog.cpp \ Src/Gui/DisassemblerGraphView.cpp \ - Src/Gui/DisassemblyPopup.cpp + Src/Gui/DisassemblyPopup.cpp \ + Src/Gui/VirtualModDialog.cpp HEADERS += \ @@ -271,7 +272,8 @@ HEADERS += \ Src/Gui/BrowseDialog.h \ Src/Gui/DisassemblerGraphView.h \ Src/Utils/ActionHelpers.h \ - Src/Gui/DisassemblyPopup.h + Src/Gui/DisassemblyPopup.h \ + Src/Gui/VirtualModDialog.h FORMS += \ @@ -306,7 +308,8 @@ FORMS += \ Src/Gui/CodepageSelectionDialog.ui \ Src/Gui/ColumnReorderDialog.ui \ Src/Gui/FavouriteTools.ui \ - Src/Gui/BrowseDialog.ui + Src/Gui/BrowseDialog.ui \ + Src/Gui/VirtualModDialog.ui TRANSLATIONS = \ Translations/x64dbg.ts