Skip to content

Commit 2aa2be5

Browse files
committed
Simplified base address detection UI
Moved advanced settings to expandable group and no longer display results items until analysis completes
1 parent 6d11f80 commit 2aa2be5

File tree

4 files changed

+66
-45
lines changed

4 files changed

+66
-45
lines changed

basedetection.h

Whitespace-only changes.

binaryninjacore.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
// Current ABI version for linking to the core. This is incremented any time
3838
// there are changes to the API that affect linking, including new functions,
3939
// new types, or modifications to existing functions or types.
40-
#define BN_CURRENT_CORE_ABI_VERSION 59
40+
#define BN_CURRENT_CORE_ABI_VERSION 60
4141

4242
// Minimum ABI version that is supported for loading of plugins. Plugins that
4343
// are linked to an ABI version less than this will not be able to load and

examples/triage/baseaddress.cpp

Lines changed: 60 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using namespace std;
44

55

6-
BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString(const std::string& setting)
6+
BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString(const string& setting)
77
{
88
if (setting == "Strings only")
99
return POIAnalysisStringsOnly;
@@ -13,7 +13,7 @@ BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString(const
1313
}
1414

1515

16-
std::string BaseAddressDetectionPOITypeToString(BNBaseAddressDetectionPOIType type)
16+
string BaseAddressDetectionPOITypeToString(BNBaseAddressDetectionPOIType type)
1717
{
1818
switch (type)
1919
{
@@ -33,7 +33,7 @@ std::string BaseAddressDetectionPOITypeToString(BNBaseAddressDetectionPOIType ty
3333
}
3434

3535

36-
std::string BaseAddressDetectionConfidenceToString(BNBaseAddressDetectionConfidence level)
36+
string BaseAddressDetectionConfidenceToString(BNBaseAddressDetectionConfidence level)
3737
{
3838
switch (level)
3939
{
@@ -167,11 +167,12 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
167167
m_status->setText(QString::fromStdString(results.Status));
168168

169169
if (results.Status.empty() && m_worker->IsAborted())
170-
m_status->setText("Aborted by user (Last Base: 0x" + QString::number(results.LastTestedBaseAddress, 16) + ")");
170+
m_status->setText(QString("Aborted by user (Last Base: 0x%1)").arg(
171+
QString::number(results.LastTestedBaseAddress, 16)));
171172

172173
if (results.Scores.empty())
173174
{
174-
if (!m_worker->IsAborted())
175+
if (!m_worker->IsAborted() && results.Status.empty())
175176
m_status->setText("Completed with no results");
176177
m_preferredBase->setText("Not available");
177178
m_confidence->setText("Not available");
@@ -181,10 +182,11 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
181182
HideResultsWidgets(false);
182183
if (results.Status.empty() && !m_worker->IsAborted())
183184
m_status->setText("Completed with results");
184-
m_preferredBase->setText("0x" + QString::number(results.Scores.rbegin()->second, 16));
185-
m_confidence->setText(QString::fromStdString(BaseAddressDetectionConfidenceToString(results.Confidence)) +
186-
" (Score: " + QString::number(results.Scores.rbegin()->first) + ")");
187-
m_reloadBase->setText("0x" + QString::number(results.Scores.rbegin()->second, 16));
185+
m_preferredBase->setText(QString("0x%1").arg(QString::number(results.Scores.rbegin()->second, 16)));
186+
m_confidence->setText(QString("%1 (Score: %2)").arg(
187+
QString::fromStdString(BaseAddressDetectionConfidenceToString(results.Confidence)),
188+
QString::number(results.Scores.rbegin()->first)));
189+
m_reloadBase->setText(QString("0x%1").arg(QString::number(results.Scores.rbegin()->second, 16)));
188190
}
189191

190192
m_resultsTableWidget->clearContents();
@@ -199,9 +201,12 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
199201
auto [score, baseaddr] = *rit;
200202
for (const auto& reason : results.Reasons.at(baseaddr))
201203
{
202-
m_resultsTableWidget->setItem(row, 0, new QTableWidgetItem("0x" + QString::number(baseaddr, 16)));
203-
m_resultsTableWidget->setItem(row, 1, new QTableWidgetItem("0x" + QString::number(reason.Pointer, 16)));
204-
m_resultsTableWidget->setItem(row, 2, new QTableWidgetItem("0x" + QString::number(reason.POIOffset, 16)));
204+
m_resultsTableWidget->setItem(row, 0,
205+
new QTableWidgetItem(QString("0x%1").arg(QString::number(baseaddr, 16))));
206+
m_resultsTableWidget->setItem(row, 1, new QTableWidgetItem(
207+
QString("0x%1").arg(QString::number(reason.Pointer, 16))));
208+
m_resultsTableWidget->setItem(row, 2, new QTableWidgetItem(
209+
QString("0x%1").arg(QString::number(reason.POIOffset, 16))));
205210
m_resultsTableWidget->setItem(row, 3, new QTableWidgetItem(
206211
QString::fromStdString(BaseAddressDetectionPOITypeToString(reason.POIType))));
207212
row++;
@@ -275,7 +280,44 @@ void BaseAddressDetectionWidget::RebaseWithFullAnalysis()
275280
return;
276281

277282
if (!view->navigate(address))
278-
m_view->Navigate(std::string("Linear:" + frame->getCurrentDataType().toStdString()), address);
283+
m_view->Navigate(string("Linear:" + frame->getCurrentDataType().toStdString()), address);
284+
}
285+
286+
287+
void BaseAddressDetectionWidget::CreateAdvancedSettingsGroup()
288+
{
289+
int32_t row = 0;
290+
int32_t column = 0;
291+
auto grid = new QGridLayout();
292+
293+
grid->addWidget(new QLabel("Min. String Length:"), row, column, Qt::AlignLeft);
294+
m_inputs.StrlenLineEdit = new QLineEdit("10");
295+
grid->addWidget(m_inputs.StrlenLineEdit, row, column + 1, Qt::AlignLeft);
296+
297+
grid->addWidget(new QLabel("Alignment:"), row, column + 2, Qt::AlignLeft);
298+
m_inputs.AlignmentLineEdit = new QLineEdit("1024");
299+
grid->addWidget(m_inputs.AlignmentLineEdit, row++, column + 3, Qt::AlignLeft);
300+
301+
grid->addWidget(new QLabel("Lower Boundary:"), row, column, Qt::AlignLeft);
302+
m_inputs.LowerBoundary = new QLineEdit("0x0");
303+
grid->addWidget(m_inputs.LowerBoundary, row, column + 1, Qt::AlignLeft);
304+
305+
grid->addWidget(new QLabel("Upper Boundary:"), row, column + 2, Qt::AlignLeft);
306+
m_inputs.UpperBoundary = new QLineEdit("0xffffffffffffffff");
307+
grid->addWidget(m_inputs.UpperBoundary, row++, column + 3, Qt::AlignLeft);
308+
309+
grid->addWidget(new QLabel("Points Of Interest:"), row, column, Qt::AlignLeft);
310+
auto poiList = QStringList() << "All" << "Strings only" << "Functions only";
311+
m_inputs.POIBox = new QComboBox(this);
312+
m_inputs.POIBox->addItems(poiList);
313+
grid->addWidget(m_inputs.POIBox, row, column + 1, Qt::AlignLeft);
314+
315+
grid->addWidget(new QLabel("Max Pointers:"), row, column + 2, Qt::AlignLeft);
316+
m_inputs.MaxPointersPerCluster = new QLineEdit("128");
317+
grid->addWidget(m_inputs.MaxPointersPerCluster, row++, column + 3, Qt::AlignLeft);
318+
319+
m_advancedSettingsGroup = new ExpandableGroup(grid);
320+
m_advancedSettingsGroup->setTitle("Advanced Settings");
279321
}
280322

281323

@@ -294,39 +336,16 @@ BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNi
294336
for (const auto& arch : architectures)
295337
archItemList << QString::fromStdString(arch->GetName());
296338
m_inputs.ArchitectureBox->addItems(archItemList);
297-
m_layout->addWidget(m_inputs.ArchitectureBox, row, column + 1, Qt::AlignLeft);
339+
m_layout->addWidget(m_inputs.ArchitectureBox, row++, column + 1, Qt::AlignLeft);
298340

299-
m_layout->addWidget(new QLabel("Analysis Level:"), row, column + 2, Qt::AlignLeft);
341+
m_layout->addWidget(new QLabel("Analysis Level:"), row, column, Qt::AlignLeft);
300342
m_inputs.AnalysisBox = new QComboBox(this);
301343
auto analysisItemList = QStringList() << "basic" << "controlFlow" << "full";
302344
m_inputs.AnalysisBox->addItems(analysisItemList);
303-
m_layout->addWidget(m_inputs.AnalysisBox, row++, column + 3, Qt::AlignLeft);
345+
m_layout->addWidget(m_inputs.AnalysisBox, row++, column + 1, Qt::AlignLeft);
304346

305-
m_layout->addWidget(new QLabel("Min. String Length:"), row, column, Qt::AlignLeft);
306-
m_inputs.StrlenLineEdit = new QLineEdit("10");
307-
m_layout->addWidget(m_inputs.StrlenLineEdit, row, column + 1, Qt::AlignLeft);
308-
309-
m_layout->addWidget(new QLabel("Alignment:"), row, column + 2, Qt::AlignLeft);
310-
m_inputs.AlignmentLineEdit = new QLineEdit("1024");
311-
m_layout->addWidget(m_inputs.AlignmentLineEdit, row++, column + 3, Qt::AlignLeft);
312-
313-
m_layout->addWidget(new QLabel("Lower Boundary:"), row, column, Qt::AlignLeft);
314-
m_inputs.LowerBoundary = new QLineEdit("0x0");
315-
m_layout->addWidget(m_inputs.LowerBoundary, row, column + 1, Qt::AlignLeft);
316-
317-
m_layout->addWidget(new QLabel("Upper Boundary:"), row, column + 2, Qt::AlignLeft);
318-
m_inputs.UpperBoundary = new QLineEdit("0xffffffffffffffff");
319-
m_layout->addWidget(m_inputs.UpperBoundary, row++, column + 3, Qt::AlignLeft);
320-
321-
m_layout->addWidget(new QLabel("Points Of Interest:"), row, column, Qt::AlignLeft);
322-
auto poiList = QStringList() << "All" << "Strings only" << "Functions only";
323-
m_inputs.POIBox = new QComboBox(this);
324-
m_inputs.POIBox->addItems(poiList);
325-
m_layout->addWidget(m_inputs.POIBox, row, column + 1, Qt::AlignLeft);
326-
327-
m_layout->addWidget(new QLabel("Max Pointers:"), row, column + 2, Qt::AlignLeft);
328-
m_inputs.MaxPointersPerCluster = new QLineEdit("128");
329-
m_layout->addWidget(m_inputs.MaxPointersPerCluster, row++, column + 3, Qt::AlignLeft);
347+
CreateAdvancedSettingsGroup();
348+
m_layout->addWidget(m_advancedSettingsGroup, row++, column, 1, 4);
330349

331350
m_startButton = new QPushButton("Start");
332351
connect(m_startButton, &QPushButton::clicked, this, &BaseAddressDetectionWidget::DetectBaseAddress);

examples/triage/baseaddress.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <QHeaderView>
99
#include "theme.h"
1010
#include "fontsettings.h"
11+
#include "expandablegroup.h"
1112
#include "viewframe.h"
1213
#include "binaryninjaapi.h"
1314
#include "binaryninjacore.h"
@@ -60,12 +61,11 @@ class BaseAddressDetectionWidget : public QWidget
6061
{
6162
BaseAddressDetectionThread* m_worker;
6263
BinaryNinja::Ref<BinaryNinja::BinaryView> m_view;
63-
QGridLayout* m_layout {};
64+
BaseAddressDetectionQtInputs m_inputs;
6465

66+
QGridLayout* m_layout {};
6567
QPushButton* m_startButton = nullptr;
6668
QPushButton* m_abortButton = nullptr;
67-
68-
BaseAddressDetectionQtInputs m_inputs;
6969
QLabel* m_preferredBaseLabel;
7070
QLabel* m_preferredBase;
7171
QLabel* m_confidenceLabel;
@@ -74,12 +74,14 @@ class BaseAddressDetectionWidget : public QWidget
7474
QLineEdit* m_reloadBase;
7575
QPushButton* m_rebaseButton;
7676
QTableWidget* m_resultsTableWidget;
77+
ExpandableGroup* m_advancedSettingsGroup;
7778

7879
void DetectBaseAddress();
7980
void RebaseWithFullAnalysis();
8081
void Abort();
8182
void HandleResults(const BaseAddressDetectionQtResults& results);
8283
void HideResultsWidgets(bool hide);
84+
void CreateAdvancedSettingsGroup();
8385

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

0 commit comments

Comments
 (0)