Add more options to the Analysis widget (#2405)

This commit is contained in:
Oriol Castejón 2020-08-30 15:17:14 +02:00 committed by GitHub
parent d7ef6e9e91
commit 2c84e07bfa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 227 additions and 9 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -19,6 +19,19 @@ command, taking into account the configured values of the analysis options.
**Steps to open:** ``Edit -> Preferences -> Analysis`` **Steps to open:** ``Edit -> Preferences -> Analysis``
Search boundaries for analysis
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Select the boundaries in which the analyis will be performed. The different options are:
- All executable maps (``io.maps.x``)
- All maps (``io.maps``)
- Current map (``io.map``)
- Raw (``raw``)
- Current mapped section (``bin.section``)
- All mapped sections (``bin.sections``)
**Configuration variable:** ``anal.in``
Speculatively set a name for the functions Speculatively set a name for the functions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Try to name functions without symbols by using artifacts in the functions such as API calls and strings. Try to name functions without symbols by using artifacts in the functions such as API calls and strings.
@ -72,3 +85,15 @@ Print warnings encountered while preforming type analysis. These warnings can he
wrong in the analysis. wrong in the analysis.
**Configuration variable:** ``anal.types.verbose`` **Configuration variable:** ``anal.types.verbose``
Pointer depth
~~~~~~~~~~~~~
The maximum number of nested pointers to follow in analysis.
**Configuration variable:** ``anal.ptrdepth``
Functions prelude
~~~~~~~
Hex value that represents certain opcodes that will be used to identify functions.
**Configuration variable:** ``anal.prelude``

View File

@ -8,6 +8,15 @@
#include "core/MainWindow.h" #include "core/MainWindow.h"
static const QHash<QString, QString> analBoundaries {
{"io.maps.x", "All executable maps"},
{"io.maps", "All maps"},
{"io.map", "Current map"},
{"raw", "Raw"},
{"bin.section", "Current mapped section"},
{"bin.sections", "All mapped sections"},
};
AnalOptionsWidget::AnalOptionsWidget(PreferencesDialog *dialog) AnalOptionsWidget::AnalOptionsWidget(PreferencesDialog *dialog)
: QDialog(dialog), : QDialog(dialog),
ui(new Ui::AnalOptionsWidget) ui(new Ui::AnalOptionsWidget)
@ -24,6 +33,9 @@ AnalOptionsWidget::AnalOptionsWidget(PreferencesDialog *dialog)
{ ui->verboseCheckBox, "anal.verbose" } { ui->verboseCheckBox, "anal.verbose" }
}; };
// Create list of options for the anal.in selector
createAnalInOptionsList();
// Connect each checkbox from "checkboxes" to the generic signal "checkboxEnabler" // Connect each checkbox from "checkboxes" to the generic signal "checkboxEnabler"
for (ConfigCheckbox &confCheckbox : checkboxes) { for (ConfigCheckbox &confCheckbox : checkboxes) {
QString val = confCheckbox.config; QString val = confCheckbox.config;
@ -33,7 +45,13 @@ AnalOptionsWidget::AnalOptionsWidget(PreferencesDialog *dialog)
ui->analyzePushButton->setToolTip("Analyze the program using radare2's \"aaa\" command"); ui->analyzePushButton->setToolTip("Analyze the program using radare2's \"aaa\" command");
auto *mainWindow = new MainWindow(this); auto *mainWindow = new MainWindow(this);
connect(ui->analyzePushButton, &QPushButton::clicked, mainWindow, &MainWindow::on_actionAnalyze_triggered); connect(ui->analyzePushButton, &QPushButton::clicked, mainWindow,
&MainWindow::on_actionAnalyze_triggered);
connect<void (QComboBox::*)(int)>(ui->analInComboBox, &QComboBox::currentIndexChanged, this,
&AnalOptionsWidget::updateAnalIn);
connect<void (QSpinBox::*)(int)>(ui->ptrDepthSpinBox, &QSpinBox::valueChanged, this,
&AnalOptionsWidget::updateAnalPtrDepth);
connect(ui->preludeLineEdit, &QLineEdit::textChanged, this, &AnalOptionsWidget::updateAnalPrelude);
updateAnalOptionsFromVars(); updateAnalOptionsFromVars();
} }
@ -49,4 +67,37 @@ void AnalOptionsWidget::updateAnalOptionsFromVars()
for (ConfigCheckbox &confCheckbox : checkboxes) { for (ConfigCheckbox &confCheckbox : checkboxes) {
qhelpers::setCheckedWithoutSignals(confCheckbox.checkBox, Core()->getConfigb(confCheckbox.config)); qhelpers::setCheckedWithoutSignals(confCheckbox.checkBox, Core()->getConfigb(confCheckbox.config));
} }
// Update the rest of analysis options that are not checkboxes
ui->analInComboBox->setCurrentIndex(ui->analInComboBox->findData(Core()->getConfig("anal.in")));
ui->ptrDepthSpinBox->setValue(Core()->getConfigi("anal.ptrdepth"));
ui->preludeLineEdit->setText(Core()->getConfig("anal.prelude"));
}
void AnalOptionsWidget::updateAnalIn(int index)
{
Config()->setConfig("anal.in", ui->analInComboBox->itemData(index).toString());
}
void AnalOptionsWidget::updateAnalPtrDepth(int value)
{
Config()->setConfig("anal.ptrdepth", value);
}
void AnalOptionsWidget::updateAnalPrelude(const QString &prelude)
{
Config()->setConfig("anal.prelude", prelude);
}
void AnalOptionsWidget::createAnalInOptionsList()
{
QHash<QString, QString>::const_iterator mapIter;
mapIter = analBoundaries.cbegin();
ui->analInComboBox->blockSignals(true);
ui->analInComboBox->clear();
for (; mapIter != analBoundaries.cend(); ++mapIter) {
ui->analInComboBox->addItem(mapIter.value(), mapIter.key());
}
ui->analInComboBox->blockSignals(false);
} }

