Skip to content

Commit f3e890a

Browse files
committed
Using ParseExpression to parse numeric inputs
1 parent 37f3949 commit f3e890a

File tree

1 file changed

+44
-31
lines changed

1 file changed

+44
-31
lines changed

examples/triage/baseaddress.cpp

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -49,58 +49,64 @@ string BaseAddressDetectionConfidenceToString(BNBaseAddressDetectionConfidence l
4949
}
5050

5151

52-
uint32_t HexOrDecimalQStringToUint32(const QString& str)
53-
{
54-
if (str.startsWith("0x"))
55-
return str.mid(2).toUInt(nullptr, 16);
56-
return str.toUInt();
57-
}
58-
59-
60-
uint64_t HexOrDecimalQStringToUint64(const QString& str)
61-
{
62-
if (str.startsWith("0x"))
63-
return str.mid(2).toULongLong(nullptr, 16);
64-
return str.toULongLong();
65-
}
66-
67-
6852
void BaseAddressDetectionThread::run()
6953
{
7054
BaseAddressDetectionQtResults results;
71-
uint32_t alignment = HexOrDecimalQStringToUint32(m_inputs->AlignmentLineEdit->text());
72-
if (alignment == 0)
55+
uint64_t value;
56+
string errorStr;
57+
58+
if (!BinaryNinja::BinaryView::ParseExpression(
59+
m_view, m_inputs->AlignmentLineEdit->text().toStdString(), value, 0, errorStr))
7360
{
74-
results.Status = "Invalid alignment value";
61+
results.Status = "Invalid alignment value (" + errorStr + ")";
7562
emit ResultReady(results);
7663
return;
7764
}
65+
uint32_t alignment = value;
7866

79-
uint32_t minStrlen = HexOrDecimalQStringToUint32(m_inputs->StrlenLineEdit->text());
80-
if (minStrlen == 0)
67+
if (!BinaryNinja::BinaryView::ParseExpression(
68+
m_view, m_inputs->StrlenLineEdit->text().toStdString(), value, 0, errorStr))
8169
{
82-
results.Status = "Invalid minimum string length";
70+
results.Status = "Invalid minimum string length (" + errorStr + ")";
8371
emit ResultReady(results);
8472
return;
8573
}
74+
uint32_t minStrlen = value;
8675

87-
uint64_t upperBoundary = HexOrDecimalQStringToUint64(m_inputs->UpperBoundary->text());
88-
if (upperBoundary == 0)
76+
uint64_t upperBoundary;
77+
if (!BinaryNinja::BinaryView::ParseExpression(
78+
m_view, m_inputs->UpperBoundary->text().toStdString(), upperBoundary, 0, errorStr))
8979
{
90-
results.Status = "Invalid upper boundary address";
80+
results.Status = "Invalid upper boundary address (" + errorStr + ")";
81+
emit ResultReady(results);
82+
return;
83+
}
84+
85+
uint64_t lowerBoundary;
86+
if (!BinaryNinja::BinaryView::ParseExpression(
87+
m_view, m_inputs->LowerBoundary->text().toStdString(), lowerBoundary, 0, errorStr))
88+
{
89+
results.Status = "Invalid lower boundary address (" + errorStr + ")";
9190
emit ResultReady(results);
9291
return;
9392
}
9493

95-
uint64_t lowerBoundary = HexOrDecimalQStringToUint64(m_inputs->LowerBoundary->text());
9694
if (lowerBoundary >= upperBoundary)
9795
{
9896
results.Status = "Upper boundary address is less than lower";
9997
emit ResultReady(results);
10098
return;
10199
}
102100

103-
uint32_t maxPointersPerCluster = HexOrDecimalQStringToUint32(m_inputs->MaxPointersPerCluster->text());
101+
if (!BinaryNinja::BinaryView::ParseExpression(
102+
m_view, m_inputs->MaxPointersPerCluster->text().toStdString(), value, 0, errorStr))
103+
{
104+
results.Status = "Invalid max pointers (" + errorStr + ")";
105+
emit ResultReady(results);
106+
return;
107+
}
108+
109+
uint32_t maxPointersPerCluster = value;
104110
if (maxPointersPerCluster < 2)
105111
{
106112
results.Status = "Invalid max pointers (must be >= 2)";
@@ -254,7 +260,14 @@ void BaseAddressDetectionWidget::RebaseWithFullAnalysis()
254260
if (!fileMetadata)
255261
return;
256262

257-
uint64_t address = HexOrDecimalQStringToUint64(m_reloadBase->text());
263+
uint64_t address;
264+
string errorStr;
265+
if (!BinaryNinja::BinaryView::ParseExpression(m_view, m_reloadBase->text().toStdString(), address, 0, errorStr))
266+
{
267+
m_status->setText(QString("Invalid rebase address (%1)").arg(QString::fromStdString(errorStr)));
268+
return;
269+
}
270+
258271
if (!fileMetadata->Rebase(mappedView, address))
259272
return;
260273

@@ -291,11 +304,11 @@ void BaseAddressDetectionWidget::CreateAdvancedSettingsGroup()
291304
auto grid = new QGridLayout();
292305

293306
grid->addWidget(new QLabel("Min. String Length:"), row, column, Qt::AlignLeft);
294-
m_inputs.StrlenLineEdit = new QLineEdit("10");
307+
m_inputs.StrlenLineEdit = new QLineEdit("0n10");
295308
grid->addWidget(m_inputs.StrlenLineEdit, row, column + 1, Qt::AlignLeft);
296309

297310
grid->addWidget(new QLabel("Alignment:"), row, column + 2, Qt::AlignLeft);
298-
m_inputs.AlignmentLineEdit = new QLineEdit("1024");
311+
m_inputs.AlignmentLineEdit = new QLineEdit("0n1024");
299312
grid->addWidget(m_inputs.AlignmentLineEdit, row++, column + 3, Qt::AlignLeft);
300313

301314
grid->addWidget(new QLabel("Lower Boundary:"), row, column, Qt::AlignLeft);
@@ -313,7 +326,7 @@ void BaseAddressDetectionWidget::CreateAdvancedSettingsGroup()
313326
grid->addWidget(m_inputs.POIBox, row, column + 1, Qt::AlignLeft);
314327

315328
grid->addWidget(new QLabel("Max Pointers:"), row, column + 2, Qt::AlignLeft);
316-
m_inputs.MaxPointersPerCluster = new QLineEdit("128");
329+
m_inputs.MaxPointersPerCluster = new QLineEdit("0n128");
317330
grid->addWidget(m_inputs.MaxPointersPerCluster, row++, column + 3, Qt::AlignLeft);
318331

319332
m_advancedSettingsGroup = new ExpandableGroup(grid);

0 commit comments

Comments
 (0)