diff options
| author | Brandon Miller <brandon@vector35.com> | 2024-04-17 12:29:09 -0400 |
|---|---|---|
| committer | Brandon Miller <bkmiller89@icloud.com> | 2024-04-25 10:56:18 -0400 |
| commit | 2aa2be5c713a76c86118a225c5cae6ef3585412d (patch) | |
| tree | 05c21e8932d92604661077a9a6e2d0acc5620d2d /examples | |
| parent | 6d11f801e2dd6db6ccee618ec07d4a764878d950 (diff) | |
Simplified base address detection UI
Moved advanced settings to expandable group and no longer display
results items until analysis completes
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/triage/baseaddress.cpp | 101 | ||||
| -rw-r--r-- | examples/triage/baseaddress.h | 8 |
2 files changed, 65 insertions, 44 deletions
diff --git a/examples/triage/baseaddress.cpp b/examples/triage/baseaddress.cpp index 0acf66f6..663b1ff8 100644 --- a/examples/triage/baseaddress.cpp +++ b/examples/triage/baseaddress.cpp @@ -3,7 +3,7 @@ using namespace std; -BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString(const std::string& setting) +BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString(const string& setting) { if (setting == "Strings only") return POIAnalysisStringsOnly; @@ -13,7 +13,7 @@ BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString(const } -std::string BaseAddressDetectionPOITypeToString(BNBaseAddressDetectionPOIType type) +string BaseAddressDetectionPOITypeToString(BNBaseAddressDetectionPOIType type) { switch (type) { @@ -33,7 +33,7 @@ std::string BaseAddressDetectionPOITypeToString(BNBaseAddressDetectionPOIType ty } -std::string BaseAddressDetectionConfidenceToString(BNBaseAddressDetectionConfidence level) +string BaseAddressDetectionConfidenceToString(BNBaseAddressDetectionConfidence level) { switch (level) { @@ -167,11 +167,12 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul m_status->setText(QString::fromStdString(results.Status)); if (results.Status.empty() && m_worker->IsAborted()) - m_status->setText("Aborted by user (Last Base: 0x" + QString::number(results.LastTestedBaseAddress, 16) + ")"); + m_status->setText(QString("Aborted by user (Last Base: 0x%1)").arg( + QString::number(results.LastTestedBaseAddress, 16))); if (results.Scores.empty()) { - if (!m_worker->IsAborted()) + if (!m_worker->IsAborted() && results.Status.empty()) m_status->setText("Completed with no results"); m_preferredBase->setText("Not available"); m_confidence->setText("Not available"); @@ -181,10 +182,11 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul HideResultsWidgets(false); if (results.Status.empty() && !m_worker->IsAborted()) m_status->setText("Completed with results"); - m_preferredBase->setText("0x" + QString::number(results.Scores.rbegin()->second, 16)); - m_confidence->setText(QString::fromStdString(BaseAddressDetectionConfidenceToString(results.Confidence)) + - " (Score: " + QString::number(results.Scores.rbegin()->first) + ")"); - m_reloadBase->setText("0x" + QString::number(results.Scores.rbegin()->second, 16)); + m_preferredBase->setText(QString("0x%1").arg(QString::number(results.Scores.rbegin()->second, 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_resultsTableWidget->clearContents(); @@ -199,9 +201,12 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul auto [score, baseaddr] = *rit; for (const auto& reason : results.Reasons.at(baseaddr)) { - m_resultsTableWidget->setItem(row, 0, new QTableWidgetItem("0x" + QString::number(baseaddr, 16))); - m_resultsTableWidget->setItem(row, 1, new QTableWidgetItem("0x" + QString::number(reason.Pointer, 16))); - m_resultsTableWidget->setItem(row, 2, new QTableWidgetItem("0x" + QString::number(reason.POIOffset, 16))); + 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++; @@ -275,7 +280,44 @@ void BaseAddressDetectionWidget::RebaseWithFullAnalysis() return; if (!view->navigate(address)) - m_view->Navigate(std::string("Linear:" + frame->getCurrentDataType().toStdString()), address); + m_view->Navigate(string("Linear:" + frame->getCurrentDataType().toStdString()), address); +} + + +void BaseAddressDetectionWidget::CreateAdvancedSettingsGroup() +{ + int32_t row = 0; + int32_t column = 0; + auto grid = new QGridLayout(); + + grid->addWidget(new QLabel("Min. String Length:"), row, column, Qt::AlignLeft); + m_inputs.StrlenLineEdit = new QLineEdit("10"); + grid->addWidget(m_inputs.StrlenLineEdit, row, column + 1, Qt::AlignLeft); + + grid->addWidget(new QLabel("Alignment:"), row, column + 2, Qt::AlignLeft); + m_inputs.AlignmentLineEdit = new QLineEdit("1024"); + grid->addWidget(m_inputs.AlignmentLineEdit, row++, column + 3, Qt::AlignLeft); + + grid->addWidget(new QLabel("Lower Boundary:"), row, column, Qt::AlignLeft); + m_inputs.LowerBoundary = new QLineEdit("0x0"); + grid->addWidget(m_inputs.LowerBoundary, row, column + 1, Qt::AlignLeft); + + grid->addWidget(new QLabel("Upper Boundary:"), row, column + 2, Qt::AlignLeft); + m_inputs.UpperBoundary = new QLineEdit("0xffffffffffffffff"); + grid->addWidget(m_inputs.UpperBoundary, row++, column + 3, Qt::AlignLeft); + + grid->addWidget(new QLabel("Points Of Interest:"), row, column, Qt::AlignLeft); + auto poiList = QStringList() << "All" << "Strings only" << "Functions only"; + m_inputs.POIBox = new QComboBox(this); + m_inputs.POIBox->addItems(poiList); + grid->addWidget(m_inputs.POIBox, row, column + 1, Qt::AlignLeft); + + grid->addWidget(new QLabel("Max Pointers:"), row, column + 2, Qt::AlignLeft); + m_inputs.MaxPointersPerCluster = new QLineEdit("128"); + grid->addWidget(m_inputs.MaxPointersPerCluster, row++, column + 3, Qt::AlignLeft); + + m_advancedSettingsGroup = new ExpandableGroup(grid); + m_advancedSettingsGroup->setTitle("Advanced Settings"); } @@ -294,39 +336,16 @@ BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNi for (const auto& arch : architectures) archItemList << QString::fromStdString(arch->GetName()); m_inputs.ArchitectureBox->addItems(archItemList); - m_layout->addWidget(m_inputs.ArchitectureBox, row, column + 1, Qt::AlignLeft); + m_layout->addWidget(m_inputs.ArchitectureBox, row++, column + 1, Qt::AlignLeft); - m_layout->addWidget(new QLabel("Analysis Level:"), row, column + 2, Qt::AlignLeft); + m_layout->addWidget(new QLabel("Analysis Level:"), row, column, Qt::AlignLeft); m_inputs.AnalysisBox = new QComboBox(this); auto analysisItemList = QStringList() << "basic" << "controlFlow" << "full"; m_inputs.AnalysisBox->addItems(analysisItemList); - m_layout->addWidget(m_inputs.AnalysisBox, row++, column + 3, Qt::AlignLeft); + m_layout->addWidget(m_inputs.AnalysisBox, row++, column + 1, Qt::AlignLeft); - m_layout->addWidget(new QLabel("Min. String Length:"), row, column, Qt::AlignLeft); - m_inputs.StrlenLineEdit = new QLineEdit("10"); - m_layout->addWidget(m_inputs.StrlenLineEdit, row, column + 1, Qt::AlignLeft); - - m_layout->addWidget(new QLabel("Alignment:"), row, column + 2, Qt::AlignLeft); - m_inputs.AlignmentLineEdit = new QLineEdit("1024"); - m_layout->addWidget(m_inputs.AlignmentLineEdit, row++, column + 3, Qt::AlignLeft); - - m_layout->addWidget(new QLabel("Lower Boundary:"), row, column, Qt::AlignLeft); - m_inputs.LowerBoundary = new QLineEdit("0x0"); - m_layout->addWidget(m_inputs.LowerBoundary, row, column + 1, Qt::AlignLeft); - - m_layout->addWidget(new QLabel("Upper Boundary:"), row, column + 2, Qt::AlignLeft); - m_inputs.UpperBoundary = new QLineEdit("0xffffffffffffffff"); - m_layout->addWidget(m_inputs.UpperBoundary, row++, column + 3, Qt::AlignLeft); - - m_layout->addWidget(new QLabel("Points Of Interest:"), row, column, Qt::AlignLeft); - auto poiList = QStringList() << "All" << "Strings only" << "Functions only"; - m_inputs.POIBox = new QComboBox(this); - m_inputs.POIBox->addItems(poiList); - m_layout->addWidget(m_inputs.POIBox, row, column + 1, Qt::AlignLeft); - - m_layout->addWidget(new QLabel("Max Pointers:"), row, column + 2, Qt::AlignLeft); - m_inputs.MaxPointersPerCluster = new QLineEdit("128"); - m_layout->addWidget(m_inputs.MaxPointersPerCluster, row++, column + 3, Qt::AlignLeft); + CreateAdvancedSettingsGroup(); + m_layout->addWidget(m_advancedSettingsGroup, row++, column, 1, 4); m_startButton = new QPushButton("Start"); connect(m_startButton, &QPushButton::clicked, this, &BaseAddressDetectionWidget::DetectBaseAddress); diff --git a/examples/triage/baseaddress.h b/examples/triage/baseaddress.h index 25701947..9a282f3e 100644 --- a/examples/triage/baseaddress.h +++ b/examples/triage/baseaddress.h @@ -8,6 +8,7 @@ #include <QHeaderView> #include "theme.h" #include "fontsettings.h" +#include "expandablegroup.h" #include "viewframe.h" #include "binaryninjaapi.h" #include "binaryninjacore.h" @@ -60,12 +61,11 @@ class BaseAddressDetectionWidget : public QWidget { BaseAddressDetectionThread* m_worker; BinaryNinja::Ref<BinaryNinja::BinaryView> m_view; - QGridLayout* m_layout {}; + BaseAddressDetectionQtInputs m_inputs; + QGridLayout* m_layout {}; QPushButton* m_startButton = nullptr; QPushButton* m_abortButton = nullptr; - - BaseAddressDetectionQtInputs m_inputs; QLabel* m_preferredBaseLabel; QLabel* m_preferredBase; QLabel* m_confidenceLabel; @@ -74,12 +74,14 @@ class BaseAddressDetectionWidget : public QWidget QLineEdit* m_reloadBase; QPushButton* m_rebaseButton; QTableWidget* m_resultsTableWidget; + ExpandableGroup* m_advancedSettingsGroup; void DetectBaseAddress(); void RebaseWithFullAnalysis(); void Abort(); void HandleResults(const BaseAddressDetectionQtResults& results); void HideResultsWidgets(bool hide); + void CreateAdvancedSettingsGroup(); public: BaseAddressDetectionWidget(QWidget* parent, BinaryNinja::Ref<BinaryNinja::BinaryView> bv); |
