From 1a10ded9a356a659986df28e9ca32083fc97dc41 Mon Sep 17 00:00:00 2001 From: Torusrxxx Date: Thu, 4 Aug 2016 11:16:52 +0000 Subject: [PATCH] prototype of #890 (preview call or jump destination) (#910) * prototype of #890 (preview call or jump destination * resolve issue with call dword ptr ds:[MessageBoxA] * tidy up headers * hide tooltip when mouse is outside disassembly view --- src/dbg/stackinfo.cpp | 4 +- src/dbg_types.h | 6 +- src/gui/Src/BasicView/AbstractTableView.cpp | 19 +++ src/gui/Src/BasicView/AbstractTableView.h | 23 +--- src/gui/Src/BasicView/Disassembly.cpp | 84 ++++++++++-- src/gui/Src/BasicView/Disassembly.h | 14 +- src/gui/Src/Disassembler/QBeaEngine.cpp | 10 +- src/gui/Src/Disassembler/QBeaEngine.h | 3 +- src/gui/Src/Disassembler/capstone_gui.cpp | 3 +- src/gui/Src/Gui/AppearanceDialog.cpp | 2 + src/gui/Src/Gui/AttachDialog.h | 5 +- src/gui/Src/Gui/BreakpointsView.cpp | 1 + src/gui/Src/Gui/BreakpointsView.h | 4 +- src/gui/Src/Gui/CPUDisassembly.cpp | 19 ++- src/gui/Src/Gui/CPUDisassembly.h | 4 +- src/gui/Src/Gui/CPUDump.cpp | 4 +- src/gui/Src/Gui/CPUDump.h | 4 +- src/gui/Src/Gui/CPUInfoBox.h | 1 - src/gui/Src/Gui/CPUSideBar.cpp | 2 +- src/gui/Src/Gui/CPUStack.cpp | 17 ++- src/gui/Src/Gui/CPUStack.h | 4 +- src/gui/Src/Gui/CPUWidget.cpp | 9 ++ src/gui/Src/Gui/CPUWidget.h | 18 +-- src/gui/Src/Gui/CalculatorDialog.cpp | 1 + src/gui/Src/Gui/CalculatorDialog.h | 3 +- src/gui/Src/Gui/CloseDialog.cpp | 1 + src/gui/Src/Gui/CloseDialog.h | 3 +- src/gui/Src/Gui/ColumnReorderDialog.cpp | 1 + src/gui/Src/Gui/ColumnReorderDialog.h | 3 +- src/gui/Src/Gui/CommandHelpView.cpp | 2 + src/gui/Src/Gui/CommandHelpView.h | 6 +- src/gui/Src/Gui/DisassemblyPopup.cpp | 143 ++++++++++++++++++++ src/gui/Src/Gui/DisassemblyPopup.h | 48 +++++++ src/gui/Src/Gui/FavouriteTools.cpp | 1 + src/gui/Src/Gui/FavouriteTools.h | 3 +- src/gui/Src/Gui/HandlesView.cpp | 3 + src/gui/Src/Gui/HandlesView.h | 9 +- src/gui/Src/Gui/HexEditDialog.cpp | 1 + src/gui/Src/Gui/HexLineEdit.cpp | 2 +- src/gui/Src/Gui/HexLineEdit.h | 1 - src/gui/Src/Gui/MainWindow.cpp | 29 ++++ src/gui/Src/Gui/MainWindow.h | 56 ++++---- src/gui/Src/Gui/RegistersView.cpp | 1 + src/gui/Src/Gui/SelectFields.h | 3 +- src/gui/Src/Gui/SymbolView.cpp | 1 + src/gui/Src/Gui/SymbolView.h | 6 +- src/gui/Src/Gui/TabBar.cpp | 1 + src/gui/Src/Gui/TabBar.h | 2 - src/gui/Src/Gui/TabWidget.cpp | 3 + src/gui/Src/Gui/TabWidget.h | 3 - src/gui/Src/Gui/TimeWastedCounter.cpp | 1 + src/gui/Src/Gui/TimeWastedCounter.h | 3 +- src/gui/Src/Gui/WordEditDialog.cpp | 1 + src/gui/Src/Gui/WordEditDialog.h | 4 +- src/gui/Src/Imports.h | 6 + src/gui/Src/Memory/MemoryPage.cpp | 8 +- src/gui/Src/Memory/MemoryPage.h | 8 +- src/gui/Src/QEntropyView/QEntropyView.h | 3 +- src/gui/Src/QHexEdit/ArrayCommand.cpp | 1 + src/gui/Src/QHexEdit/ArrayCommand.h | 4 +- src/gui/Src/QHexEdit/QHexEdit.cpp | 1 + src/gui/Src/QHexEdit/QHexEdit.h | 4 +- src/gui/Src/QHexEdit/QHexEditPrivate.h | 1 + src/gui/Src/QHexEdit/XByteArray.cpp | 2 +- src/gui/Src/QHexEdit/XByteArray.h | 8 +- src/gui/Src/Utils/Configuration.cpp | 3 + src/gui/Src/Utils/Configuration.h | 5 +- src/gui/Src/Utils/EncodeMap.h | 4 +- src/gui/Src/Utils/MiscUtil.cpp | 6 - src/gui/Src/Utils/MiscUtil.h | 6 +- src/gui/Src/Utils/RichTextPainter.cpp | 2 + src/gui/Src/Utils/RichTextPainter.h | 6 +- src/gui/Src/Utils/StringUtil.cpp | 22 +++ src/gui/Src/Utils/StringUtil.h | 22 +-- src/gui/Src/main.cpp | 3 + src/gui/x64dbg.pro | 6 +- 76 files changed, 567 insertions(+), 169 deletions(-) create mode 100644 src/gui/Src/Gui/DisassemblyPopup.cpp create mode 100644 src/gui/Src/Gui/DisassemblyPopup.h diff --git a/src/dbg/stackinfo.cpp b/src/dbg/stackinfo.cpp index bff32827c..c05b644eb 100644 --- a/src/dbg/stackinfo.cpp +++ b/src/dbg/stackinfo.cpp @@ -25,7 +25,7 @@ void stackupdateseh() if(ExHandlerGetSEH(SEHList)) { STACK_COMMENT comment; - strcpy_s(comment.color, "#AE81FF"); //TODO: customize this color + strcpy_s(comment.color, "!sehclr"); // Special token for SEH chain color. auto count = SEHList.size(); for(duint i = 0; i < count; i++) { @@ -104,7 +104,7 @@ bool stackcommentget(duint addr, STACK_COMMENT* comment) } else sprintf_s(comment->comment, "return to %s from ???", returnToAddr); - strcpy_s(comment->color, "#ff0000"); //TODO: customize this color + strcpy_s(comment->color, "!rtnclr"); // Special token for return address color; return true; } diff --git a/src/dbg_types.h b/src/dbg_types.h index c2f4d8ea9..8ff7c429e 100644 --- a/src/dbg_types.h +++ b/src/dbg_types.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef _DBG_TYPES_H_ +#define _DBG_TYPES_H_ /***************************************************************/ // @@ -38,4 +39,5 @@ typedef unsigned int uint32; typedef long long int64; typedef unsigned long long uint64; -typedef unsigned char byte_t; \ No newline at end of file +typedef unsigned char byte_t; +#endif //_DBG_TYPES_H_ diff --git a/src/gui/Src/BasicView/AbstractTableView.cpp b/src/gui/Src/BasicView/AbstractTableView.cpp index 8da8f7db8..02dc7ceb7 100644 --- a/src/gui/Src/BasicView/AbstractTableView.cpp +++ b/src/gui/Src/BasicView/AbstractTableView.cpp @@ -2,6 +2,25 @@ #include #include "Configuration.h" #include "ColumnReorderDialog.h" +#include "CachedFontMetrics.h" + +AbstractTableScrollBar::AbstractTableScrollBar(QScrollBar* scrollbar) +{ + setOrientation(scrollbar->orientation()); + setParent(scrollbar->parentWidget()); +} + +void AbstractTableScrollBar::enterEvent(QEvent* event) +{ + Q_UNUSED(event); + QApplication::setOverrideCursor(Qt::ArrowCursor); +} + +void AbstractTableScrollBar::leaveEvent(QEvent* event) +{ + Q_UNUSED(event); + QApplication::restoreOverrideCursor(); +} AbstractTableView::AbstractTableView(QWidget* parent) : QAbstractScrollArea(parent), diff --git a/src/gui/Src/BasicView/AbstractTableView.h b/src/gui/Src/BasicView/AbstractTableView.h index efe0c8e05..3ca332ae7 100644 --- a/src/gui/Src/BasicView/AbstractTableView.h +++ b/src/gui/Src/BasicView/AbstractTableView.h @@ -12,31 +12,18 @@ #include "Configuration.h" #include "MenuBuilder.h" #include "QActionLambda.h" -#include "CachedFontMetrics.h" #include "MiscUtil.h" +class CachedFontMetrics; + //Hacky class that fixes a really annoying cursor problem class AbstractTableScrollBar : public QScrollBar { Q_OBJECT public: - AbstractTableScrollBar(QScrollBar* scrollbar) - { - setOrientation(scrollbar->orientation()); - setParent(scrollbar->parentWidget()); - } - - void enterEvent(QEvent* event) - { - Q_UNUSED(event); - QApplication::setOverrideCursor(Qt::ArrowCursor); - } - - void leaveEvent(QEvent* event) - { - Q_UNUSED(event); - QApplication::restoreOverrideCursor(); - } + AbstractTableScrollBar(QScrollBar* scrollbar); + void enterEvent(QEvent* event); + void leaveEvent(QEvent* event); }; class AbstractTableView : public QAbstractScrollArea diff --git a/src/gui/Src/BasicView/Disassembly.cpp b/src/gui/Src/BasicView/Disassembly.cpp index 769d32a3e..96f1aa0e0 100644 --- a/src/gui/Src/BasicView/Disassembly.cpp +++ b/src/gui/Src/BasicView/Disassembly.cpp @@ -2,8 +2,10 @@ #include "Configuration.h" #include "Bridge.h" #include "MainWindow.h" +#include "QBeaEngine.h" +#include "MemoryPage.h" -Disassembly::Disassembly(QWidget* parent) : AbstractTableView(parent) +Disassembly::Disassembly(QWidget* parent) : AbstractTableView(parent), mDisassemblyPopup(this) { mMemPage = new MemoryPage(0, 0); @@ -28,6 +30,8 @@ Disassembly::Disassembly(QWidget* parent) : AbstractTableView(parent) mDisasm = new QBeaEngine(maxModuleSize); mDisasm->UpdateConfig(); + mCodeFoldingManager = nullptr; + mPopupEnabled = true; mIsLastInstDisplayed = false; mGuiState = Disassembly::NoState; @@ -406,7 +410,8 @@ QString Disassembly::paintContent(QPainter* painter, dsint rowBase, int rowOffse funcsize += charwidth; //draw jump arrows - int jumpsize = paintJumpsGraphic(painter, x + funcsize, y - 1, wRVA, mInstBuffer.at(rowOffset).branchType != Instruction_t::BranchType::None); //jump line + Instruction_t::BranchType branchType = mInstBuffer.at(rowOffset).branchType; + int jumpsize = paintJumpsGraphic(painter, x + funcsize, y - 1, wRVA, branchType != Instruction_t::None && branchType != Instruction_t::Call); //jump line //draw bytes RichTextPainter::List richBytes; @@ -635,6 +640,32 @@ void Disassembly::mouseMoveEvent(QMouseEvent* event) } } } + else if(mGuiState == Disassembly::NoState) + { + if(!mHighlightingMode && mPopupEnabled) + { + bool popupShown = false; + if(event->y() > getHeaderHeight() && getColumnIndexFromX(event->x()) == 2) + { + int rowOffset = getIndexOffsetFromY(transY(event->y())); + if(rowOffset < mInstBuffer.size()) + { + auto & instruction = mInstBuffer[rowOffset]; + if(instruction.branchType != Instruction_t::None) + { + duint addr = instruction.branchDestination; + if(addr != 0 && (addr - mMemPage->getBase() < mInstBuffer.front().rva || addr - mMemPage->getBase() > mInstBuffer.back().rva)) + { + ShowDisassemblyPopup(addr, event->x(), event->y()); + popupShown = true; + } + } + } + } + if(popupShown == false) + ShowDisassemblyPopup(0, 0, 0); // hide popup + } + } if(wAccept == true) AbstractTableView::mouseMoveEvent(event); @@ -748,6 +779,12 @@ void Disassembly::mouseReleaseEvent(QMouseEvent* event) AbstractTableView::mouseReleaseEvent(event); } +void Disassembly::leaveEvent(QEvent* event) +{ + Q_UNUSED(event); + ShowDisassemblyPopup(0, 0, 0); +} + /************************************************************************************ Keyboard Management ************************************************************************************/ @@ -869,7 +906,7 @@ int Disassembly::paintJumpsGraphic(QPainter* painter, int x, int y, dsint addr, GraphicDump_t wPict = GD_Nothing; - if(branchType != Instruction_t::None) + if(branchType != Instruction_t::None && branchType != Instruction_t::Call) { dsint base = mMemPage->getBase(); dsint destVA = DbgGetBranchDestination(rvaToVa(selHeadRVA)); @@ -1217,24 +1254,34 @@ dsint Disassembly::getPreviousInstructionRVA(dsint rva, duint count) * * @param[in] rva Instruction RVA * @param[in] count Instruction count + * @param[in] isGlobal Whether it rejects rva beyond current page * * @return RVA of count-th instructions after the given instruction RVA. */ -dsint Disassembly::getNextInstructionRVA(dsint rva, duint count) +dsint Disassembly::getNextInstructionRVA(dsint rva, duint count, bool isGlobal) { QByteArray wBuffer; dsint wRemainingBytes; dsint wMaxByteCountToRead; dsint wNewRVA; - if(mMemPage->getSize() < (duint)rva) - return rva; - wRemainingBytes = mMemPage->getSize() - rva; + if(!isGlobal) + { + if(mMemPage->getSize() < (duint)rva) + return rva; + wRemainingBytes = mMemPage->getSize() - rva; - wMaxByteCountToRead = 16 * (count + 1); - if(mCodeFoldingManager) - wMaxByteCountToRead += mCodeFoldingManager->getFoldedSize(rvaToVa(rva), rvaToVa(rva + wMaxByteCountToRead)); - wMaxByteCountToRead = wRemainingBytes > wMaxByteCountToRead ? wMaxByteCountToRead : wRemainingBytes; + wMaxByteCountToRead = 16 * (count + 1); + if(mCodeFoldingManager) + wMaxByteCountToRead += mCodeFoldingManager->getFoldedSize(rvaToVa(rva), rvaToVa(rva + wMaxByteCountToRead)); + wMaxByteCountToRead = wRemainingBytes > wMaxByteCountToRead ? wMaxByteCountToRead : wRemainingBytes; + } + else + { + wMaxByteCountToRead = 16 * (count + 1); + if(mCodeFoldingManager) + wMaxByteCountToRead += mCodeFoldingManager->getFoldedSize(rvaToVa(rva), rvaToVa(rva + wMaxByteCountToRead)); + } wBuffer.resize(wMaxByteCountToRead); mMemPage->read(wBuffer.data(), rva, wBuffer.size()); @@ -1860,3 +1907,18 @@ void Disassembly::unfold(dsint rva) viewport()->update(); } } + + +void Disassembly::ShowDisassemblyPopup(duint addr, int x, int y) +{ + if(mDisassemblyPopup.getAddress() == addr) + return; + if(DbgMemIsValidReadPtr(addr)) + { + mDisassemblyPopup.move(mapToGlobal(QPoint(x + 20, y + mFontMetrics->height() * 2))); + mDisassemblyPopup.setAddress(addr); + mDisassemblyPopup.show(); + } + else + mDisassemblyPopup.hide(); +} diff --git a/src/gui/Src/BasicView/Disassembly.h b/src/gui/Src/BasicView/Disassembly.h index 427e0e2e5..41dae4825 100644 --- a/src/gui/Src/BasicView/Disassembly.h +++ b/src/gui/Src/BasicView/Disassembly.h @@ -2,9 +2,11 @@ #define DISASSEMBLY_H #include "AbstractTableView.h" -#include "QBeaEngine.h" -#include "MemoryPage.h" -#include "CodeFolding.h" +#include "DisassemblyPopup.h" + +class CodeFoldingHelper; +class QBeaEngine; +class MemoryPage; class Disassembly : public AbstractTableView { @@ -24,6 +26,7 @@ public: void mouseMoveEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); + void leaveEvent(QEvent* event) override; // Keyboard Management void keyPressEvent(QKeyEvent* event); @@ -50,7 +53,7 @@ public: // Instructions Management dsint getPreviousInstructionRVA(dsint rva, duint count); - dsint getNextInstructionRVA(dsint rva, duint count); + dsint getNextInstructionRVA(dsint rva, duint count, bool isGlobal = false); dsint getInstructionRVA(dsint index, dsint count); Instruction_t DisassembleAt(dsint rva); Instruction_t DisassembleAt(dsint rva, dsint count); @@ -100,6 +103,7 @@ public: //misc void setCodeFoldingManager(CodeFoldingHelper* CodeFoldingManager); void unfold(dsint rva); + void ShowDisassemblyPopup(duint addr, int x, int y); signals: void selectionChanged(dsint parVA); @@ -203,11 +207,13 @@ protected: duint mRvaDisplayBase; dsint mRvaDisplayPageBase; bool mHighlightingMode; + bool mPopupEnabled; MemoryPage* mMemPage; QBeaEngine* mDisasm; bool mShowMnemonicBrief; XREF_INFO mXrefInfo; CodeFoldingHelper* mCodeFoldingManager; + DisassemblyPopup mDisassemblyPopup; }; #endif // DISASSEMBLY_H diff --git a/src/gui/Src/Disassembler/QBeaEngine.cpp b/src/gui/Src/Disassembler/QBeaEngine.cpp index 7d3e6c183..50a50afb4 100644 --- a/src/gui/Src/Disassembler/QBeaEngine.cpp +++ b/src/gui/Src/Disassembler/QBeaEngine.cpp @@ -152,7 +152,7 @@ ulong QBeaEngine::DisassembleNext(byte_t* data, duint base, duint size, duint ip } else { - if(!cp.DisassembleSafe(0, pdata, (int)size)) + if(!cp.DisassembleSafe(ip + base, pdata, (int)size)) cmdsize = 1; else cmdsize = cp.Size(); @@ -198,7 +198,7 @@ Instruction_t QBeaEngine::DisassembleAt(byte_t* data, duint size, duint origBase return DecodeDataAt(data, size, origBase, origInstRVA, type); auto branchType = Instruction_t::None; - if(success && (cp.InGroup(CS_GRP_JUMP) || cp.IsLoop())) + if(success && (cp.InGroup(CS_GRP_JUMP) || cp.IsLoop() || cp.InGroup(CS_GRP_CALL))) { switch(cp.GetId()) { @@ -206,6 +206,10 @@ Instruction_t QBeaEngine::DisassembleAt(byte_t* data, duint size, duint origBase case X86_INS_LJMP: branchType = Instruction_t::Unconditional; break; + case X86_INS_CALL: + case X86_INS_LCALL: + branchType = Instruction_t::Call; + break; default: branchType = Instruction_t::Conditional; break; @@ -221,7 +225,7 @@ Instruction_t QBeaEngine::DisassembleAt(byte_t* data, duint size, duint origBase else wInst.length = len; wInst.branchType = branchType; - wInst.branchDestination = cp.BranchDestination(); + wInst.branchDestination = DbgGetBranchDestination(origBase + origInstRVA); wInst.tokens = cap; return wInst; diff --git a/src/gui/Src/Disassembler/QBeaEngine.h b/src/gui/Src/Disassembler/QBeaEngine.h index c24f09830..18a0a7cd4 100644 --- a/src/gui/Src/Disassembler/QBeaEngine.h +++ b/src/gui/Src/Disassembler/QBeaEngine.h @@ -13,7 +13,8 @@ struct Instruction_t { None, Conditional, - Unconditional + Unconditional, + Call }; Instruction_t() diff --git a/src/gui/Src/Disassembler/capstone_gui.cpp b/src/gui/Src/Disassembler/capstone_gui.cpp index 0bd48b2c0..9830a9ab8 100644 --- a/src/gui/Src/Disassembler/capstone_gui.cpp +++ b/src/gui/Src/Disassembler/capstone_gui.cpp @@ -1,6 +1,7 @@ #include "capstone_gui.h" #include "Configuration.h" #include "StringUtil.h" +#include "CachedFontMetrics.h" CapstoneTokenizer::CapstoneTokenizer(int maxModuleLength) : _maxModuleLength(maxModuleLength), @@ -451,9 +452,7 @@ bool CapstoneTokenizer::tokenizeImmOperand(const cs_x86_op & op) duint value = duint(op.imm); auto valueType = TokenType::Value; if(_cp.InGroup(CS_GRP_JUMP) || _cp.InGroup(CS_GRP_CALL) || _cp.IsLoop()) - { valueType = TokenType::Address; - } auto tokenValue = TokenValue(op.size, value); addToken(valueType, printValue(tokenValue, true, _maxModuleLength), tokenValue); return true; diff --git a/src/gui/Src/Gui/AppearanceDialog.cpp b/src/gui/Src/Gui/AppearanceDialog.cpp index 6fa2748fe..66a55665d 100644 --- a/src/gui/Src/Gui/AppearanceDialog.cpp +++ b/src/gui/Src/Gui/AppearanceDialog.cpp @@ -518,6 +518,8 @@ void AppearanceDialog::colorInfoListInit() colorInfoListAppend(tr("Addresses"), "StackAddressColor", "StackAddressBackgroundColor"); colorInfoListAppend(tr("Selected Addresses"), "StackSelectedAddressColor", "StackSelectedAddressBackgroundColor"); colorInfoListAppend(tr("Labels"), "StackLabelColor", "StackLabelBackgroundColor"); + colorInfoListAppend(tr("Return To Comment"), "StackReturnToColor", ""); + colorInfoListAppend(tr("SEH Chain Comment"), "StackSEHChainColor", ""); colorInfoListAppend(tr("User Stack Frame Line"), "StackFrameColor", ""); colorInfoListAppend(tr("System Stack Frame Line"), "StackFrameSystemColor", ""); diff --git a/src/gui/Src/Gui/AttachDialog.h b/src/gui/Src/Gui/AttachDialog.h index 11086d709..695f3fc11 100644 --- a/src/gui/Src/Gui/AttachDialog.h +++ b/src/gui/Src/Gui/AttachDialog.h @@ -2,7 +2,10 @@ #define ATTACHDIALOG_H #include -#include "SearchListView.h" + +class SearchListView; +class QMenu; +class QAction; namespace Ui { diff --git a/src/gui/Src/Gui/BreakpointsView.cpp b/src/gui/Src/Gui/BreakpointsView.cpp index 4fc9c5713..d2a7268d5 100644 --- a/src/gui/Src/Gui/BreakpointsView.cpp +++ b/src/gui/Src/Gui/BreakpointsView.cpp @@ -3,6 +3,7 @@ #include "Bridge.h" #include "Breakpoints.h" #include "LineEditDialog.h" +#include "StdTable.h" BreakpointsView::BreakpointsView(QWidget* parent) : QWidget(parent) { diff --git a/src/gui/Src/Gui/BreakpointsView.h b/src/gui/Src/Gui/BreakpointsView.h index 07429ee1a..c9b4ba009 100644 --- a/src/gui/Src/Gui/BreakpointsView.h +++ b/src/gui/Src/Gui/BreakpointsView.h @@ -4,7 +4,9 @@ #include #include #include -#include "StdTable.h" +#include "Imports.h" + +class StdTable; class BreakpointsView : public QWidget { diff --git a/src/gui/Src/Gui/CPUDisassembly.cpp b/src/gui/Src/Gui/CPUDisassembly.cpp index 843afaec5..1a4c57bd2 100644 --- a/src/gui/Src/Gui/CPUDisassembly.cpp +++ b/src/gui/Src/Gui/CPUDisassembly.cpp @@ -1,18 +1,23 @@ #include "CPUDisassembly.h" +#include "CPUSideBar.h" #include "CPUWidget.h" +#include "CPUMultiDump.h" #include #include #include #include "Configuration.h" #include "Bridge.h" +#include "Imports.h" #include "LineEditDialog.h" #include "WordEditDialog.h" +#include "GotoDialog.h" #include "HexEditDialog.h" #include "YaraRuleSelectionDialog.h" #include "AssembleDialog.h" #include "StringUtil.h" #include "Breakpoints.h" #include "XrefBrowseDialog.h" +#include "SourceViewerManager.h" #include "MiscUtil.h" CPUDisassembly::CPUDisassembly(CPUWidget* parent) : Disassembly(parent) @@ -350,7 +355,12 @@ void CPUDisassembly::setupRightClickContextMenu() }); mMenuBuilder->addAction(makeShortcutAction(DIcon("highlight.png"), tr("&Highlighting mode"), SLOT(enableHighlightingModeSlot()), "ActionHighlightingMode")); - mMenuBuilder->addSeparator(); + QAction* togglePreview = makeShortcutAction(tr("Disable Branch Destination Preview"), SLOT(togglePreviewSlot()), "ActionToggleDestinationPreview"); + mMenuBuilder->addAction(togglePreview, [this, togglePreview](QMenu*) + { + togglePreview->setText(mPopupEnabled ? tr("Disable Branch Destination Preview") : tr("Enable Branch Destination Preview")); + return true; + }); MenuBuilder* labelMenu = new MenuBuilder(this); labelMenu->addAction(makeShortcutAction(tr("Label Current Address"), SLOT(setLabelSlot()), "ActionSetLabel")); @@ -1660,3 +1670,10 @@ void CPUDisassembly::graphSlot() DbgCmdExecDirect(QString("graph %1").arg(ToPtrString(rvaToVa(getSelectionStart()))).toUtf8().constData()); emit displayGraphWidget(); } + +void CPUDisassembly::togglePreviewSlot() +{ + if(mPopupEnabled == true) + ShowDisassemblyPopup(0, 0, 0); + mPopupEnabled = !mPopupEnabled; +} diff --git a/src/gui/Src/Gui/CPUDisassembly.h b/src/gui/Src/Gui/CPUDisassembly.h index f15b266d2..c871951d8 100644 --- a/src/gui/Src/Gui/CPUDisassembly.h +++ b/src/gui/Src/Gui/CPUDisassembly.h @@ -2,11 +2,10 @@ #define CPUDISASSEMBLY_H #include "Disassembly.h" -#include "GotoDialog.h" -#include "SourceViewerManager.h" // Needed forward declaration for parent container class class CPUWidget; +class GotoDialog; class CPUDisassembly : public Disassembly { @@ -104,6 +103,7 @@ public slots: void setEncodeTypeSlot(); void setEncodeTypeRangeSlot(); void graphSlot(); + void togglePreviewSlot(); protected: void paintEvent(QPaintEvent* event); diff --git a/src/gui/Src/Gui/CPUDump.cpp b/src/gui/Src/Gui/CPUDump.cpp index 705ee531c..ec8c829f9 100644 --- a/src/gui/Src/Gui/CPUDump.cpp +++ b/src/gui/Src/Gui/CPUDump.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "Configuration.h" #include "Bridge.h" #include "LineEditDialog.h" @@ -10,9 +11,10 @@ #include "DataCopyDialog.h" #include "EntropyDialog.h" #include "CPUMultiDump.h" +#include "GotoDialog.h" +#include "CPUDisassembly.h" #include "WordEditDialog.h" #include "CodepageSelectionDialog.h" -#include #include "MiscUtil.h" CPUDump::CPUDump(CPUDisassembly* disas, CPUMultiDump* multiDump, QWidget* parent) : HexDump(parent) diff --git a/src/gui/Src/Gui/CPUDump.h b/src/gui/Src/Gui/CPUDump.h index 1f236b4d9..aee1b466e 100644 --- a/src/gui/Src/Gui/CPUDump.h +++ b/src/gui/Src/Gui/CPUDump.h @@ -2,11 +2,11 @@ #define CPUDUMP_H #include "HexDump.h" -#include "GotoDialog.h" -#include "CPUDisassembly.h" //forward declaration class CPUMultiDump; +class CPUDisassembly; +class GotoDialog; class CPUDump : public HexDump { diff --git a/src/gui/Src/Gui/CPUInfoBox.h b/src/gui/Src/Gui/CPUInfoBox.h index da247e5d8..473692721 100644 --- a/src/gui/Src/Gui/CPUInfoBox.h +++ b/src/gui/Src/Gui/CPUInfoBox.h @@ -2,7 +2,6 @@ #define INFOBOX_H #include "StdTable.h" -#include class CPUInfoBox : public StdTable { diff --git a/src/gui/Src/Gui/CPUSideBar.cpp b/src/gui/Src/Gui/CPUSideBar.cpp index 00da35738..1bf00d775 100644 --- a/src/gui/Src/Gui/CPUSideBar.cpp +++ b/src/gui/Src/Gui/CPUSideBar.cpp @@ -118,7 +118,7 @@ bool CPUSideBar::isJump(int i) const { const Instruction_t & instr = mInstrBuffer->at(i); Instruction_t::BranchType branchType = instr.branchType; - if(branchType != Instruction_t::None) + if(branchType == Instruction_t::Unconditional || branchType == Instruction_t::Conditional) { duint start = mDisas->getBase(); duint end = start + mDisas->getSize(); diff --git a/src/gui/Src/Gui/CPUStack.cpp b/src/gui/Src/Gui/CPUStack.cpp index 17d166d96..91854902d 100644 --- a/src/gui/Src/Gui/CPUStack.cpp +++ b/src/gui/Src/Gui/CPUStack.cpp @@ -6,6 +6,7 @@ #include "HexEditDialog.h" #include "WordEditDialog.h" #include "CPUMultiDump.h" +#include "GotoDialog.h" CPUStack::CPUStack(CPUMultiDump* multiDump, QWidget* parent) : HexDump(parent) { @@ -59,6 +60,8 @@ void CPUStack::updateColors() backgroundColor = ConfigColor("StackBackgroundColor"); textColor = ConfigColor("StackTextColor"); selectionColor = ConfigColor("StackSelectionColor"); + mStackReturnToColor = ConfigColor("StackReturnToColor"); + mStackSEHChainColor = ConfigColor("StackSEHChainColor"); mUserStackFrameColor = ConfigColor("StackFrameColor"); mSystemStackFrameColor = ConfigColor("StackFrameSystemColor"); } @@ -366,7 +369,19 @@ void CPUStack::getColumnRichText(int col, dsint rva, RichTextPainter::List & ric if(wActiveStack) { if(*comment.color) - curData.textColor = QColor(QString(comment.color)); + { + if(comment.color[0] == '!') + { + if(strcmp(comment.color, "!sehclr") == 0) + curData.textColor = QColor("#AE81FF"); + else if(strcmp(comment.color, "!rtnclr") == 0) + curData.textColor = QColor("#FF0000"); + else + curData.textColor = textColor; + } + else + curData.textColor = QColor(QString(comment.color)); + } else curData.textColor = textColor; } diff --git a/src/gui/Src/Gui/CPUStack.h b/src/gui/Src/Gui/CPUStack.h index ebd30907b..1fe48c827 100644 --- a/src/gui/Src/Gui/CPUStack.h +++ b/src/gui/Src/Gui/CPUStack.h @@ -2,10 +2,10 @@ #define CPUSTACK_H #include "HexDump.h" -#include "GotoDialog.h" //forward declaration class CPUMultiDump; +class GotoDialog; class CPUStack : public HexDump { @@ -132,6 +132,8 @@ private: CPUMultiDump* mMultiDump; QColor mUserStackFrameColor; QColor mSystemStackFrameColor; + QColor mStackReturnToColor; + QColor mStackSEHChainColor; struct CPUCallStack { duint addr; diff --git a/src/gui/Src/Gui/CPUWidget.cpp b/src/gui/Src/Gui/CPUWidget.cpp index 639153d1f..14e14ad1f 100644 --- a/src/gui/Src/Gui/CPUWidget.cpp +++ b/src/gui/Src/Gui/CPUWidget.cpp @@ -1,5 +1,14 @@ #include "CPUWidget.h" #include "ui_CPUWidget.h" +#include +#include +#include "CPUSideBar.h" +#include "CPUDisassembly.h" +#include "CPUMultiDump.h" +#include "CPUStack.h" +#include "RegistersView.h" +#include "CPUInfoBox.h" +#include "CPUArgumentWidget.h" #include "Configuration.h" CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) diff --git a/src/gui/Src/Gui/CPUWidget.h b/src/gui/Src/Gui/CPUWidget.h index 8df277679..a42b9268c 100644 --- a/src/gui/Src/Gui/CPUWidget.h +++ b/src/gui/Src/Gui/CPUWidget.h @@ -2,15 +2,15 @@ #define CPUWIDGET_H #include -#include -#include -#include "CPUSideBar.h" -#include "CPUDisassembly.h" -#include "CPUMultiDump.h" -#include "CPUStack.h" -#include "RegistersView.h" -#include "CPUInfoBox.h" -#include "CPUArgumentWidget.h" + +class QVBoxLayout; +class CPUSideBar; +class CPUDisassembly; +class CPUMultiDump; +class CPUStack; +class RegistersView; +class CPUInfoBox; +class CPUArgumentWidget; namespace Ui { diff --git a/src/gui/Src/Gui/CalculatorDialog.cpp b/src/gui/Src/Gui/CalculatorDialog.cpp index d0408578e..a8cb94161 100644 --- a/src/gui/Src/Gui/CalculatorDialog.cpp +++ b/src/gui/Src/Gui/CalculatorDialog.cpp @@ -1,5 +1,6 @@ #include "CalculatorDialog.h" #include "ui_CalculatorDialog.h" +#include "ValidateExpressionThread.h" CalculatorDialog::CalculatorDialog(QWidget* parent) : QDialog(parent), ui(new Ui::CalculatorDialog) { diff --git a/src/gui/Src/Gui/CalculatorDialog.h b/src/gui/Src/Gui/CalculatorDialog.h index 63bd61562..d2f41fd58 100644 --- a/src/gui/Src/Gui/CalculatorDialog.h +++ b/src/gui/Src/Gui/CalculatorDialog.h @@ -2,9 +2,10 @@ #define CALCULATORDIALOG_H #include -#include "ValidateExpressionThread.h" #include "Imports.h" +class ValidateExpressionThread; + namespace Ui { class CalculatorDialog; diff --git a/src/gui/Src/Gui/CloseDialog.cpp b/src/gui/Src/Gui/CloseDialog.cpp index ebdbf7c5e..c2489f46d 100644 --- a/src/gui/Src/Gui/CloseDialog.cpp +++ b/src/gui/Src/Gui/CloseDialog.cpp @@ -1,6 +1,7 @@ #include "CloseDialog.h" #include "ui_CloseDialog.h" #include "MiscUtil.h" +#include CloseDialog::CloseDialog(QWidget* parent) : QDialog(parent), ui(new Ui::CloseDialog) { diff --git a/src/gui/Src/Gui/CloseDialog.h b/src/gui/Src/Gui/CloseDialog.h index 19bc61044..6996ae738 100644 --- a/src/gui/Src/Gui/CloseDialog.h +++ b/src/gui/Src/Gui/CloseDialog.h @@ -2,7 +2,8 @@ #define CLOSEDIALOG_H #include -#include + +class QCloseEvent; namespace Ui { diff --git a/src/gui/Src/Gui/ColumnReorderDialog.cpp b/src/gui/Src/Gui/ColumnReorderDialog.cpp index 0b06792a5..b17a36295 100644 --- a/src/gui/Src/Gui/ColumnReorderDialog.cpp +++ b/src/gui/Src/Gui/ColumnReorderDialog.cpp @@ -1,5 +1,6 @@ #include "ColumnReorderDialog.h" #include "ui_ColumnReorderDialog.h" +#include "AbstractTableView.h" #include ColumnReorderDialog::ColumnReorderDialog(AbstractTableView* parent) : diff --git a/src/gui/Src/Gui/ColumnReorderDialog.h b/src/gui/Src/Gui/ColumnReorderDialog.h index fea13a338..7ef73b8f3 100644 --- a/src/gui/Src/Gui/ColumnReorderDialog.h +++ b/src/gui/Src/Gui/ColumnReorderDialog.h @@ -1,9 +1,10 @@ #ifndef COLUMNREORDERDIALOG_H #define COLUMNREORDERDIALOG_H -#include "AbstractTableView.h" #include +class AbstractTableView; + namespace Ui { class ColumnReorderDialog; diff --git a/src/gui/Src/Gui/CommandHelpView.cpp b/src/gui/Src/Gui/CommandHelpView.cpp index 255da2af5..dbe2dff45 100644 --- a/src/gui/Src/Gui/CommandHelpView.cpp +++ b/src/gui/Src/Gui/CommandHelpView.cpp @@ -1,5 +1,7 @@ +#include #include "CommandHelpView.h" #include "ui_CommandHelpView.h" +#include "SearchListView.h" CommandHelpView::CommandHelpView(QWidget* parent) : QWidget(parent), ui(new Ui::CommandHelpView) { diff --git a/src/gui/Src/Gui/CommandHelpView.h b/src/gui/Src/Gui/CommandHelpView.h index 3bdde52d8..0f67ee725 100644 --- a/src/gui/Src/Gui/CommandHelpView.h +++ b/src/gui/Src/Gui/CommandHelpView.h @@ -2,8 +2,10 @@ #define COMMANDHELPVIEW_H #include -#include -#include "SearchListView.h" + +class QVBoxLayout; +class SearchListView; +class StdTable; namespace Ui { diff --git a/src/gui/Src/Gui/DisassemblyPopup.cpp b/src/gui/Src/Gui/DisassemblyPopup.cpp new file mode 100644 index 000000000..ce5c3a98f --- /dev/null +++ b/src/gui/Src/Gui/DisassemblyPopup.cpp @@ -0,0 +1,143 @@ +#include "DisassemblyPopup.h" +#include "Disassembly.h" +#include "Configuration.h" +#include "StringUtil.h" +#include + +DisassemblyPopup::DisassemblyPopup(Disassembly* parent) : + QFrame(parent, Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus), + parent(parent), + mFontMetrics(nullptr) +{ + addr = 0; + addrText = nullptr; + connect(Config(), SIGNAL(fontsUpdated()), this, SLOT(updateFont())); + connect(Config(), SIGNAL(colorsUpdated()), this, SLOT(updateColors())); + updateFont(); + updateColors(); + setFrameStyle(QFrame::Panel); + mMaxInstructions = 20; +} + +DisassemblyPopup::~DisassemblyPopup() +{ + +} + +void DisassemblyPopup::updateColors() +{ + disassemblyBackgroundColor = ConfigColor("DisassemblyBackgroundColor"); + labelColor = ConfigColor("DisassemblyLabelColor"); + labelBackgroundColor = ConfigColor("DisassemblyLabelBackgroundColor"); + commentColor = ConfigColor("DisassemblyCommentColor"); + commentBackgroundColor = ConfigColor("DisassemblyCommentBackgroundColor"); + commentAutoColor = ConfigColor("DisassemblyAutoCommentColor"); + commentAutoBackgroundColor = ConfigColor("DisassemblyAutoCommentBackgroundColor"); +} + +void DisassemblyPopup::updateFont() +{ + delete mFontMetrics; + setFont(ConfigFont("Disassembly")); + QFontMetricsF metrics(font()); + mFontMetrics = new CachedFontMetrics(this, font()); + // Update font size, used in layout calculations. + charWidth = mFontMetrics->width('W'); + charHeight = metrics.height(); +} + +void DisassemblyPopup::paintEvent(QPaintEvent* event) +{ + QRect viewportRect(0, 0, width(), height()); + QPainter p(this); + p.setFont(font()); + + // Render background + p.fillRect(viewportRect, disassemblyBackgroundColor); + // Draw Address + p.setPen(QPen(labelColor)); + int addrWidth = mFontMetrics->width(addrText); + p.fillRect(2, 1, addrWidth, charHeight, QBrush(labelBackgroundColor)); + p.drawText(2, 1, addrWidth, charHeight, 0, addrText); + // Draw Comments + if(!addrComment.isEmpty()) + { + int commentWidth = mFontMetrics->width(addrComment); + QBrush background = QBrush(addrCommentAuto ? commentAutoBackgroundColor : commentBackgroundColor); + p.setPen(addrCommentAuto ? commentAutoColor : commentColor); + p.fillRect(2 + addrWidth, 1, commentWidth, charHeight, background); + p.drawText(2 + addrWidth, 1, commentWidth, charHeight, 0, addrComment); + } + // Draw Instructions + int y = charHeight + 1; + for(auto & instruction : mDisassemblyToken) + { + RichTextPainter::paintRichText(&p, 2, y, mWidth - 2, charHeight, 0, instruction, mFontMetrics); + y += charHeight; + } + QFrame::paintEvent(event); +} + +void DisassemblyPopup::setAddress(duint Address) +{ + addr = Address; + mInstBuffer.clear(); + mDisassemblyToken.clear(); + if(addr != 0) + { + mWidth = 1; + // Get RVA + dsint rva = Address - parent->getBase(); + // Prepare RVA of every instruction + unsigned int i = 0; + mInstBuffer.clear(); + QList rvaList; + dsint nextRva = rva; + do + { + dsint nextRva2; + rvaList.append(nextRva); + nextRva2 = parent->getNextInstructionRVA(nextRva, 1, true); + if(nextRva2 == nextRva) + break; + else + nextRva = nextRva2; + i++; + } + while(i < mMaxInstructions); + // Disassemble + parent->prepareDataCount(rvaList, &mInstBuffer); + for(auto & instruction : mInstBuffer) + { + RichTextPainter::List richText; + CapstoneTokenizer::TokenToRichText(instruction.tokens, richText, nullptr); + // Calculate width + int currentInstructionWidth = 0; + for(auto & token : richText) + currentInstructionWidth += mFontMetrics->width(token.text); + mWidth = std::max(mWidth, currentInstructionWidth); + mDisassemblyToken.push_back(std::move(richText)); + } + // Address + addrText = parent->getAddrText(addr, nullptr); + // Comments + GetCommentFormat(addr, addrComment, &addrCommentAuto); + // Calculate width of address + mWidth = std::max(mWidth, mFontMetrics->width(addrText) + mFontMetrics->width(addrComment)); + mWidth += charWidth * 6; + // Resize popup + resize(mWidth + 2, charHeight * int(mDisassemblyToken.size() + 1) + 2); + } + update(); +} + +duint DisassemblyPopup::getAddress() +{ + return addr; +} + +void DisassemblyPopup::hide() +{ + addr = 0; + QFrame::hide(); +} diff --git a/src/gui/Src/Gui/DisassemblyPopup.h b/src/gui/Src/Gui/DisassemblyPopup.h new file mode 100644 index 000000000..aa9934726 --- /dev/null +++ b/src/gui/Src/Gui/DisassemblyPopup.h @@ -0,0 +1,48 @@ +#ifndef DISASSEMBLYPOPUP_H +#define DISASSEMBLYPOPUP_H +#include +#include "Imports.h" +#include "RichTextPainter.h" +#include "CachedFontMetrics.h" +#include "QBeaEngine.h" + +class Disassembly; + +class DisassemblyPopup : public QFrame +{ + Q_OBJECT +public: + explicit DisassemblyPopup(Disassembly* parent); + ~DisassemblyPopup(); + void paintEvent(QPaintEvent* event); + void setAddress(duint Address); + duint getAddress(); +public slots: + void hide(); + void updateFont(); + void updateColors(); +protected: + Disassembly* parent; + CachedFontMetrics* mFontMetrics; + duint addr; + QString addrText; + QString addrComment; + bool addrCommentAuto; + int charWidth; + int charHeight; + int mWidth; + unsigned int mMaxInstructions; + + QColor disassemblyBackgroundColor; + QColor labelColor; + QColor labelBackgroundColor; + QColor commentColor; + QColor commentBackgroundColor; + QColor commentAutoColor; + QColor commentAutoBackgroundColor; + + QList mInstBuffer; + std::vector mDisassemblyToken; +}; + +#endif // DISASSEMBLYPOPUP_H diff --git a/src/gui/Src/Gui/FavouriteTools.cpp b/src/gui/Src/Gui/FavouriteTools.cpp index 91f65dfcf..8e41d8e1e 100644 --- a/src/gui/Src/Gui/FavouriteTools.cpp +++ b/src/gui/Src/Gui/FavouriteTools.cpp @@ -6,6 +6,7 @@ #include #include #include "MiscUtil.h" +#include FavouriteTools::FavouriteTools(QWidget* parent) : QDialog(parent), diff --git a/src/gui/Src/Gui/FavouriteTools.h b/src/gui/Src/Gui/FavouriteTools.h index 9107c1224..d65688673 100644 --- a/src/gui/Src/Gui/FavouriteTools.h +++ b/src/gui/Src/Gui/FavouriteTools.h @@ -2,7 +2,8 @@ #define FAVOURITETOOLS_H #include -#include + +class QTableWidget; namespace Ui { diff --git a/src/gui/Src/Gui/HandlesView.cpp b/src/gui/Src/Gui/HandlesView.cpp index 843296ae9..83f834c82 100644 --- a/src/gui/Src/Gui/HandlesView.cpp +++ b/src/gui/Src/Gui/HandlesView.cpp @@ -1,6 +1,9 @@ #include "HandlesView.h" #include "Bridge.h" #include "VersionHelpers.h" +#include "StdTable.h" +#include +#include HandlesView::HandlesView(QWidget* parent) : QWidget(parent) { diff --git a/src/gui/Src/Gui/HandlesView.h b/src/gui/Src/Gui/HandlesView.h index 9fe73b421..4d0eefcc0 100644 --- a/src/gui/Src/Gui/HandlesView.h +++ b/src/gui/Src/Gui/HandlesView.h @@ -1,9 +1,12 @@ #ifndef HANDLESVIEW_H #define HANDLESVIEW_H -#include "StdTable.h" -#include -#include +#include +#include "Imports.h" + +class StdTable; +class QVBoxLayout; +class QSplitter; class HandlesView : public QWidget { diff --git a/src/gui/Src/Gui/HexEditDialog.cpp b/src/gui/Src/Gui/HexEditDialog.cpp index eb9566656..2f46ce848 100644 --- a/src/gui/Src/Gui/HexEditDialog.cpp +++ b/src/gui/Src/Gui/HexEditDialog.cpp @@ -1,3 +1,4 @@ +#include #include "HexEditDialog.h" #include "ui_HexEditDialog.h" #include "Configuration.h" diff --git a/src/gui/Src/Gui/HexLineEdit.cpp b/src/gui/Src/Gui/HexLineEdit.cpp index 566999ed3..7d2614e64 100644 --- a/src/gui/Src/Gui/HexLineEdit.cpp +++ b/src/gui/Src/Gui/HexLineEdit.cpp @@ -1,5 +1,5 @@ #include - +#include "Configuration.h" #include "HexLineEdit.h" #include "ui_HexLineEdit.h" #include "Bridge.h" diff --git a/src/gui/Src/Gui/HexLineEdit.h b/src/gui/Src/Gui/HexLineEdit.h index b667592b2..3f75494d2 100644 --- a/src/gui/Src/Gui/HexLineEdit.h +++ b/src/gui/Src/Gui/HexLineEdit.h @@ -2,7 +2,6 @@ #define HEXLINEEDITT_H #include -#include "Configuration.h" namespace Ui { diff --git a/src/gui/Src/Gui/MainWindow.cpp b/src/gui/Src/Gui/MainWindow.cpp index cf2aa2a89..7e2d30974 100644 --- a/src/gui/Src/Gui/MainWindow.cpp +++ b/src/gui/Src/Gui/MainWindow.cpp @@ -15,6 +15,35 @@ #include "StringUtil.h" #include "MiscUtil.h" #include "FavouriteTools.h" +#include "CPUDisassembly.h" +#include "CloseDialog.h" +#include "CommandLineEdit.h" +#include "TabWidget.h" +#include "CPUWidget.h" +#include "MemoryMapView.h" +#include "CallStackView.h" +#include "SEHChainView.h" +#include "LogView.h" +#include "SymbolView.h" +#include "BreakpointsView.h" +#include "ScriptView.h" +#include "ReferenceManager.h" +#include "ThreadView.h" +#include "PatchDialog.h" +#include "CalculatorDialog.h" +#include "StatusLabel.h" +#include "UpdateChecker.h" +#include "SourceViewerManager.h" +#include "SnowmanView.h" +#include "HandlesView.h" +#include "MainWindowCloseThread.h" +#include "TimeWastedCounter.h" +#include "NotesManager.h" +#include "SettingsDialog.h" +#include "DisassemblerGraphView.h" +#include "CPUMultiDump.h" +#include "CPUStack.h" +#include "GotoDialog.h" #include "main.h" QString MainWindow::windowTitle = ""; diff --git a/src/gui/Src/Gui/MainWindow.h b/src/gui/Src/Gui/MainWindow.h index d5fd97d16..64f1782e6 100644 --- a/src/gui/Src/Gui/MainWindow.h +++ b/src/gui/Src/Gui/MainWindow.h @@ -2,33 +2,35 @@ #define MAINWINDOW_H #include -#include -#include -#include "CloseDialog.h" -#include "CommandLineEdit.h" -#include "TabWidget.h" -#include "CPUWidget.h" -#include "MemoryMapView.h" -#include "CallStackView.h" -#include "SEHChainView.h" -#include "LogView.h" -#include "SymbolView.h" -#include "BreakpointsView.h" -#include "ScriptView.h" -#include "ReferenceManager.h" -#include "ThreadView.h" -#include "PatchDialog.h" -#include "CalculatorDialog.h" -#include "StatusLabel.h" -#include "UpdateChecker.h" -#include "SourceViewerManager.h" -#include "SnowmanView.h" -#include "HandlesView.h" -#include "MainWindowCloseThread.h" -#include "TimeWastedCounter.h" -#include "NotesManager.h" -#include "SettingsDialog.h" -#include "DisassemblerGraphView.h" +#include "Imports.h" + +class QDragEnterEvent; +class QDropEvent; +class CloseDialog; +class CommandLineEdit; +class MHTabWidget; +class CPUWidget; +class MemoryMapView; +class CallStackView; +class SEHChainView; +class LogView; +class SymbolView; +class BreakpointsView; +class ScriptView; +class ReferenceManager; +class ThreadView; +class PatchDialog; +class CalculatorDialog; +class StatusLabel; +class UpdateChecker; +class SourceViewerManager; +class SnowmanView; +class HandlesView; +class MainWindowCloseThread; +class TimeWastedCounter; +class NotesManager; +class SettingsDialog; +class DisassemblerGraphView; namespace Ui { diff --git a/src/gui/Src/Gui/RegistersView.cpp b/src/gui/Src/Gui/RegistersView.cpp index 9d59998fd..203584901 100644 --- a/src/gui/Src/Gui/RegistersView.cpp +++ b/src/gui/Src/Gui/RegistersView.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "RegistersView.h" #include "Configuration.h" diff --git a/src/gui/Src/Gui/SelectFields.h b/src/gui/Src/Gui/SelectFields.h index a3f571e0a..d7a584951 100644 --- a/src/gui/Src/Gui/SelectFields.h +++ b/src/gui/Src/Gui/SelectFields.h @@ -2,7 +2,8 @@ #define SELECTFIELDS_H #include -#include + +class QListWidget; namespace Ui { diff --git a/src/gui/Src/Gui/SymbolView.cpp b/src/gui/Src/Gui/SymbolView.cpp index b870065b3..0a3d63718 100644 --- a/src/gui/Src/Gui/SymbolView.cpp +++ b/src/gui/Src/Gui/SymbolView.cpp @@ -6,6 +6,7 @@ #include "YaraRuleSelectionDialog.h" #include "EntropyDialog.h" #include "LineEditDialog.h" +#include SymbolView::SymbolView(QWidget* parent) : QWidget(parent), ui(new Ui::SymbolView) { diff --git a/src/gui/Src/Gui/SymbolView.h b/src/gui/Src/Gui/SymbolView.h index bf972bcce..434c9b3b2 100644 --- a/src/gui/Src/Gui/SymbolView.h +++ b/src/gui/Src/Gui/SymbolView.h @@ -2,9 +2,13 @@ #define SYMBOLVIEW_H #include -#include +//#include #include "Bridge.h" +class QMenu; +class SearchListView; +class QVBoxLayout; + namespace Ui { class SymbolView; diff --git a/src/gui/Src/Gui/TabBar.cpp b/src/gui/Src/Gui/TabBar.cpp index 15a44c7a6..3254364fa 100644 --- a/src/gui/Src/Gui/TabBar.cpp +++ b/src/gui/Src/Gui/TabBar.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "tabbar.h" #include "tabwidget.h" diff --git a/src/gui/Src/Gui/TabBar.h b/src/gui/Src/Gui/TabBar.h index 85a805df8..889278ce4 100644 --- a/src/gui/Src/Gui/TabBar.h +++ b/src/gui/Src/Gui/TabBar.h @@ -3,8 +3,6 @@ // Qt includes #include -#include -#include ////////////////////////////////////////////////////////////////////////////// // Summary: diff --git a/src/gui/Src/Gui/TabWidget.cpp b/src/gui/Src/Gui/TabWidget.cpp index 61a8fe31e..0e423adec 100644 --- a/src/gui/Src/Gui/TabWidget.cpp +++ b/src/gui/Src/Gui/TabWidget.cpp @@ -1,6 +1,9 @@ // Qt includes #include "tabbar.h" #include "tabwidget.h" +#include +#include +#include ////////////////////////////////////////////////////////////// // Default Constructor diff --git a/src/gui/Src/Gui/TabWidget.h b/src/gui/Src/Gui/TabWidget.h index d2a7a040e..970a0613c 100644 --- a/src/gui/Src/Gui/TabWidget.h +++ b/src/gui/Src/Gui/TabWidget.h @@ -5,9 +5,6 @@ #include #include #include -#include -#include -#include #include "TabBar.h" // Qt forward class definitions diff --git a/src/gui/Src/Gui/TimeWastedCounter.cpp b/src/gui/Src/Gui/TimeWastedCounter.cpp index d760b4bae..d5adc3ffb 100644 --- a/src/gui/Src/Gui/TimeWastedCounter.cpp +++ b/src/gui/Src/Gui/TimeWastedCounter.cpp @@ -1,5 +1,6 @@ #include "TimeWastedCounter.h" #include "Bridge.h" +#include TimeWastedCounter::TimeWastedCounter(QObject* parent, QLabel* label) : QObject(parent), mLabel(label) diff --git a/src/gui/Src/Gui/TimeWastedCounter.h b/src/gui/Src/Gui/TimeWastedCounter.h index f0b79195d..565b3c5ec 100644 --- a/src/gui/Src/Gui/TimeWastedCounter.h +++ b/src/gui/Src/Gui/TimeWastedCounter.h @@ -2,7 +2,8 @@ #define TIMEWASTEDCOUNTER_H #include -#include + +class QLabel; class TimeWastedCounter : public QObject { diff --git a/src/gui/Src/Gui/WordEditDialog.cpp b/src/gui/Src/Gui/WordEditDialog.cpp index f09686dc7..9a7824cec 100644 --- a/src/gui/Src/Gui/WordEditDialog.cpp +++ b/src/gui/Src/Gui/WordEditDialog.cpp @@ -1,5 +1,6 @@ #include "WordEditDialog.h" #include "ui_WordEditDialog.h" +#include "ValidateExpressionThread.h" WordEditDialog::WordEditDialog(QWidget* parent) : QDialog(parent), diff --git a/src/gui/Src/Gui/WordEditDialog.h b/src/gui/Src/Gui/WordEditDialog.h index 1e1272296..ae7d5e12a 100644 --- a/src/gui/Src/Gui/WordEditDialog.h +++ b/src/gui/Src/Gui/WordEditDialog.h @@ -3,9 +3,11 @@ #include #include -#include "ValidateExpressionThread.h" +//#include "ValidateExpressionThread.h" #include "Imports.h" +class ValidateExpressionThread; + namespace Ui { class WordEditDialog; diff --git a/src/gui/Src/Imports.h b/src/gui/Src/Imports.h index 91ae10ef9..9192ad622 100644 --- a/src/gui/Src/Imports.h +++ b/src/gui/Src/Imports.h @@ -1,8 +1,14 @@ #ifndef IMPORTS_H #define IMPORTS_H +#ifndef _BRIDGEMAIN_H_ #include "bridge\bridgemain.h" +#endif +#ifndef _DBGFUNCTIONS_H #include "dbg\_dbgfunctions.h" +#endif +#ifndef _DBG_TYPES_H_ #include "dbg_types.h" +#endif #endif // IMPORTS_H diff --git a/src/gui/Src/Memory/MemoryPage.cpp b/src/gui/Src/Memory/MemoryPage.cpp index 9a405c341..dbe7caec9 100644 --- a/src/gui/Src/Memory/MemoryPage.cpp +++ b/src/gui/Src/Memory/MemoryPage.cpp @@ -6,24 +6,24 @@ MemoryPage::MemoryPage(duint parBase, duint parSize, QObject* parent) : QObject( Q_UNUSED(parSize); } -bool MemoryPage::read(void* parDest, duint parRVA, duint parSize) const +bool MemoryPage::read(void* parDest, dsint parRVA, duint parSize) const { return DbgMemRead(mBase + parRVA, reinterpret_cast(parDest), parSize); } -bool MemoryPage::read(byte_t* parDest, duint parRVA, duint parSize) const +bool MemoryPage::read(byte_t* parDest, dsint parRVA, duint parSize) const { return read(reinterpret_cast(parDest), parRVA, parSize); } -bool MemoryPage::write(const void* parDest, duint parRVA, duint parSize) +bool MemoryPage::write(const void* parDest, dsint parRVA, duint parSize) { bool ret = DbgFunctions()->MemPatch(mBase + parRVA, reinterpret_cast(parDest), parSize); GuiUpdatePatches(); return ret; } -bool MemoryPage::write(const byte_t* parDest, duint parRVA, duint parSize) +bool MemoryPage::write(const byte_t* parDest, dsint parRVA, duint parSize) { return write(reinterpret_cast(parDest), parRVA, parSize); } diff --git a/src/gui/Src/Memory/MemoryPage.h b/src/gui/Src/Memory/MemoryPage.h index 3a789ed25..3a605d86a 100644 --- a/src/gui/Src/Memory/MemoryPage.h +++ b/src/gui/Src/Memory/MemoryPage.h @@ -10,10 +10,10 @@ class MemoryPage : public QObject public: explicit MemoryPage(duint parBase, duint parSize, QObject* parent = 0); - bool read(void* parDest, duint parRVA, duint parSize) const; - bool read(byte_t* parDest, duint parRVA, duint parSize) const; - bool write(const void* parDest, duint parRVA, duint parSize); - bool write(const byte_t* parDest, duint parRVA, duint parSize); + bool read(void* parDest, dsint parRVA, duint parSize) const; + bool read(byte_t* parDest, dsint parRVA, duint parSize) const; + bool write(const void* parDest, dsint parRVA, duint parSize); + bool write(const byte_t* parDest, dsint parRVA, duint parSize); duint getSize() const; duint getBase() const; duint va(dsint rva) const; diff --git a/src/gui/Src/QEntropyView/QEntropyView.h b/src/gui/Src/QEntropyView/QEntropyView.h index 84db8d2b2..5856e19a5 100644 --- a/src/gui/Src/QEntropyView/QEntropyView.h +++ b/src/gui/Src/QEntropyView/QEntropyView.h @@ -2,7 +2,8 @@ #define QENTROPYVIEW_H #include -#include + +class QGraphicsScene; class QEntropyView : public QGraphicsView { diff --git a/src/gui/Src/QHexEdit/ArrayCommand.cpp b/src/gui/Src/QHexEdit/ArrayCommand.cpp index a197538d8..6d8e2a59c 100644 --- a/src/gui/Src/QHexEdit/ArrayCommand.cpp +++ b/src/gui/Src/QHexEdit/ArrayCommand.cpp @@ -1,4 +1,5 @@ #include "ArrayCommand.h" +#include "XByteArray.h" CharCommand::CharCommand(XByteArray* xData, Cmd cmd, int charPos, char newChar, QUndoCommand* parent) : QUndoCommand(parent) { diff --git a/src/gui/Src/QHexEdit/ArrayCommand.h b/src/gui/Src/QHexEdit/ArrayCommand.h index bc43040d0..78fdf4062 100644 --- a/src/gui/Src/QHexEdit/ArrayCommand.h +++ b/src/gui/Src/QHexEdit/ArrayCommand.h @@ -2,7 +2,9 @@ #define ARRAYCOMMAND_H #include -#include "XByteArray.h" +#include + +class XByteArray; class CharCommand : public QUndoCommand { diff --git a/src/gui/Src/QHexEdit/QHexEdit.cpp b/src/gui/Src/QHexEdit/QHexEdit.cpp index 0db034ae8..8706aeba1 100644 --- a/src/gui/Src/QHexEdit/QHexEdit.cpp +++ b/src/gui/Src/QHexEdit/QHexEdit.cpp @@ -1,6 +1,7 @@ #include #include "QHexEdit.h" +#include "QHexEditPrivate.h" QHexEdit::QHexEdit(QWidget* parent) : QScrollArea(parent) { diff --git a/src/gui/Src/QHexEdit/QHexEdit.h b/src/gui/Src/QHexEdit/QHexEdit.h index e3054885b..9d9348875 100644 --- a/src/gui/Src/QHexEdit/QHexEdit.h +++ b/src/gui/Src/QHexEdit/QHexEdit.h @@ -2,8 +2,8 @@ #define QHEXEDIT_H #include -#include -#include "QHexEditPrivate.h" + +class QHexEditPrivate; class QHexEdit : public QScrollArea { diff --git a/src/gui/Src/QHexEdit/QHexEditPrivate.h b/src/gui/Src/QHexEdit/QHexEditPrivate.h index 1cecd777d..ccf0e81e9 100644 --- a/src/gui/Src/QHexEdit/QHexEditPrivate.h +++ b/src/gui/Src/QHexEdit/QHexEditPrivate.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "XByteArray.h" class QHexEditPrivate : public QWidget diff --git a/src/gui/Src/QHexEdit/XByteArray.cpp b/src/gui/Src/QHexEdit/XByteArray.cpp index db189e049..8220af133 100644 --- a/src/gui/Src/QHexEdit/XByteArray.cpp +++ b/src/gui/Src/QHexEdit/XByteArray.cpp @@ -9,7 +9,7 @@ QByteArray & XByteArray::data() return _data; } -void XByteArray::setData(QByteArray data) +void XByteArray::setData(const QByteArray & data) { _data = data; } diff --git a/src/gui/Src/QHexEdit/XByteArray.h b/src/gui/Src/QHexEdit/XByteArray.h index f4b078eb6..ef774362e 100644 --- a/src/gui/Src/QHexEdit/XByteArray.h +++ b/src/gui/Src/QHexEdit/XByteArray.h @@ -1,7 +1,7 @@ #ifndef XBYTEARRAY_H #define XBYTEARRAY_H -#include +#include class XByteArray { @@ -9,7 +9,7 @@ public: explicit XByteArray(); QByteArray & data(); - void setData(QByteArray data); + void setData(const QByteArray & data); int size(); QByteArray & insert(int i, char ch); @@ -21,10 +21,6 @@ public: QByteArray & replace(int index, const QByteArray & ba); QByteArray & replace(int index, int length, const QByteArray & ba); -signals: - -public slots: - private: QByteArray _data; //raw byte array }; diff --git a/src/gui/Src/Utils/Configuration.cpp b/src/gui/Src/Utils/Configuration.cpp index a37509650..bdcc3fed9 100644 --- a/src/gui/Src/Utils/Configuration.cpp +++ b/src/gui/Src/Utils/Configuration.cpp @@ -153,6 +153,8 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false) defaultColors.insert("StackSelectedAddressBackgroundColor", Qt::transparent); defaultColors.insert("StackLabelColor", QColor("#FF0000")); defaultColors.insert("StackLabelBackgroundColor", Qt::transparent); + defaultColors.insert("StackReturnToColor", QColor("#FF0000")); + defaultColors.insert("StackSEHChainColor", QColor("#AE81FF")); defaultColors.insert("StackFrameColor", QColor("#000000")); defaultColors.insert("StackFrameSystemColor", QColor("#0000FF")); @@ -368,6 +370,7 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false) defaultShortcuts.insert("ActionHelpOnMnemonic", Shortcut(tr("Actions -> Help on Mnemonic"), "Ctrl+F1")); defaultShortcuts.insert("ActionToggleMnemonicBrief", Shortcut(tr("Actions -> Toggle Mnemonic Brief"), "Ctrl+Shift+F1")); defaultShortcuts.insert("ActionHighlightingMode", Shortcut(tr("Actions -> Highlighting Mode"), "Ctrl+H")); + defaultShortcuts.insert("ActionToggleDestinationPreview", Shortcut(tr("Actions -> Enable/Disable Branch Destination Preview"), "P")); defaultShortcuts.insert("ActionFind", Shortcut(tr("Actions -> Find"), "Ctrl+F")); defaultShortcuts.insert("ActionDecompileFunction", Shortcut(tr("Actions -> Decompile Function"), "F5")); defaultShortcuts.insert("ActionDecompileSelection", Shortcut(tr("Actions -> Decompile Selection"), "Shift+F5")); diff --git a/src/gui/Src/Utils/Configuration.h b/src/gui/Src/Utils/Configuration.h index 5d3541db6..8f8fa17cb 100644 --- a/src/gui/Src/Utils/Configuration.h +++ b/src/gui/Src/Utils/Configuration.h @@ -28,11 +28,8 @@ public: QKeySequence Hotkey; bool GlobalShortcut; - Shortcut(QString n = QString(), QString h = QString(), bool g = false) + inline Shortcut(QString n = QString(), QString h = QString(), bool g = false) : Name(n), Hotkey(h), GlobalShortcut(g) { - Name = n; - Hotkey = QKeySequence(h); - GlobalShortcut = g; } }; diff --git a/src/gui/Src/Utils/EncodeMap.h b/src/gui/Src/Utils/EncodeMap.h index 51d2a3930..e924db6ac 100644 --- a/src/gui/Src/Utils/EncodeMap.h +++ b/src/gui/Src/Utils/EncodeMap.h @@ -2,7 +2,7 @@ #define ENCODEMAP_H #include -#include "bridge/bridgemain.h" +#include "Imports.h" class EncodeMap : public QObject { @@ -71,7 +71,7 @@ public: } } - bool inRange(duint addr) + inline bool inRange(duint addr) { return addr >= mBase && addr < mBase + mSize; } diff --git a/src/gui/Src/Utils/MiscUtil.cpp b/src/gui/Src/Utils/MiscUtil.cpp index 82163c6e2..fb4abad93 100644 --- a/src/gui/Src/Utils/MiscUtil.cpp +++ b/src/gui/Src/Utils/MiscUtil.cpp @@ -2,7 +2,6 @@ #include #include "LineEditDialog.h" #include -#include void SetApplicationIcon(WId winId) { @@ -56,8 +55,3 @@ void SimpleWarningBox(QWidget* parent, const QString & title, const QString & te msg.setWindowFlags(msg.windowFlags() & (~Qt::WindowContextHelpButtonHint)); msg.exec(); } - -DIcon::DIcon(const QString & file) - : QIcon(QString(":/icons/images/%1").arg(file)) -{ -} diff --git a/src/gui/Src/Utils/MiscUtil.h b/src/gui/Src/Utils/MiscUtil.h index 611879945..acbdb570c 100644 --- a/src/gui/Src/Utils/MiscUtil.h +++ b/src/gui/Src/Utils/MiscUtil.h @@ -1,9 +1,11 @@ #ifndef MISCUTIL_H #define MISCUTIL_H -#include #include +class QWidget; +class QByteArray; + void SetApplicationIcon(WId winId); QByteArray & ByteReverse(QByteArray & array); bool SimpleInputBox(QWidget* parent, const QString & title, QString defaultValue, QString & output); @@ -12,7 +14,7 @@ void SimpleWarningBox(QWidget* parent, const QString & title, const QString & te struct DIcon : QIcon { - explicit DIcon(const QString & file); + inline explicit DIcon(const QString & file) : QIcon(QString(":/icons/images/%1").arg(file)) {} }; #endif // MISCUTIL_H diff --git a/src/gui/Src/Utils/RichTextPainter.cpp b/src/gui/Src/Utils/RichTextPainter.cpp index 060481f7c..baac68496 100644 --- a/src/gui/Src/Utils/RichTextPainter.cpp +++ b/src/gui/Src/Utils/RichTextPainter.cpp @@ -1,4 +1,6 @@ #include "RichTextPainter.h" +#include "CachedFontMetrics.h" +#include //TODO: fix performance (possibly use QTextLayout?) void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const List & richText, CachedFontMetrics* fontMetrics) diff --git a/src/gui/Src/Utils/RichTextPainter.h b/src/gui/Src/Utils/RichTextPainter.h index 4f6bce96d..fd46c7263 100644 --- a/src/gui/Src/Utils/RichTextPainter.h +++ b/src/gui/Src/Utils/RichTextPainter.h @@ -3,8 +3,10 @@ #include #include -#include -#include "CachedFontMetrics.h" +#include + +class CachedFontMetrics; +class QPainter; class RichTextPainter { diff --git a/src/gui/Src/Utils/StringUtil.cpp b/src/gui/Src/Utils/StringUtil.cpp index 04c1d9798..f7eed5b0e 100644 --- a/src/gui/Src/Utils/StringUtil.cpp +++ b/src/gui/Src/Utils/StringUtil.cpp @@ -243,3 +243,25 @@ QString FILETIMEToDate(const FILETIME & date) else // today return FILETIMEToTime(localdate); } + +bool GetCommentFormat(duint addr, QString & comment, bool* autoComment) +{ + comment.clear(); + char commentData[MAX_COMMENT_SIZE] = ""; + if(!DbgGetCommentAt(addr, commentData)) + return false; + auto a = *commentData == '\1'; + if(autoComment) + *autoComment = a; + if(!strstr(commentData, "{")) + { + comment = commentData + a; + return true; + } + char commentFormat[MAX_SETTING_SIZE] = ""; + if(DbgFunctions()->StringFormatInline(commentData + a, MAX_SETTING_SIZE, commentFormat)) + comment = commentFormat; + else + comment = commentData + a; + return true; +} diff --git a/src/gui/Src/Utils/StringUtil.h b/src/gui/Src/Utils/StringUtil.h index f69a1f724..ab6320e8f 100644 --- a/src/gui/Src/Utils/StringUtil.h +++ b/src/gui/Src/Utils/StringUtil.h @@ -121,26 +121,6 @@ static QString FILETIMEToTime(const FILETIME & time) QString FILETIMEToDate(const FILETIME & date); -static bool GetCommentFormat(duint addr, QString & comment, bool* autoComment = nullptr) -{ - comment.clear(); - char commentData[MAX_COMMENT_SIZE] = ""; - if(!DbgGetCommentAt(addr, commentData)) - return false; - auto a = *commentData == '\1'; - if(autoComment) - *autoComment = a; - if(!strstr(commentData, "{")) - { - comment = commentData + a; - return true; - } - char commentFormat[MAX_SETTING_SIZE] = ""; - if(DbgFunctions()->StringFormatInline(commentData + a, MAX_SETTING_SIZE, commentFormat)) - comment = commentFormat; - else - comment = commentData + a; - return true; -} +bool GetCommentFormat(duint addr, QString & comment, bool* autoComment = nullptr); #endif // STRINGUTIL_H diff --git a/src/gui/Src/main.cpp b/src/gui/Src/main.cpp index 51df5ec4c..a35520365 100644 --- a/src/gui/Src/main.cpp +++ b/src/gui/Src/main.cpp @@ -2,6 +2,9 @@ #include "capstone_wrapper.h" #include #include +#include +#include +#include MyApplication::MyApplication(int & argc, char** argv) : QApplication(argc, argv) diff --git a/src/gui/x64dbg.pro b/src/gui/x64dbg.pro index 8b2ec13ea..eafdfde06 100644 --- a/src/gui/x64dbg.pro +++ b/src/gui/x64dbg.pro @@ -166,7 +166,8 @@ SOURCES += \ Src/Gui/WatchView.cpp \ Src/Gui/FavouriteTools.cpp \ Src/Gui/BrowseDialog.cpp \ - Src/Gui/DisassemblerGraphView.cpp + Src/Gui/DisassemblerGraphView.cpp \ + Src/Gui/DisassemblyPopup.cpp HEADERS += \ @@ -269,7 +270,8 @@ HEADERS += \ Src/Gui/FavouriteTools.h \ Src/Gui/BrowseDialog.h \ Src/Gui/DisassemblerGraphView.h \ - Src/Utils/ActionHelpers.h + Src/Utils/ActionHelpers.h \ + Src/Gui/DisassemblyPopup.h FORMS += \