1
0
Fork 0

Merge branch 'torusrxxx-patch00000092' into development

This commit is contained in:
Duncan Ogilvie 2018-10-29 13:38:56 +01:00
commit fba7af6bcd
18 changed files with 184 additions and 90 deletions

View File

@ -290,8 +290,23 @@ bool SymAddrFromName(const char* Name, duint* Address)
return false;
// Skip 'OrdinalXXX'
if(!_strnicmp(Name, "Ordinal", 7))
return false;
if(_strnicmp(Name, "Ordinal#", 8) == 0 && strlen(Name) > 8)
{
const char* Name1 = Name + 8;
bool notNonNumbersFound = true;
do
{
if(!(Name1[0] >= '0' && Name1[0] <= '9'))
{
notNonNumbersFound = false;
break;
}
Name1++;
}
while(Name1[0] != 0);
if(notNonNumbersFound)
return false;
}
//TODO: refactor this in a function because this pattern will become common
std::vector<duint> mods;

View File

@ -999,3 +999,28 @@ void AbstractStdTable::reloadData()
}
AbstractTableView::reloadData();
}
duint AbstractStdTable::getDisassemblyPopupAddress(int mousex, int mousey)
{
if(!bDisassemblyPopupEnabled) //No disassembly popup is meaningful for this table
return 0;
int c = getColumnIndexFromX(mousex);
int r = getTableOffset() + getIndexOffsetFromY(transY(mousey));
if(r < getRowCount())
{
QString cell = getCellContent(r, c);
duint addr;
bool ok = false;
#ifdef _WIN64
addr = cell.toULongLong(&ok, 16);
#else //x86
addr = cell.toULong(&ok, 16);
#endif //_WIN64
if(!ok)
return 0;
else
return addr;
}
else
return 0;
}

View File

@ -44,6 +44,7 @@ public:
virtual QString getCellContent(int r, int c) = 0;
virtual bool isValidIndex(int r, int c) = 0;
virtual void sortRows(int column, bool ascending) = 0;
duint getDisassemblyPopupAddress(int mousex, int mousey) override;
//context menu helpers
void setupCopyMenu(QMenu* copyMenu);
@ -67,6 +68,11 @@ public:
bAddressLabel = addressLabel;
}
bool setDisassemblyPopupEnabled(bool enabled)
{
return bDisassemblyPopupEnabled = enabled;
}
signals:
void selectionChangedSignal(int index);
void keyPressedSignal(QKeyEvent* event);
@ -135,4 +141,5 @@ protected:
QString mHighlightText;
int mAddressColumn = -1;
bool bAddressLabel = true;
bool bDisassemblyPopupEnabled = true;
};

View File

