diff --git a/src/dialogs/xrefsdialog.cpp b/src/dialogs/xrefsdialog.cpp index 2bc3225d..3d68aa83 100644 --- a/src/dialogs/xrefsdialog.cpp +++ b/src/dialogs/xrefsdialog.cpp @@ -182,20 +182,20 @@ void XrefsDialog::updateLabels(QString name) ui->label_3->setText(tr("X-Refs from %1:").arg(name)); } -void XrefsDialog::fillRefsForFunction(RVA addr, QString name) +void XrefsDialog::fillRefsForAddress(RVA addr, QString name, bool whole_function) { this->addr = addr; this->func_name = func_name; - setWindowTitle(tr("X-Refs for function %1").arg(name)); + setWindowTitle(tr("X-Refs for %1").arg(name)); updateLabels(name); // Get Refs and Xrefs // refs = calls q hace esa funcion - QList refs = main->core->getXRefs(addr, false, "C"); + QList refs = main->core->getXRefs(addr, false, whole_function); // xrefs = calls a esa funcion - QList xrefs = main->core->getXRefs(addr, true); + QList xrefs = main->core->getXRefs(addr, true, whole_function); fillRefs(refs, xrefs); } \ No newline at end of file diff --git a/src/dialogs/xrefsdialog.h b/src/dialogs/xrefsdialog.h index fe2b1854..cb6b907a 100644 --- a/src/dialogs/xrefsdialog.h +++ b/src/dialogs/xrefsdialog.h @@ -22,7 +22,7 @@ public: explicit XrefsDialog(MainWindow *main, QWidget *parent = 0); ~XrefsDialog(); - void fillRefsForFunction(RVA addr, QString name); + void fillRefsForAddress(RVA addr, QString name, bool whole_function); private slots: diff --git a/src/qrcore.cpp b/src/qrcore.cpp index 9ddc02eb..7ed2d7a7 100644 --- a/src/qrcore.cpp +++ b/src/qrcore.cpp @@ -1090,7 +1090,7 @@ QList QRCore::getAllSections() return ret; } -QList QRCore::getXRefs(RVA addr, bool to, const QString &filterType) +QList QRCore::getXRefs(RVA addr, bool to, bool whole_function, const QString &filterType) { QList ret = QList(); @@ -1113,6 +1113,9 @@ QList QRCore::getXRefs(RVA addr, bool to, const QString &filter xref.from = xrefObject["from"].toVariant().toULongLong(); + if (!whole_function && !to && xref.from != addr) + continue; + if (to && !xrefObject.contains("to")) xref.to = addr; else diff --git a/src/qrcore.h b/src/qrcore.h index 417feef3..93c2e7ef 100644 --- a/src/qrcore.h +++ b/src/qrcore.h @@ -234,7 +234,7 @@ public: QList getAllFlags(QString flagspace = NULL); QList getAllSections(); - QList getXRefs(RVA addr, bool to, const QString &filterType = QString::null); + QList getXRefs(RVA addr, bool to, bool whole_function, const QString &filterType = QString::null); RCoreLocked core() const; diff --git a/src/widgets/dashboard.cpp b/src/widgets/dashboard.cpp index b8356803..791e6188 100644 --- a/src/widgets/dashboard.cpp +++ b/src/widgets/dashboard.cpp @@ -71,6 +71,7 @@ void Dashboard::updateContents() this->ui->endianEdit->setText(item2["endian"].toString()); this->ui->compiledEdit->setText(item2["compiled"].toString()); this->ui->bitsEdit->setText(QString::number(item2["bits"].toDouble())); + if (item2["relro"].isUndefined()) { QString relro=item2["relro"].toString().split(" ").at(0); relro[0]=relro[0].toUpper(); diff --git a/src/widgets/functionswidget.cpp b/src/widgets/functionswidget.cpp index 72a23844..8676d48a 100644 --- a/src/widgets/functionswidget.cpp +++ b/src/widgets/functionswidget.cpp @@ -509,7 +509,7 @@ void FunctionsWidget::on_action_References_triggered() QTreeView *treeView = getCurrentTreeView(); FunctionDescription function = treeView->selectionModel()->currentIndex().data(FunctionModel::FunctionDescriptionRole).value(); XrefsDialog *x = new XrefsDialog(this->main, this); - x->fillRefsForFunction(function.offset, function.name); + x->fillRefsForAddress(function.offset, function.name, true); x->exec(); } diff --git a/src/widgets/memorywidget.cpp b/src/widgets/memorywidget.cpp index f79cbdb2..18ba88c3 100644 --- a/src/widgets/memorywidget.cpp +++ b/src/widgets/memorywidget.cpp @@ -151,10 +151,11 @@ MemoryWidget::MemoryWidget(MainWindow *main) : connect(ui->hexASCIIText_2->verticalScrollBar(), SIGNAL(valueChanged(int)), ui->hexHexText_2->verticalScrollBar(), SLOT(setValue(int))); - // X to show hexdump - QShortcut *hexdump_shortcut = new QShortcut(QKeySequence(Qt::Key_X), this->main); - connect(hexdump_shortcut, SIGNAL(activated()), this, SLOT(showHexdump())); - //hexdump_shortcut->setContext(Qt::WidgetShortcut); + // x or X to show XRefs + connect(new QShortcut(QKeySequence(Qt::Key_X), ui->disasTextEdit_2), + SIGNAL(activated()), this, SLOT(showXrefsDialog())); + connect(new QShortcut(Qt::SHIFT + Qt::Key_X, ui->disasTextEdit_2), + SIGNAL(activated()), this, SLOT(showXrefsDialog())); // Space to switch between disassembly and graph QShortcut *graph_shortcut = new QShortcut(QKeySequence(Qt::Key_Space), this->main); @@ -171,11 +172,6 @@ MemoryWidget::MemoryWidget(MainWindow *main) : connect(rename_shortcut, SIGNAL(activated()), this, SLOT(on_actionFunctionsRename_triggered())); rename_shortcut->setContext(Qt::WidgetShortcut); - // R to show XRefs - QShortcut *xrefs_shortcut = new QShortcut(QKeySequence(Qt::Key_R), ui->disasTextEdit_2); - connect(xrefs_shortcut, SIGNAL(activated()), this, SLOT(on_actionXRefs_triggered())); - xrefs_shortcut->setContext(Qt::WidgetShortcut); - // Esc to seek back QShortcut *back_shortcut = new QShortcut(QKeySequence(Qt::Key_Escape), ui->disasTextEdit_2); connect(back_shortcut, SIGNAL(activated()), this, SLOT(seek_back())); @@ -1055,32 +1051,49 @@ void MemoryWidget::on_offsetToolButton_clicked() } } + +void MemoryWidget::showXrefsDialog() +{ + // Get current offset + QTextCursor tc = this->disasTextEdit->textCursor(); + tc.select(QTextCursor::LineUnderCursor); + QString lastline = tc.selectedText(); + QString ele = lastline.split(" ", QString::SkipEmptyParts)[0]; + if (ele.contains("0x")) + { + RVA addr = ele.toLongLong(0, 16); + XrefsDialog *x = new XrefsDialog(this->main, this); + x->fillRefsForAddress(addr, RAddressString(addr), false); + x->exec(); + } +} + /* * Show widgets */ -void MemoryWidget::showHexdump() -{ - ui->hexButton_2->setChecked(true); - ui->memTabWidget->setCurrentIndex(1); - ui->memSideTabWidget_2->setCurrentIndex(1); -} - void MemoryWidget::cycleViews() { - if (ui->memTabWidget->currentIndex() == 0) + switch (ui->memTabWidget->currentIndex()) { + case 0: // Show graph ui->graphButton_2->setChecked(true); ui->memTabWidget->setCurrentIndex(2); ui->memSideTabWidget_2->setCurrentIndex(0); - } - else - { + break; + case 2: + // Show hexdump + ui->hexButton_2->setChecked(true); + ui->memTabWidget->setCurrentIndex(1); + ui->memSideTabWidget_2->setCurrentIndex(1); + break; + default: // Show disasm ui->disButton_2->setChecked(true); ui->memTabWidget->setCurrentIndex(0); ui->memSideTabWidget_2->setCurrentIndex(0); + break; } } @@ -1403,10 +1416,10 @@ void MemoryWidget::on_codeCombo_2_currentTextChanged(const QString &arg1) void MemoryWidget::get_refs_data(RVA addr) { // refs = calls q hace esa funcion - QList refs = main->core->getXRefs(addr, false, "C"); + QList refs = main->core->getXRefs(addr, false, false); // xrefs = calls a esa funcion - QList xrefs = main->core->getXRefs(addr, true); + QList xrefs = main->core->getXRefs(addr, true, false); // Data for the disasm side graph QList data; @@ -1830,23 +1843,7 @@ void MemoryWidget::setScrollMode() void MemoryWidget::on_actionXRefs_triggered() { - // Get current offset - QTextCursor tc = this->disasTextEdit->textCursor(); - tc.select(QTextCursor::LineUnderCursor); - QString lastline = tc.selectedText(); - QString ele = lastline.split(" ", QString::SkipEmptyParts)[0]; - if (ele.contains("0x")) - { - // Get function for clicked offset - RAnalFunction *fcn = this->main->core->functionAt(ele.toLongLong(0, 16)); - if (!fcn) - { - return; - } - XrefsDialog *x = new XrefsDialog(this->main, this); - x->fillRefsForFunction(fcn->addr, QString::fromUtf8(fcn->name)); - x->exec(); - } + showXrefsDialog(); } diff --git a/src/widgets/memorywidget.h b/src/widgets/memorywidget.h index cd25fdbf..13a8b06c 100644 --- a/src/widgets/memorywidget.h +++ b/src/widgets/memorywidget.h @@ -158,8 +158,9 @@ private slots: void hexScrolled(); QList get_hexdump(const QString &offset); + void showXrefsDialog(); //void showDisas(); - void showHexdump(); + //void showHexdump(); //void showGraph(); void cycleViews(); void on_xreFromTreeWidget_2_itemDoubleClicked(QTreeWidgetItem *item, int column);