summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2024-04-22 15:42:38 -0400
committerBrandon Miller <bkmiller89@icloud.com>2024-04-25 10:56:18 -0400
commita365f6d72e6ab237bcf736dfcc5fd26e235a5c50 (patch)
tree95bbc499fd731d114cf73687bc3b6a122704037b /examples
parent6d2f7cd7f26f1d80cd0f591e1901d7cb40e8979b (diff)
Changed meaning of base detection results table
Now the results table consists of a high level report on number of hits per POI type for each candidate base address. The rebase address LineEdit is auto-populated when the user clicks on a row
Diffstat (limited to 'examples')
-rw-r--r--examples/triage/baseaddress.cpp68
-rw-r--r--examples/triage/baseaddress.h1
2 files changed, 46 insertions, 23 deletions
diff --git a/examples/triage/baseaddress.cpp b/examples/triage/baseaddress.cpp
index e50510a8..c4c57b1e 100644
--- a/examples/triage/baseaddress.cpp
+++ b/examples/triage/baseaddress.cpp
@@ -167,14 +167,23 @@ void BaseAddressDetectionWidget::HideResultsWidgets(bool hide)
}
+void BaseAddressDetectionWidget::GetClickedBaseAddress(const QModelIndex& index)
+{
+ if (index.isValid())
+ {
+ auto baseAddress = m_resultsTableWidget->item(index.row(), 0)->text();
+ m_reloadBase->setText(baseAddress);
+ }
+}
+
+
void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResults& results)
{
if (!results.Status.empty())
m_status->setText(QString::fromStdString(results.Status));
if (results.Status.empty() && m_worker->IsAborted())
- m_status->setText(QString("Aborted by user (Last Base: 0x%1)").arg(
- QString::number(results.LastTestedBaseAddress, 16)));
+ m_status->setText(QString("Aborted by user (Last Base: 0x%1)").arg(results.LastTestedBaseAddress, 0, 16));
if (results.Scores.empty())
{
@@ -188,35 +197,46 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
HideResultsWidgets(false);
if (results.Status.empty() && !m_worker->IsAborted())
m_status->setText("Completed with results");
- m_preferredBase->setText(QString("0x%1").arg(QString::number(results.Scores.rbegin()->second, 16)));
+ m_preferredBase->setText(QString("0x%1").arg(results.Scores.rbegin()->second, 0, 16));
m_confidence->setText(QString("%1 (Score: %2)").arg(
QString::fromStdString(BaseAddressDetectionConfidenceToString(results.Confidence)),
QString::number(results.Scores.rbegin()->first)));
- m_reloadBase->setText(QString("0x%1").arg(QString::number(results.Scores.rbegin()->second, 16)));
+ m_reloadBase->setText(QString("0x%1").arg(results.Scores.rbegin()->second, 0, 16));
}
m_resultsTableWidget->clearContents();
- size_t numRows = 0;
- for (auto rit = results.Scores.rbegin(); rit != results.Scores.rend(); rit++)
- numRows += results.Reasons.at(rit->second).size();
-
- m_resultsTableWidget->setRowCount(numRows);
+ m_resultsTableWidget->setRowCount(results.Scores.size());
size_t row = 0;
for (auto rit = results.Scores.rbegin(); rit != results.Scores.rend(); rit++)
{
auto [score, baseaddr] = *rit;
+ size_t strHits = 0;
+ size_t funcHits = 0;
+ size_t dataHits = 0;
for (const auto& reason : results.Reasons.at(baseaddr))
{
- m_resultsTableWidget->setItem(row, 0,
- new QTableWidgetItem(QString("0x%1").arg(QString::number(baseaddr, 16))));
- m_resultsTableWidget->setItem(row, 1, new QTableWidgetItem(
- QString("0x%1").arg(QString::number(reason.Pointer, 16))));
- m_resultsTableWidget->setItem(row, 2, new QTableWidgetItem(
- QString("0x%1").arg(QString::number(reason.POIOffset, 16))));
- m_resultsTableWidget->setItem(row, 3, new QTableWidgetItem(
- QString::fromStdString(BaseAddressDetectionPOITypeToString(reason.POIType))));
- row++;
+ switch (reason.POIType)
+ {
+ case POIString:
+ strHits++;
+ break;
+ case POIFunction:
+ funcHits++;
+ break;
+ case POIDataVariable:
+ dataHits++;
+ break;
+ default:
+ break;
+ }
}
+
+ m_resultsTableWidget->setItem(row, 0, new QTableWidgetItem(QString("0x%1").arg(baseaddr, 0, 16)));
+ m_resultsTableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(score)));
+ m_resultsTableWidget->setItem(row, 2, new QTableWidgetItem(QString::number(strHits)));
+ m_resultsTableWidget->setItem(row, 3, new QTableWidgetItem(QString::number(funcHits)));
+ m_resultsTableWidget->setItem(row, 4, new QTableWidgetItem(QString::number(dataHits)));
+ row++;
}
m_abortButton->setHidden(true);
@@ -343,7 +363,8 @@ void BaseAddressDetectionWidget::CreateAdvancedSettingsGroup()
}
-BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNinja::Ref<BinaryNinja::BinaryView> bv)
+BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent,
+ BinaryNinja::Ref<BinaryNinja::BinaryView> bv) : QWidget(parent)
{
m_view = bv->GetParentView() ? bv->GetParentView() : bv;
m_layout = new QGridLayout();
@@ -401,18 +422,19 @@ BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNi
m_layout->addWidget(m_confidence, row++, column + 3, Qt::AlignLeft);
m_resultsTableWidget = new QTableWidget(this);
- m_resultsTableWidget->setColumnCount(4);
+ m_resultsTableWidget->setColumnCount(5);
QStringList header;
- header << "Base Address" << "Pointer" << "POI Offset" << "POI Type";
+ header << "Base Address" << "Score" << "String Hits" << "Function Hits" << "Data Hits";
m_resultsTableWidget->setHorizontalHeaderLabels(header);
m_resultsTableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
m_resultsTableWidget->horizontalHeader()->setStretchLastSection(true);
m_resultsTableWidget->verticalHeader()->setVisible(false);
m_resultsTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
- m_resultsTableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
+ m_resultsTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
m_resultsTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
m_resultsTableWidget->setMinimumHeight(150);
- m_layout->addWidget(m_resultsTableWidget, row++, column, 1, 4);
+ m_layout->addWidget(m_resultsTableWidget, row++, column, 1, 5);
+ connect(m_resultsTableWidget, &QTableWidget::clicked, this, &BaseAddressDetectionWidget::GetClickedBaseAddress);
m_reloadBase = new QLineEdit("0x0");
m_layout->addWidget(m_reloadBase, row, column, Qt::AlignLeft);
diff --git a/examples/triage/baseaddress.h b/examples/triage/baseaddress.h
index 9a282f3e..5f3dbe98 100644
--- a/examples/triage/baseaddress.h
+++ b/examples/triage/baseaddress.h
@@ -82,6 +82,7 @@ class BaseAddressDetectionWidget : public QWidget
void HandleResults(const BaseAddressDetectionQtResults& results);
void HideResultsWidgets(bool hide);
void CreateAdvancedSettingsGroup();
+ void GetClickedBaseAddress(const QModelIndex& index);
public:
BaseAddressDetectionWidget(QWidget* parent, BinaryNinja::Ref<BinaryNinja::BinaryView> bv);