3
3
using namespace std ;
4
4
5
5
6
- BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString (const std:: string& setting)
6
+ BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString (const string& setting)
7
7
{
8
8
if (setting == " Strings only" )
9
9
return POIAnalysisStringsOnly;
@@ -13,7 +13,7 @@ BNBaseAddressDetectionPOISetting BaseAddressDetectionPOISettingFromString(const
13
13
}
14
14
15
15
16
- std:: string BaseAddressDetectionPOITypeToString (BNBaseAddressDetectionPOIType type)
16
+ string BaseAddressDetectionPOITypeToString (BNBaseAddressDetectionPOIType type)
17
17
{
18
18
switch (type)
19
19
{
@@ -33,7 +33,7 @@ std::string BaseAddressDetectionPOITypeToString(BNBaseAddressDetectionPOIType ty
33
33
}
34
34
35
35
36
- std:: string BaseAddressDetectionConfidenceToString (BNBaseAddressDetectionConfidence level)
36
+ string BaseAddressDetectionConfidenceToString (BNBaseAddressDetectionConfidence level)
37
37
{
38
38
switch (level)
39
39
{
@@ -167,11 +167,12 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
167
167
m_status->setText (QString::fromStdString (results.Status ));
168
168
169
169
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 )));
171
172
172
173
if (results.Scores .empty ())
173
174
{
174
- if (!m_worker->IsAborted ())
175
+ if (!m_worker->IsAborted () && results. Status . empty () )
175
176
m_status->setText (" Completed with no results" );
176
177
m_preferredBase->setText (" Not available" );
177
178
m_confidence->setText (" Not available" );
@@ -181,10 +182,11 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
181
182
HideResultsWidgets (false );
182
183
if (results.Status .empty () && !m_worker->IsAborted ())
183
184
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 )));
188
190
}
189
191
190
192
m_resultsTableWidget->clearContents ();
@@ -199,9 +201,12 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
199
201
auto [score, baseaddr] = *rit;
200
202
for (const auto & reason : results.Reasons .at (baseaddr))
201
203
{
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 ))));
205
210
m_resultsTableWidget->setItem (row, 3 , new QTableWidgetItem (
206
211
QString::fromStdString (BaseAddressDetectionPOITypeToString (reason.POIType ))));
207
212
row++;
@@ -275,7 +280,44 @@ void BaseAddressDetectionWidget::RebaseWithFullAnalysis()
275
280
return ;
276
281
277
282
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" );
279
321
}
280
322
281
323
@@ -294,39 +336,16 @@ BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNi
294
336
for (const auto & arch : architectures)
295
337
archItemList << QString::fromStdString (arch->GetName ());
296
338
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);
298
340
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);
300
342
m_inputs.AnalysisBox = new QComboBox (this );
301
343
auto analysisItemList = QStringList () << " basic" << " controlFlow" << " full" ;
302
344
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);
304
346
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 );
330
349
331
350
m_startButton = new QPushButton (" Start" );
332
351
connect (m_startButton, &QPushButton::clicked, this , &BaseAddressDetectionWidget::DetectBaseAddress);
0 commit comments