View File

@ -28,6 +28,11 @@ private:
}; };
QList<ConfigCheckbox> checkboxes; QList<ConfigCheckbox> checkboxes;
/**
* @brief This function creates the list with the different options shown in the selector for anal.in
*/
void createAnalInOptionsList();
private slots: private slots:
/** /**
* @brief A slot to display the options in the dialog according to the current anal.* configuration * @brief A slot to display the options in the dialog according to the current anal.* configuration
@ -41,6 +46,24 @@ private slots:
* @param config - the configuration string to be toggled * @param config - the configuration string to be toggled
*/ */
static void checkboxEnabler(QCheckBox *checkbox, const QString &config); static void checkboxEnabler(QCheckBox *checkbox, const QString &config);
/**
* @brief A slot to update the value of anal.in when a different option is selected
* @param index - The index of the selected option for anal.in
*/
void updateAnalIn(int index);
/**
* @brief A slot to update the value of anal.ptrdepth when a new value is selected
* @param value - The new value for anal.ptrdepth
*/
static void updateAnalPtrDepth(int value);
/**
* @brief slot to update the value of anal.prelude when a new value is introduced in the corresponding textbox
* @param prelude - The new value for anal.prelude
*/
static void updateAnalPrelude(const QString &prelude);
}; };
#endif // ANALOPTIONSWIDGET_H #endif // ANALOPTIONSWIDGET_H

View File

@ -46,7 +46,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>190</y> <y>240</y>
<width>601</width> <width>601</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -59,7 +59,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>130</y> <y>180</y>
<width>601</width> <width>601</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -72,7 +72,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>160</y> <y>210</y>
<width>601</width> <width>601</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -85,7 +85,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>10</y> <y>60</y>
<width>601</width> <width>601</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -98,7 +98,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>40</y> <y>90</y>
<width>601</width> <width>601</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -111,7 +111,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>70</y> <y>120</y>
<width>601</width> <width>601</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -124,7 +124,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>100</y> <y>150</y>
<width>601</width> <width>601</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -133,6 +133,125 @@
<string>Analyze jump tables in switch statements (anal.jmp.tbl)</string> <string>Analyze jump tables in switch statements (anal.jmp.tbl)</string>
</property> </property>
</widget> </widget>
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>581</width>
<height>27</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="analInLabel">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Search boundaries for analysis (anal.in): </string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="analInComboBox"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="verticalLayoutWidget_2">
<property name="geometry">
<rect>
<x>10</x>
<y>270</y>
<width>581</width>
<height>28</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="ptrDepthLabel">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Pointer depth (anal.ptrdepth):</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="ptrDepthSpinBox">
<property name="minimum">
<number>0</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="verticalLayoutWidget_3">
<property name="geometry">
<rect>
<x>10</x>
<y>300</y>
<width>581</width>
<height>28</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout_3">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="preludeLabel">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Functions Prelude (anal.prelude):</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="preludeLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="placeholderText">
<string notr="true">e.g.: 0x554889e5</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</widget> </widget>
</item> </item>