From 05378fabb283c23722cbfcd7ac3e54fa1a160b8b Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Wed, 9 May 2018 17:47:33 +0200 Subject: [PATCH] GUI: add copy header VA to disassembly menu --- src/gui/Src/BasicView/Disassembly.cpp | 6 +++--- src/gui/Src/BasicView/Disassembly.h | 1 + src/gui/Src/Gui/CPUDisassembly.cpp | 25 +++++++++++++++++++++++++ src/gui/Src/Gui/CPUDisassembly.h | 1 + 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/gui/Src/BasicView/Disassembly.cpp b/src/gui/Src/BasicView/Disassembly.cpp index bd9f54db..94f3a008 100644 --- a/src/gui/Src/BasicView/Disassembly.cpp +++ b/src/gui/Src/BasicView/Disassembly.cpp @@ -23,14 +23,13 @@ Disassembly::Disassembly(QWidget* parent) : AbstractTableView(parent), mDisassem mHighlightToken.text = ""; mHighlightingMode = false; - mPermanentHighlightingMode = false; mShowMnemonicBrief = false; int maxModuleSize = (int)ConfigUint("Disassembler", "MaxModuleSize"); Config()->writeUints(); mDisasm = new QBeaEngine(maxModuleSize); - mDisasm->UpdateConfig(); + tokenizerConfigUpdatedSlot(); mCodeFoldingManager = nullptr; duint setting; @@ -147,6 +146,7 @@ void Disassembly::tokenizerConfigUpdatedSlot() { mDisasm->UpdateConfig(); mPermanentHighlightingMode = ConfigBool("Disassembler", "PermanentHighlightingMode"); + mNoCurrentModuleText = ConfigBool("Disassembler", "NoCurrentModuleText"); } /************************************************************************************ @@ -2107,7 +2107,7 @@ QString Disassembly::getAddrText(dsint cur_addr, char label[MAX_LABEL_SIZE], boo if(getLabel && DbgGetLabelAt(cur_addr, SEG_DEFAULT, label_)) //has label { char module[MAX_MODULE_SIZE] = ""; - if(DbgGetModuleAt(cur_addr, module) && !QString(label_).startsWith("JMP.&")) + if(DbgGetModuleAt(cur_addr, module) && !QString(label_).startsWith("JMP.&") && !mNoCurrentModuleText) addrText += " <" + QString(module) + "." + QString(label_) + ">"; else addrText += " <" + QString(label_) + ">"; diff --git a/src/gui/Src/BasicView/Disassembly.h b/src/gui/Src/BasicView/Disassembly.h index 5ff8a736..ca85a781 100644 --- a/src/gui/Src/BasicView/Disassembly.h +++ b/src/gui/Src/BasicView/Disassembly.h @@ -252,6 +252,7 @@ protected: DisassemblyPopup mDisassemblyPopup; CapstoneTokenizer::SingleToken mHighlightToken; bool mPermanentHighlightingMode; + bool mNoCurrentModuleText; }; #endif // DISASSEMBLY_H diff --git a/src/gui/Src/Gui/CPUDisassembly.cpp b/src/gui/Src/Gui/CPUDisassembly.cpp index 8c933985..a1ec8239 100644 --- a/src/gui/Src/Gui/CPUDisassembly.cpp +++ b/src/gui/Src/Gui/CPUDisassembly.cpp @@ -276,6 +276,7 @@ void CPUDisassembly::setupRightClickContextMenu() copyMenu->addAction(makeShortcutAction(DIcon("copy_address.png"), tr("&Address"), SLOT(copyAddressSlot()), "ActionCopyAddress")); copyMenu->addAction(makeShortcutAction(DIcon("copy_address.png"), tr("&RVA"), SLOT(copyRvaSlot()), "ActionCopyRva")); copyMenu->addAction(makeShortcutAction(DIcon("fileoffset.png"), tr("&File Offset"), SLOT(copyFileOffsetSlot()), "ActionCopyFileOffset")); + copyMenu->addAction(makeAction(tr("&Header VA"), SLOT(copyHeaderVaSlot()))); copyMenu->addAction(makeAction(DIcon("copy_disassembly.png"), tr("Disassembly"), SLOT(copyDisassemblySlot()))); copyMenu->addMenu(makeMenu(DIcon("copy_selection.png"), tr("Symbolic Name")), [this](QMenu * menu) @@ -1638,6 +1639,30 @@ void CPUDisassembly::copyFileOffsetSlot() Bridge::CopyToClipboard(clipboard); } +void CPUDisassembly::copyHeaderVaSlot() +{ + QString clipboard = ""; + prepareDataRange(getSelectionStart(), getSelectionEnd(), [&](int i, const Instruction_t & inst) + { + if(i) + clipboard += "\r\n"; + duint addr = rvaToVa(inst.rva); + duint base = DbgFunctions()->ModBaseFromAddr(addr); + if(base) + { + auto expr = QString("mod.headerva(0x%1)").arg(ToPtrString(addr)); + clipboard += ToPtrString(DbgValFromString(expr.toUtf8().constData())); + } + else + { + SimpleWarningBox(this, tr("Error!"), tr("Selection not in a module...")); + return false; + } + return true; + }); + Bridge::CopyToClipboard(clipboard); +} + void CPUDisassembly::copyDisassemblySlot() { QString clipboardHtml = QString("
").arg(font().family()).arg(getRowHeight()); diff --git a/src/gui/Src/Gui/CPUDisassembly.h b/src/gui/Src/Gui/CPUDisassembly.h index f2402457..5d4721a0 100644 --- a/src/gui/Src/Gui/CPUDisassembly.h +++ b/src/gui/Src/Gui/CPUDisassembly.h @@ -86,6 +86,7 @@ public slots: void copyAddressSlot(); void copyRvaSlot(); void copyFileOffsetSlot(); + void copyHeaderVaSlot(); void copyDisassemblySlot(); void labelCopySlot(); void findCommandSlot();