@ -4,6 +4,7 @@
#include "ColumnReorderDialog.h"
#include "CachedFontMetrics.h"
#include "Bridge.h"
#include "DisassemblyPopup.h"
#include <windows.h>
int AbstractTableView::mMouseWheelScrollDelta = 0;
@ -28,7 +29,8 @@ void AbstractTableScrollBar::leaveEvent(QEvent* event)
AbstractTableView::AbstractTableView(QWidget* parent)
: QAbstractScrollArea(parent),
mFontMetrics(nullptr)
mFontMetrics(nullptr),
mDisassemblyPopup(nullptr)
{
// Class variable initialization
mTableOffset = 0;
@ -369,16 +371,21 @@ void AbstractTableView::mouseMoveEvent(QMouseEvent* event)
mColResizeData.splitHandle = true;
mGuiState = AbstractTableView::ReadyToResize;
}
if((wHandle == false) && (wHasCursor == true))
else if((wHandle == false) && (wHasCursor == true))
{
unsetCursor();
mColResizeData.splitHandle = false;
mGuiState = AbstractTableView::NoState;
}
else if(wHandle == false && wHasCursor == false)
{
if(event->y() > getHeaderHeight() && DbgIsDebugging())
ShowDisassemblyPopup(getDisassemblyPopupAddress(event->x(), event->y()), event->x(), event->y());
}
}
else
{
QWidget::mouseMoveEvent(event);
QAbstractScrollArea::mouseMoveEvent(event);
}
}
break;
@ -575,6 +582,7 @@ void AbstractTableView::mouseDoubleClickEvent(QMouseEvent* event)
*
* @return Nothing.
*/
void AbstractTableView::wheelEvent(QWheelEvent* event)
{
int numDegrees = event->delta() / 8;
@ -614,7 +622,13 @@ void AbstractTableView::resizeEvent(QResizeEvent* event)
emit viewableRowsChanged(getViewableRowsCount());
mShouldReload = true;
}
QWidget::resizeEvent(event);
QAbstractScrollArea::resizeEvent(event);
}
void AbstractTableView::leaveEvent(QEvent* event)
{
ShowDisassemblyPopup(0, 0, 0);
QAbstractScrollArea::leaveEvent(event);
}
/************************************************************************************
@ -1256,3 +1270,41 @@ void AbstractTableView::prepareData()
dsint wRemainingRowsCount = getRowCount() - mTableOffset;
mNbrOfLineToPrint = (dsint)wRemainingRowsCount > (dsint)wViewableRowsCount ? (int)wViewableRowsCount : (int)wRemainingRowsCount;
}
/************************************************************************************
DisassemblyPopup
************************************************************************************/
duint AbstractTableView::getDisassemblyPopupAddress(int mousex, int mousey)
{
Q_UNUSED(mousex)
Q_UNUSED(mousey)
return 0; //Default is no disassembly popup
}
void AbstractTableView::ShowDisassemblyPopup(duint addr, int x, int y)
{
if(!addr)
{
if(mDisassemblyPopup)
mDisassemblyPopup->hide();
return;
}
if(!mDisassemblyPopup)
mDisassemblyPopup = new DisassemblyPopup(this);
if(mDisassemblyPopup->getAddress() == addr)
return;
if(DbgFunctions()->MemIsCodePage(addr, false))
{
mDisassemblyPopup->move(mapToGlobal(QPoint(x + 20, y + fontMetrics().height() * 2)));
mDisassemblyPopup->setAddress(addr);
mDisassemblyPopup->show();
}
else
mDisassemblyPopup->hide();
}
void AbstractTableView::hideEvent(QHideEvent* event)
{
ShowDisassemblyPopup(0, 0, 0);
QAbstractScrollArea::hideEvent(event);
}

View File

@ -15,6 +15,7 @@
#include "ActionHelpers.h"
class CachedFontMetrics;
class DisassemblyPopup;
//Hacky class that fixes a really annoying cursor problem
class AbstractTableScrollBar : public QScrollBar
@ -64,6 +65,8 @@ public:
void wheelEvent(QWheelEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
void leaveEvent(QEvent* event) override;
void hideEvent(QHideEvent* event) override;
// ScrollBar Management
virtual dsint sliderMovedHook(int type, dsint value, dsint delta);
@ -120,6 +123,8 @@ public:
// Update/Reload/Refresh/Repaint
virtual void prepareData();
virtual duint getDisassemblyPopupAddress(int mousex, int mousey);
signals:
void enterPressedSignal();
void headerButtonPressed(int col);
@ -218,6 +223,10 @@ protected:
// Font metrics
CachedFontMetrics* mFontMetrics;
void invalidateCachedFont();
// Disassembly Popup
DisassemblyPopup* mDisassemblyPopup;
void ShowDisassemblyPopup(duint addr, int x, int y);
};
#endif // ABSTRACTTABLEVIEW_H

View File

