Skip to content

Commit a365f6d

Browse files
committed
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
1 parent 6d2f7cd commit a365f6d

File tree

2 files changed

+46
-23
lines changed

2 files changed

+46
-23
lines changed

examples/triage/baseaddress.cpp

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,23 @@ void BaseAddressDetectionWidget::HideResultsWidgets(bool hide)
167167
}
168168

169169

170+
void BaseAddressDetectionWidget::GetClickedBaseAddress(const QModelIndex& index)
171+
{
172+
if (index.isValid())
173+
{
174+
auto baseAddress = m_resultsTableWidget->item(index.row(), 0)->text();
175+
m_reloadBase->setText(baseAddress);
176+
}
177+
}
178+
179+
170180
void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResults& results)
171181
{
172182
if (!results.Status.empty())
173183
m_status->setText(QString::fromStdString(results.Status));
174184

175185
if (results.Status.empty() && m_worker->IsAborted())
176-
m_status->setText(QString("Aborted by user (Last Base: 0x%1)").arg(
177-
QString::number(results.LastTestedBaseAddress, 16)));
186+
m_status->setText(QString("Aborted by user (Last Base: 0x%1)").arg(results.LastTestedBaseAddress, 0, 16));
178187

179188
if (results.Scores.empty())
180189
{
@@ -188,35 +197,46 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
188197
HideResultsWidgets(false);
189198
if (results.Status.empty() && !m_worker->IsAborted())
190199
m_status->setText("Completed with results");
191-
m_preferredBase->setText(QString("0x%1").arg(QString::number(results.Scores.rbegin()->second, 16)));
200+
m_preferredBase->setText(QString("0x%1").arg(results.Scores.rbegin()->second, 0, 16));
192201
m_confidence->setText(QString("%1 (Score: %2)").arg(
193202
QString::fromStdString(BaseAddressDetectionConfidenceToString(results.Confidence)),
194203
QString::number(results.Scores.rbegin()->first)));
195-
m_reloadBase->setText(QString("0x%1").arg(QString::number(results.Scores.rbegin()->second, 16)));
204+
m_reloadBase->setText(QString("0x%1").arg(results.Scores.rbegin()->second, 0, 16));
196205
}
197206

198207
m_resultsTableWidget->clearContents();
199-
size_t numRows = 0;
200-
for (auto rit = results.Scores.rbegin(); rit != results.Scores.rend(); rit++)
201-
numRows += results.Reasons.at(rit->second).size();
202-
203-
m_resultsTableWidget->setRowCount(numRows);
208+
m_resultsTableWidget->setRowCount(results.Scores.size());
204209
size_t row = 0;
205210
for (auto rit = results.Scores.rbegin(); rit != results.Scores.rend(); rit++)
206211
{
207212
auto [score, baseaddr] = *rit;
213+
size_t strHits = 0;
214+
size_t funcHits = 0;
215+
size_t dataHits = 0;
208216
for (const auto& reason : results.Reasons.at(baseaddr))
209217
{
210-
m_resultsTableWidget->setItem(row, 0,
211-
new QTableWidgetItem(QString("0x%1").arg(QString::number(baseaddr, 16))));
212-
m_resultsTableWidget->setItem(row, 1, new QTableWidgetItem(
213-
QString("0x%1").arg(QString::number(reason.Pointer, 16))));
214-
m_resultsTableWidget->setItem(row, 2, new QTableWidgetItem(
215-
QString("0x%1").arg(QString::number(reason.POIOffset, 16))));
216-
m_resultsTableWidget->setItem(row, 3, new QTableWidgetItem(
217-
QString::fromStdString(BaseAddressDetectionPOITypeToString(reason.POIType))));
218-
row++;
218+
switch (reason.POIType)
219+
{
220+
case POIString:
221+
strHits++;
222+
break;
223+
case POIFunction:
224+
funcHits++;
225+
break;
226+
case POIDataVariable:
227+
dataHits++;
228+
break;
229+
default:
230+
break;
231+
}
219232
}
233+
234+
m_resultsTableWidget->setItem(row, 0, new QTableWidgetItem(QString("0x%1").arg(baseaddr, 0, 16)));
235+
m_resultsTableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(score)));
236+
m_resultsTableWidget->setItem(row, 2, new QTableWidgetItem(QString::number(strHits)));
237+
m_resultsTableWidget->setItem(row, 3, new QTableWidgetItem(QString::number(funcHits)));
238+
m_resultsTableWidget->setItem(row, 4, new QTableWidgetItem(QString::number(dataHits)));
239+
row++;
220240
}
221241

222242
m_abortButton->setHidden(true);
@@ -343,7 +363,8 @@ void BaseAddressDetectionWidget::CreateAdvancedSettingsGroup()
343363
}
344364

345365

346-
BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNinja::Ref<BinaryNinja::BinaryView> bv)
366+
BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent,
367+
BinaryNinja::Ref<BinaryNinja::BinaryView> bv) : QWidget(parent)
347368
{
348369
m_view = bv->GetParentView() ? bv->GetParentView() : bv;
349370
m_layout = new QGridLayout();
@@ -401,18 +422,19 @@ BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNi
401422
m_layout->addWidget(m_confidence, row++, column + 3, Qt::AlignLeft);
402423

403424
m_resultsTableWidget = new QTableWidget(this);
404-
m_resultsTableWidget->setColumnCount(4);
425+
m_resultsTableWidget->setColumnCount(5);
405426
QStringList header;
406-
header << "Base Address" << "Pointer" << "POI Offset" << "POI Type";
427+
header << "Base Address" << "Score" << "String Hits" << "Function Hits" << "Data Hits";
407428
m_resultsTableWidget->setHorizontalHeaderLabels(header);
408429
m_resultsTableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
409430
m_resultsTableWidget->horizontalHeader()->setStretchLastSection(true);
410431
m_resultsTableWidget->verticalHeader()->setVisible(false);
411432
m_resultsTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
412-
m_resultsTableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
433+
m_resultsTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
413434
m_resultsTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
414435
m_resultsTableWidget->setMinimumHeight(150);
415-
m_layout->addWidget(m_resultsTableWidget, row++, column, 1, 4);
436+
m_layout->addWidget(m_resultsTableWidget, row++, column, 1, 5);
437+
connect(m_resultsTableWidget, &QTableWidget::clicked, this, &BaseAddressDetectionWidget::GetClickedBaseAddress);
416438

417439
m_reloadBase = new QLineEdit("0x0");
418440
m_layout->addWidget(m_reloadBase, row, column, Qt::AlignLeft);

examples/triage/baseaddress.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class BaseAddressDetectionWidget : public QWidget
8282
void HandleResults(const BaseAddressDetectionQtResults& results);
8383
void HideResultsWidgets(bool hide);
8484
void CreateAdvancedSettingsGroup();
85+
void GetClickedBaseAddress(const QModelIndex& index);
8586

8687
public:
8788
BaseAddressDetectionWidget(QWidget* parent, BinaryNinja::Ref<BinaryNinja::BinaryView> bv);

0 commit comments

Comments
 (0)