2017-03-29 10:18:37 +00:00
|
|
|
#include "xrefsdialog.h"
|
|
|
|
#include "ui_xrefsdialog.h"
|
|
|
|
|
|
|
|
#include "mainwindow.h"
|
|
|
|
|
|
|
|
XrefsDialog::XrefsDialog(MainWindow *main, QWidget *parent) :
|
|
|
|
QDialog(parent),
|
|
|
|
ui(new Ui::XrefsDialog)
|
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
2017-03-31 00:51:14 +00:00
|
|
|
setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint));
|
2017-03-29 10:18:37 +00:00
|
|
|
this->main = main;
|
|
|
|
|
|
|
|
// Increase asm text edit margin
|
|
|
|
QTextDocument *asm_docu = ui->previewTextEdit->document();
|
|
|
|
asm_docu->setDocumentMargin(10);
|
|
|
|
|
|
|
|
// Syntax highlight
|
|
|
|
highlighter = new Highlighter(this->main, ui->previewTextEdit->document());
|
|
|
|
|
|
|
|
// Highlight current line
|
|
|
|
connect(ui->previewTextEdit, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine()));
|
|
|
|
}
|
|
|
|
|
|
|
|
XrefsDialog::~XrefsDialog()
|
|
|
|
{
|
|
|
|
delete ui;
|
|
|
|
}
|
|
|
|
|
2017-06-07 10:56:55 +00:00
|
|
|
void XrefsDialog::fillRefs(QList<XRefDescription> refs, QList<XRefDescription> xrefs)
|
2017-04-09 19:55:06 +00:00
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->fromTreeWidget->clear();
|
2017-04-09 19:55:06 +00:00
|
|
|
for (int i = 0; i < refs.size(); ++i)
|
|
|
|
{
|
2017-06-07 15:48:36 +00:00
|
|
|
XRefDescription xref = refs[i];
|
|
|
|
|
2017-03-29 10:18:37 +00:00
|
|
|
QTreeWidgetItem *tempItem = new QTreeWidgetItem();
|
2017-06-07 15:48:36 +00:00
|
|
|
tempItem->setText(0, RAddressString(xref.to));
|
|
|
|
tempItem->setText(1, main->core->disassembleSingleInstruction(xref.from));
|
|
|
|
tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref));
|
2017-03-29 10:18:37 +00:00
|
|
|
//tempItem->setToolTip( 0, this->main->core->cmd("pdi 10 @ " + refs.at(i).at(0)) );
|
|
|
|
//tempItem->setToolTip( 1, this->main->core->cmd("pdi 10 @ " + refs.at(i).at(0)) );
|
2017-06-07 15:48:36 +00:00
|
|
|
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->fromTreeWidget->insertTopLevelItem(0, tempItem);
|
|
|
|
}
|
|
|
|
// Adjust columns to content
|
|
|
|
int count = ui->fromTreeWidget->columnCount();
|
2017-04-09 19:55:06 +00:00
|
|
|
for (int i = 0; i != count; ++i)
|
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->fromTreeWidget->resizeColumnToContents(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
ui->toTreeWidget->clear();
|
2017-04-09 19:55:06 +00:00
|
|
|
for (int i = 0; i < xrefs.size(); ++i)
|
|
|
|
{
|
2017-06-07 15:48:36 +00:00
|
|
|
XRefDescription xref = xrefs[i];
|
|
|
|
|
2017-03-29 10:18:37 +00:00
|
|
|
QTreeWidgetItem *tempItem = new QTreeWidgetItem();
|
2017-06-07 15:48:36 +00:00
|
|
|
tempItem->setText(0, RAddressString(xref.from));
|
|
|
|
tempItem->setText(1, main->core->disassembleSingleInstruction(xref.from));
|
|
|
|
tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref));
|
2017-03-29 10:18:37 +00:00
|
|
|
//tempItem->setToolTip( 0, this->main->core->cmd("pdi 10 @ " + xrefs.at(i).at(0)) );
|
|
|
|
//tempItem->setToolTip( 1, this->main->core->cmd("pdi 10 @ " + xrefs.at(i).at(0)) );
|
2017-06-07 15:48:36 +00:00
|
|
|
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->toTreeWidget->insertTopLevelItem(0, tempItem);
|
|
|
|
}
|
|
|
|
// Adjust columns to content
|
|
|
|
int count2 = ui->toTreeWidget->columnCount();
|
2017-04-09 19:55:06 +00:00
|
|
|
for (int i = 0; i != count2; ++i)
|
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->toTreeWidget->resizeColumnToContents(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void XrefsDialog::on_fromTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
|
|
|
|
{
|
2017-04-09 17:09:35 +00:00
|
|
|
QNOTUSED(column);
|
|
|
|
|
2017-03-29 10:18:37 +00:00
|
|
|
QString offset = item->text(0);
|
|
|
|
RAnalFunction *fcn = this->main->core->functionAt(offset.toLongLong(0, 16));
|
|
|
|
//this->add_debug_output( fcn->name );
|
|
|
|
this->main->seek(offset, fcn->name);
|
|
|
|
this->close();
|
|
|
|
}
|
|
|
|
|
|
|
|
void XrefsDialog::on_toTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
|
|
|
|
{
|
2017-04-09 17:09:35 +00:00
|
|
|
QNOTUSED(column);
|
|
|
|
|
2017-03-29 10:18:37 +00:00
|
|
|
QString offset = item->text(0);
|
|
|
|
RAnalFunction *fcn = this->main->core->functionAt(offset.toLongLong(0, 16));
|
|
|
|
//this->add_debug_output( fcn->name );
|
|
|
|
this->main->seek(offset, fcn->name);
|
|
|
|
this->close();
|
|
|
|
}
|
|
|
|
|
2017-04-09 19:55:06 +00:00
|
|
|
QString XrefsDialog::normalizeAddr(QString addr)
|
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
QString base = addr.split("0x")[1].trimmed();
|
|
|
|
int len = base.length();
|
2017-04-09 19:55:06 +00:00
|
|
|
if (len < 8)
|
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
int padding = 8 - len;
|
|
|
|
QString zero = "0";
|
|
|
|
QString zeroes = zero.repeated(padding);
|
|
|
|
QString s = "0x" + zeroes + base;
|
|
|
|
return s;
|
2017-04-09 19:55:06 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
return addr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-09 19:55:06 +00:00
|
|
|
void XrefsDialog::highlightCurrentLine()
|
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
QList<QTextEdit::ExtraSelection> extraSelections;
|
|
|
|
|
2017-04-09 19:55:06 +00:00
|
|
|
if (ui->previewTextEdit->isReadOnly())
|
|
|
|
{
|
2017-03-29 10:18:37 +00:00
|
|
|
QTextEdit::ExtraSelection selection;
|
|
|
|
|
|
|
|
QColor lineColor = QColor(190, 144, 212);
|
|
|
|
|
|
|
|
selection.format.setBackground(lineColor);
|
|
|
|
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
|
|
|
|
selection.cursor = ui->previewTextEdit->textCursor();
|
|
|
|
selection.cursor.clearSelection();
|
|
|
|
extraSelections.append(selection);
|
|
|
|
|
|
|
|
ui->previewTextEdit->setExtraSelections(extraSelections);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void XrefsDialog::on_fromTreeWidget_itemSelectionChanged()
|
|
|
|
{
|
|
|
|
QTreeWidgetItem *item = ui->fromTreeWidget->currentItem();
|
|
|
|
QString offset = item->text(0);
|
2017-04-09 19:55:06 +00:00
|
|
|
ui->previewTextEdit->setPlainText(this->main->core->cmd("pdf @ " + offset).trimmed());
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->previewTextEdit->moveCursor(QTextCursor::End);
|
2017-04-09 17:09:35 +00:00
|
|
|
// Does it make any sense?
|
2017-04-09 19:55:06 +00:00
|
|
|
ui->previewTextEdit->find(this->normalizeAddr(offset), QTextDocument::FindBackward);
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->previewTextEdit->moveCursor(QTextCursor::StartOfWord, QTextCursor::MoveAnchor);
|
|
|
|
}
|
|
|
|
|
|
|
|
void XrefsDialog::on_toTreeWidget_itemSelectionChanged()
|
|
|
|
{
|
|
|
|
QTreeWidgetItem *item = ui->toTreeWidget->currentItem();
|
|
|
|
QString offset = item->text(0);
|
2017-04-09 19:55:06 +00:00
|
|
|
ui->previewTextEdit->setPlainText(this->main->core->cmd("pdf @ " + offset).trimmed());
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->previewTextEdit->moveCursor(QTextCursor::End);
|
2017-04-09 17:09:35 +00:00
|
|
|
// Again, does it make any sense?
|
|
|
|
// Also, this code should be refactored and shared instead of copied & pasted
|
2017-04-09 19:55:06 +00:00
|
|
|
ui->previewTextEdit->find(this->normalizeAddr(offset), QTextDocument::FindBackward);
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->previewTextEdit->moveCursor(QTextCursor::StartOfWord, QTextCursor::MoveAnchor);
|
|
|
|
}
|
2017-04-04 11:19:34 +00:00
|
|
|
|
2017-04-09 19:55:06 +00:00
|
|
|
void XrefsDialog::updateLabels(QString name)
|
|
|
|
{
|
2017-06-07 15:48:36 +00:00
|
|
|
ui->label_2->setText(tr("X-Refs to %1:").arg(name));
|
|
|
|
ui->label_3->setText(tr("X-Refs from %1:").arg(name));
|
2017-04-04 11:19:34 +00:00
|
|
|
}
|
2017-06-07 15:48:36 +00:00
|
|
|
|
|
|
|
void XrefsDialog::fillRefsForFunction(RVA addr, QString name)
|
|
|
|
{
|
|
|
|
setWindowTitle(tr("X-Refs for function %1").arg(name));
|
|
|
|
updateLabels(name);
|
|
|
|
// Get Refs and Xrefs
|
|
|
|
|
|
|
|
// refs = calls q hace esa funcion
|
|
|
|
QList<XRefDescription> refs = main->core->getXRefs(addr, false, "C");
|
|
|
|
|
|
|
|
// xrefs = calls a esa funcion
|
|
|
|
QList<XRefDescription> xrefs = main->core->getXRefs(addr, true);
|
|
|
|
|
|
|
|
fillRefs(refs, xrefs);
|
|
|
|
}
|