@ -8,7 +8,7 @@
#include "QBeaEngine.h"
#include "MemoryPage.h"
Disassembly::Disassembly(QWidget* parent) : AbstractTableView(parent), mDisassemblyPopup(this)
Disassembly::Disassembly(QWidget* parent) : AbstractTableView(parent)
{
mMemPage = new MemoryPage(0, 0);
@ -32,11 +32,13 @@ Disassembly::Disassembly(QWidget* parent) : AbstractTableView(parent), mDisassem
tokenizerConfigUpdatedSlot();
mCodeFoldingManager = nullptr;
duint setting;
if(BridgeSettingGetUint("Gui", "DisableBranchDestinationPreview", &setting))
mPopupEnabled = !setting;
else
mPopupEnabled = true;
/*
duint setting;
if(BridgeSettingGetUint("Gui", "DisableBranchDestinationPreview", &setting))
mPopupEnabled = !setting;
else
mPopupEnabled = true;
*/
mIsLastInstDisplayed = false;
mGuiState = Disassembly::NoState;
@ -674,44 +676,40 @@ void Disassembly::mouseMoveEvent(QMouseEvent* event)
verticalScrollBar()->triggerAction(QAbstractSlider::SliderSingleStepSub);
}
}
else if(mGuiState == Disassembly::NoState)
{
if(!mHighlightingMode && mPopupEnabled)
{
bool popupShown = false;
if(y > getHeaderHeight() && getColumnIndexFromX(event->x()) == 2)
{
int rowOffset = getIndexOffsetFromY(transY(y));
if(rowOffset < mInstBuffer.size())
{
CapstoneTokenizer::SingleToken token;
auto & instruction = mInstBuffer.at(rowOffset);
if(CapstoneTokenizer::TokenFromX(instruction.tokens, token, event->x(), mFontMetrics))
{
duint addr = token.value.value;
bool isCodePage = DbgFunctions()->MemIsCodePage(addr, false);
if(!isCodePage && instruction.branchDestination)
{
addr = instruction.branchDestination;
isCodePage = DbgFunctions()->MemIsCodePage(addr, false);
}
if(isCodePage && (addr - mMemPage->getBase() < mInstBuffer.front().rva || addr - mMemPage->getBase() > mInstBuffer.back().rva))
{
ShowDisassemblyPopup(addr, event->x(), y);
popupShown = true;
}
}
}
}
if(popupShown == false)
ShowDisassemblyPopup(0, 0, 0); // hide popup
}
}
if(wAccept == true)
AbstractTableView::mouseMoveEvent(event);
}
duint Disassembly::getDisassemblyPopupAddress(int mousex, int mousey)
{
if(mHighlightingMode)
return 0; //Don't show this in highlight mode
if(getColumnIndexFromX(mousex) != 2)
return 0; //Disassembly popup for other column is undefined
int rowOffset = getIndexOffsetFromY(transY(mousey));
if(rowOffset < mInstBuffer.size())
{
CapstoneTokenizer::SingleToken token;
auto & instruction = mInstBuffer.at(rowOffset);
if(CapstoneTokenizer::TokenFromX(instruction.tokens, token, mousex, mFontMetrics))
{
duint addr = token.value.value;
bool isCodePage = DbgFunctions()->MemIsCodePage(addr, false);
if(!isCodePage && instruction.branchDestination)
{
addr = instruction.branchDestination;
isCodePage = DbgFunctions()->MemIsCodePage(addr, false);
}
if(isCodePage && (addr - mMemPage->getBase() < mInstBuffer.front().rva || addr - mMemPage->getBase() > mInstBuffer.back().rva))
{
return addr;
}
}
}
return 0;
}
/**
* @brief This method has been reimplemented. It manages the following actions:
* - Multi-rows selection
@ -838,12 +836,6 @@ void Disassembly::mouseReleaseEvent(QMouseEvent* event)
AbstractTableView::mouseReleaseEvent(event);
}
void Disassembly::leaveEvent(QEvent* event)
{
ShowDisassemblyPopup(0, 0, 0);
AbstractTableView::leaveEvent(event);
}
/************************************************************************************
Keyboard Management
************************************************************************************/
@ -2142,21 +2134,6 @@ void Disassembly::unfold(dsint rva)
}
}
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();
}
bool Disassembly::hightlightToken(const CapstoneTokenizer::SingleToken & token)
{
mHighlightToken = token;

View File

@ -2,10 +2,9 @@
#define DISASSEMBLY_H
#include "AbstractTableView.h"
#include "DisassemblyPopup.h"
#include "QBeaEngine.h"
class CodeFoldingHelper;
class QBeaEngine;
class MemoryPage;
class Disassembly : public AbstractTableView
@ -26,7 +25,6 @@ public:
void mouseMoveEvent(QMouseEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void leaveEvent(QEvent* event) override;
// Keyboard Management
void keyPressEvent(QKeyEvent* event) override;
@ -103,8 +101,8 @@ public:
//misc
void setCodeFoldingManager(CodeFoldingHelper* CodeFoldingManager);
duint getDisassemblyPopupAddress(int mousex, int mousey) override;
void unfold(dsint rva);
void ShowDisassemblyPopup(duint addr, int x, int y);
bool hightlightToken(const CapstoneTokenizer::SingleToken & token);
bool isHighlightMode() const;
@ -243,13 +241,12 @@ protected:
duint mRvaDisplayBase;
dsint mRvaDisplayPageBase;
bool mHighlightingMode;
bool mPopupEnabled;
//bool mPopupEnabled;
MemoryPage* mMemPage;
QBeaEngine* mDisasm;
bool mShowMnemonicBrief;
XREF_INFO mXrefInfo;
CodeFoldingHelper* mCodeFoldingManager;
DisassemblyPopup mDisassemblyPopup;
CapstoneTokenizer::SingleToken mHighlightToken;
bool mPermanentHighlightingMode;
bool mNoCurrentModuleText;

View File

@ -4,6 +4,7 @@
#include <QProgressBar>
#include <QLabel>
#include "StdSearchListView.h"
class DisassemblyPopup;
class QTabWidget;

View File

@ -6,11 +6,8 @@ class StdTableSearchList : public AbstractSearchList
public:
friend class StdSearchListView;
StdTableSearchList()
{
mList = new StdTable();
mSearchList = new StdTable();
}
StdTableSearchList() : mList(new StdTable()), mSearchList(new StdTable()) { }
~StdTableSearchList() {delete mList; delete mSearchList; }
void lock() override { }
void unlock() override { }
@ -118,6 +115,12 @@ void StdSearchListView::setSearchStartCol(int col)
mSearchStartCol = col;
}
bool StdSearchListView::setDisassemblyPopupEnabled(bool enabled)
{
stdList()->setDisassemblyPopupEnabled(enabled);
return stdSearchList()->setDisassemblyPopupEnabled(enabled);
}
StdTable* StdSearchListView::stdList()
{
return mSearchListData->mList;

View File

@ -20,6 +20,7 @@ public:
void enableMultiSelection(bool enabled);
void setAddressColumn(int col, bool cipBase = false);
void loadColumnFromConfig(const QString & viewName);
bool setDisassemblyPopupEnabled(bool enabled);
public slots:
virtual void setRowCount(dsint count);
@ -36,5 +37,4 @@ protected:
StdTable* stdList();
StdTable* stdSearchList();
};
#endif // STDSEARCHLISTVIEW_H

View File

@ -353,13 +353,15 @@ void CPUDisassembly::setupRightClickContextMenu()
});
mMenuBuilder->addAction(makeShortcutAction(DIcon("highlight.png"), tr("&Highlighting mode"), SLOT(enableHighlightingModeSlot()), "ActionHighlightingMode"));
QAction* togglePreview = makeShortcutAction(DIcon("branchpreview.png"), 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 false; //hide this menu from the user, but keep the shortcut working
});
//The following code to manage branch preview has been disabled and will be implemented in a setting instead.
/*
QAction* togglePreview = makeShortcutAction(DIcon("branchpreview.png"), 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 false; //hide this menu from the user, but keep the shortcut working
});
*/
MenuBuilder* labelMenu = new MenuBuilder(this);
labelMenu->addAction(makeShortcutAction(tr("Label Current Address"), SLOT(setLabelSlot()), "ActionSetLabel"));
QAction* labelAddress = makeShortcutAction(tr("Label"), SLOT(setLabelAddressSlot()), "ActionSetLabelOperand");
@ -1980,7 +1982,7 @@ void CPUDisassembly::graphSlot()
if(DbgCmdExecDirect(QString("graph %1").arg(ToPtrString(rvaToVa(getSelectionStart()))).toUtf8().constData()))
emit displayGraphWidget();
}
/*
void CPUDisassembly::togglePreviewSlot()
{
if(mPopupEnabled == true)
@ -1988,7 +1990,7 @@ void CPUDisassembly::togglePreviewSlot()
mPopupEnabled = !mPopupEnabled;
BridgeSettingSetUint("Gui", "DisableBranchDestinationPreview", !mPopupEnabled);
}
*/
void CPUDisassembly::analyzeModuleSlot()
{
DbgCmdExec("cfanal");

View File

@ -109,7 +109,7 @@ public slots:
void setEncodeTypeRangeSlot();
void graphSlot();
void analyzeModuleSlot();
void togglePreviewSlot();
//void togglePreviewSlot();
void createThreadSlot();
void copyTokenTextSlot();
void copyTokenValueSlot();

View File

@ -91,7 +91,7 @@ void CallStackView::updateCallStack()
setCellContent(i, 5, tr("System"));
break;
default:
setCellContent(i, 5, QString("%1").arg(party));
setCellContent(i, 5, QString::number(party));
break;
}
}

