@@ -167,14 +167,23 @@ void BaseAddressDetectionWidget::HideResultsWidgets(bool hide)
167
167
}
168
168
169
169
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
+
170
180
void BaseAddressDetectionWidget::HandleResults (const BaseAddressDetectionQtResults& results)
171
181
{
172
182
if (!results.Status .empty ())
173
183
m_status->setText (QString::fromStdString (results.Status ));
174
184
175
185
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 ));
178
187
179
188
if (results.Scores .empty ())
180
189
{
@@ -188,35 +197,46 @@ void BaseAddressDetectionWidget::HandleResults(const BaseAddressDetectionQtResul
188
197
HideResultsWidgets (false );
189
198
if (results.Status .empty () && !m_worker->IsAborted ())
190
199
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 ));
192
201
m_confidence->setText (QString (" %1 (Score: %2)" ).arg (
193
202
QString::fromStdString (BaseAddressDetectionConfidenceToString (results.Confidence )),
194
203
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 ));
196
205
}
197
206
198
207
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 ());
204
209
size_t row = 0 ;
205
210
for (auto rit = results.Scores .rbegin (); rit != results.Scores .rend (); rit++)
206
211
{
207
212
auto [score, baseaddr] = *rit;
213
+ size_t strHits = 0 ;
214
+ size_t funcHits = 0 ;
215
+ size_t dataHits = 0 ;
208
216
for (const auto & reason : results.Reasons .at (baseaddr))
209
217
{
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
+ }
219
232
}
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++;
220
240
}
221
241
222
242
m_abortButton->setHidden (true );
@@ -343,7 +363,8 @@ void BaseAddressDetectionWidget::CreateAdvancedSettingsGroup()
343
363
}
344
364
345
365
346
- BaseAddressDetectionWidget::BaseAddressDetectionWidget (QWidget* parent, BinaryNinja::Ref<BinaryNinja::BinaryView> bv)
366
+ BaseAddressDetectionWidget::BaseAddressDetectionWidget (QWidget* parent,
367
+ BinaryNinja::Ref<BinaryNinja::BinaryView> bv) : QWidget(parent)
347
368
{
348
369
m_view = bv->GetParentView () ? bv->GetParentView () : bv;
349
370
m_layout = new QGridLayout ();
@@ -401,18 +422,19 @@ BaseAddressDetectionWidget::BaseAddressDetectionWidget(QWidget* parent, BinaryNi
401
422
m_layout->addWidget (m_confidence, row++, column + 3 , Qt::AlignLeft);
402
423
403
424
m_resultsTableWidget = new QTableWidget (this );
404
- m_resultsTableWidget->setColumnCount (4 );
425
+ m_resultsTableWidget->setColumnCount (5 );
405
426
QStringList header;
406
- header << " Base Address" << " Pointer " << " POI Offset " << " POI Type " ;
427
+ header << " Base Address" << " Score " << " String Hits " << " Function Hits " << " Data Hits " ;
407
428
m_resultsTableWidget->setHorizontalHeaderLabels (header);
408
429
m_resultsTableWidget->horizontalHeader ()->setDefaultAlignment (Qt::AlignLeft);
409
430
m_resultsTableWidget->horizontalHeader ()->setStretchLastSection (true );
410
431
m_resultsTableWidget->verticalHeader ()->setVisible (false );
411
432
m_resultsTableWidget->setEditTriggers (QAbstractItemView::NoEditTriggers);
412
- m_resultsTableWidget->setSelectionBehavior (QAbstractItemView::SelectItems );
433
+ m_resultsTableWidget->setSelectionBehavior (QAbstractItemView::SelectRows );
413
434
m_resultsTableWidget->setSelectionMode (QAbstractItemView::SingleSelection);
414
435
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);
416
438
417
439
m_reloadBase = new QLineEdit (" 0x0" );
418
440
m_layout->addWidget (m_reloadBase, row, column, Qt::AlignLeft);
0 commit comments