GUI: implement OllyDbg's Find all names in current module (Ctrl+N)
Cheers to @R3MRUM from Twitter!
This commit is contained in:
parent
37e83c9436
commit
188b74bc91
|
@ -156,6 +156,7 @@ signals:
|
|||
void getDumpAttention();
|
||||
void openTraceFile(const QString & fileName);
|
||||
void updateTraceBrowser();
|
||||
void symbolSelectModule(duint base);
|
||||
|
||||
private:
|
||||
CRITICAL_SECTION csBridge;
|
||||
|
|
|
@ -594,12 +594,14 @@ void CPUDisassembly::setupRightClickContextMenu()
|
|||
mFindCallsModule = makeAction(DIcon("call.png"), tr("&Intermodular calls"), SLOT(findCallsSlot()));
|
||||
mFindPatternModule = makeShortcutAction(DIcon("search_for_pattern.png"), tr("&Pattern"), SLOT(findPatternSlot()), "ActionFindPatternInModule");
|
||||
mFindGUIDModule = makeAction(DIcon("guid.png"), tr("&GUID"), SLOT(findGUIDSlot()));
|
||||
mFindNamesModule = makeShortcutAction(DIcon("names.png"), tr("&Names"), SLOT(findNamesSlot()), "ActionFindNamesInModule");
|
||||
mSearchModuleMenu->addAction(mFindCommandModule);
|
||||
mSearchModuleMenu->addAction(mFindConstantModule);
|
||||
mSearchModuleMenu->addAction(mFindStringsModule);
|
||||
mSearchModuleMenu->addAction(mFindCallsModule);
|
||||
mSearchModuleMenu->addAction(mFindPatternModule);
|
||||
mSearchModuleMenu->addAction(mFindGUIDModule);
|
||||
mSearchModuleMenu->addAction(mFindNamesModule);
|
||||
|
||||
// Search in Current Function menu
|
||||
mFindCommandFunction = makeAction(DIcon("search_for_command.png"), tr("C&ommand"), SLOT(findCommandSlot()));
|
||||
|
@ -1260,6 +1262,18 @@ void CPUDisassembly::findGUIDSlot()
|
|||
emit displayReferencesWidget();
|
||||
}
|
||||
|
||||
void CPUDisassembly::findNamesSlot()
|
||||
{
|
||||
if(sender() == mFindNamesModule)
|
||||
{
|
||||
auto base = DbgFunctions()->ModBaseFromAddr(rvaToVa(getInitialSelection()));
|
||||
if(!base)
|
||||
return;
|
||||
Bridge::getBridge()->symbolSelectModule(base);
|
||||
emit displaySymbolsWidget();
|
||||
}
|
||||
}
|
||||
|
||||
void CPUDisassembly::selectionGetSlot(SELECTIONDATA* selection)
|
||||
{
|
||||
selection->start = rvaToVa(getSelectionStart());
|
||||
|
|
|
@ -35,6 +35,7 @@ signals:
|
|||
void displaySnowmanWidget();
|
||||
void displayLogWidget();
|
||||
void displayGraphWidget();
|
||||
void displaySymbolsWidget();
|
||||
|
||||
public slots:
|
||||
void setNewOriginHereActionSlot();
|
||||
|
@ -64,6 +65,7 @@ public slots:
|
|||
void findCallsSlot();
|
||||
void findPatternSlot();
|
||||
void findGUIDSlot();
|
||||
void findNamesSlot();
|
||||
void selectionGetSlot(SELECTIONDATA* selection);
|
||||
void selectionSetSlot(const SELECTIONDATA* selection);
|
||||
void selectionUpdatedSlot();
|
||||
|
@ -142,6 +144,7 @@ private:
|
|||
QAction* mFindCallsModule;
|
||||
QAction* mFindPatternModule;
|
||||
QAction* mFindGUIDModule;
|
||||
QAction* mFindNamesModule;
|
||||
|
||||
QAction* mFindCommandFunction;
|
||||
QAction* mFindConstantFunction;
|
||||
|
|
|
@ -341,6 +341,7 @@ MainWindow::MainWindow(QWidget* parent)
|
|||
connect(mCpuWidget->getDisasmWidget(), SIGNAL(displaySnowmanWidget()), this, SLOT(displaySnowmanWidget()));
|
||||
connect(mCpuWidget->getDisasmWidget(), SIGNAL(displayLogWidget()), this, SLOT(displayLogWidget()));
|
||||
connect(mCpuWidget->getDisasmWidget(), SIGNAL(displayGraphWidget()), this, SLOT(displayGraphWidget()));
|
||||
connect(mCpuWidget->getDisasmWidget(), SIGNAL(displaySymbolsWidget()), this, SLOT(displaySymbolWidget()));
|
||||
connect(mCpuWidget->getDisasmWidget(), SIGNAL(showPatches()), this, SLOT(patchWindow()));
|
||||
|
||||
connect(mGraphView, SIGNAL(displaySnowmanWidget()), this, SLOT(displaySnowmanWidget()));
|
||||
|
|
|
@ -100,6 +100,7 @@ SymbolView::SymbolView(QWidget* parent) : QWidget(parent), ui(new Ui::SymbolView
|
|||
connect(Bridge::getBridge(), SIGNAL(updateSymbolList(int, SYMBOLMODULEINFO*)), this, SLOT(updateSymbolList(int, SYMBOLMODULEINFO*)));
|
||||
connect(Bridge::getBridge(), SIGNAL(setSymbolProgress(int)), ui->symbolProgress, SLOT(setValue(int)));
|
||||
connect(Bridge::getBridge(), SIGNAL(symbolRefreshCurrent()), this, SLOT(symbolRefreshCurrent()));
|
||||
connect(Bridge::getBridge(), SIGNAL(symbolSelectModule(duint)), this, SLOT(symbolSelectModule(duint)));
|
||||
connect(mSearchListView, SIGNAL(listContextMenuSignal(QMenu*)), this, SLOT(symbolContextMenu(QMenu*)));
|
||||
connect(mSearchListView, SIGNAL(enterPressedSignal()), this, SLOT(enterPressedSlot()));
|
||||
connect(Config(), SIGNAL(colorsUpdated()), this, SLOT(updateStyle()));
|
||||
|
@ -361,6 +362,7 @@ void SymbolView::updateSymbolList(int module_count, SYMBOLMODULEINFO* modules)
|
|||
mModuleBaseList.insert(modName, modules[i].base);
|
||||
int party = DbgFunctions()->ModGetParty(modules[i].base);
|
||||
mModuleList->mList->setCellContent(i, 0, ToPtrString(modules[i].base));
|
||||
mModuleList->mList->setCellUserdata(i, 0, modules[i].base);
|
||||
mModuleList->mList->setCellContent(i, 1, modName);
|
||||
switch(party)
|
||||
{
|
||||
|
@ -430,6 +432,20 @@ void SymbolView::symbolFollowImport()
|
|||
}
|
||||
}
|
||||
|
||||
void SymbolView::symbolSelectModule(duint base)
|
||||
{
|
||||
for(dsint i = 0; i < mModuleList->mList->getRowCount(); i++)
|
||||
{
|
||||
if(mModuleList->mList->getCellUserdata(i, 0) == base)
|
||||
{
|
||||
mModuleList->mList->setSingleSelection(i);
|
||||
mModuleList->mSearchList->hide(); //This could be described as a hack, but you could also say it's like wiping sandpaper over your new white Tesla.
|
||||
mModuleList->mSearchBox->clear();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SymbolView::enterPressedSlot()
|
||||
{
|
||||
auto addr = DbgValFromString(mSearchListView->mCurList->getCellContent(mSearchListView->mCurList->getInitialSelection(), 0).toUtf8().constData());
|
||||
|
|
|
@ -33,6 +33,7 @@ private slots:
|
|||
void symbolFollow();
|
||||
void symbolFollowDump();
|
||||
void symbolFollowImport();
|
||||
void symbolSelectModule(duint base);
|
||||
void enterPressedSlot();
|
||||
void symbolContextMenu(QMenu* wMenu);
|
||||
void symbolRefreshCurrent();
|
||||
|
|
|
@ -495,6 +495,7 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
|
|||
defaultShortcuts.insert("ActionFindReferencesToSelectedAddress", Shortcut({tr("Actions"), tr("Find References to Selected Address")}, "Ctrl+R"));
|
||||
defaultShortcuts.insert("ActionFindPattern", Shortcut({tr("Actions"), tr("Find Pattern")}, "Ctrl+B"));
|
||||
defaultShortcuts.insert("ActionFindPatternInModule", Shortcut({tr("Actions"), tr("Find Pattern in Current Module")}, "Ctrl+Shift+B"));
|
||||
defaultShortcuts.insert("ActionFindNamesInModule", Shortcut({tr("Actions"), tr("Find Names in Current Module")}, "Ctrl+N"));
|
||||
defaultShortcuts.insert("ActionFindReferences", Shortcut({tr("Actions"), tr("Find References")}, "Ctrl+R"));
|
||||
defaultShortcuts.insert("ActionXrefs", Shortcut({tr("Actions"), tr("xrefs...")}, "X"));
|
||||
defaultShortcuts.insert("ActionAnalyzeSingleFunction", Shortcut({tr("Actions"), tr("Analyze Single Function")}, "A"));
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 668 B |
|
@ -313,5 +313,6 @@
|
|||
<file>images/donation_qr.png</file>
|
||||
<file>images/breakpoint_memory_read.png</file>
|
||||
<file>images/lib.png</file>
|
||||
<file>images/names.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
Loading…
Reference in New Issue