View File

@ -17,6 +17,7 @@ HandlesView::HandlesView(QWidget* parent) : QWidget(parent)
mHandlesTable->setInternalTitle("Handles");
mHandlesTable->mSearchStartCol = 0;
mHandlesTable->setDrawDebugOnly(true);
mHandlesTable->setDisassemblyPopupEnabled(false);
int wCharWidth = mHandlesTable->getCharWidth();
mHandlesTable->addColumnAt(8 + 16 * wCharWidth, tr("Type"), true);
mHandlesTable->addColumnAt(8 + 8 * wCharWidth, tr("Type number"), true);
@ -48,6 +49,7 @@ HandlesView::HandlesView(QWidget* parent) : QWidget(parent)
mTcpConnectionsTable->setInternalTitle("TcpConnections");
mTcpConnectionsTable->setSearchStartCol(0);
mTcpConnectionsTable->setDrawDebugOnly(true);
mTcpConnectionsTable->setDisassemblyPopupEnabled(false);
wCharWidth = mTcpConnectionsTable->getCharWidth();
mTcpConnectionsTable->addColumnAt(8 + 64 * wCharWidth, tr("Remote address"), true);
mTcpConnectionsTable->addColumnAt(8 + 64 * wCharWidth, tr("Local address"), true);
@ -67,6 +69,7 @@ HandlesView::HandlesView(QWidget* parent) : QWidget(parent)
mPrivilegesTable = new StdTable(this);
mPrivilegesTable->setWindowTitle("Privileges");
mPrivilegesTable->setDrawDebugOnly(true);
mPrivilegesTable->setDisassemblyPopupEnabled(false);
mPrivilegesTable->setContextMenuPolicy(Qt::CustomContextMenu);
mPrivilegesTable->addColumnAt(8 + 32 * wCharWidth, tr("Privilege"), true);
mPrivilegesTable->addColumnAt(8 + 16 * wCharWidth, tr("State"), true);

View File

@ -20,6 +20,7 @@ MemoryMapView::MemoryMapView(StdTable* parent)
{
setDrawDebugOnly(true);
enableMultiSelection(true);
setDisassemblyPopupEnabled(false);
int charwidth = getCharWidth();

View File

@ -16,6 +16,7 @@ ScriptView::ScriptView(StdTable* parent) : StdTable(parent)
enableMultiSelection(false);
enableColumnSorting(false);
setDrawDebugOnly(false);
setDisassemblyPopupEnabled(false);
int charwidth = getCharWidth();

View File

@ -100,6 +100,7 @@ SymbolView::SymbolView(QWidget* parent) : QWidget(parent), ui(new Ui::SymbolView
mModuleList->setSearchStartCol(0);
mModuleList->enableMultiSelection(true);
mModuleList->setAddressColumn(0, true);
mModuleList->setDisassemblyPopupEnabled(false);
int charwidth = mModuleList->getCharWidth();
mModuleList->addColumnAt(charwidth * 2 * sizeof(dsint) + 8, tr("Base"), true);
mModuleList->addColumnAt(300, tr("Module"), true);

View File

@ -1,7 +1,7 @@
#ifndef SNOWMANVIEW_H
#define SNOWMANVIEW_H
#include <QWidget>
class QWidget;
struct SnowmanRange
{