From 9e346275c5a532459500e88a34b0bdec0076b264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20Castej=C3=B3n?= Date: Mon, 10 Aug 2020 18:12:38 +0200 Subject: [PATCH] Add new Analysis section to the Preferences widget (#2332) --- docs/source/images/analysis_dialog.png | Bin 0 -> 66061 bytes docs/source/user-docs/preferences.rst | 1 + .../source/user-docs/preferences/analysis.rst | 74 ++++++++ src/Cutter.pro | 9 +- src/common/AnalTask.cpp | 14 +- src/common/AnalTask.h | 2 +- src/core/MainWindow.cpp | 22 ++- src/core/MainWindow.h | 4 +- src/core/MainWindow.ui | 3 +- src/dialogs/preferences/AnalOptionsWidget.cpp | 52 ++++++ src/dialogs/preferences/AnalOptionsWidget.h | 46 +++++ src/dialogs/preferences/AnalOptionsWidget.ui | 174 ++++++++++++++++++ src/dialogs/preferences/PreferencesDialog.cpp | 7 + src/img/icons/light/cog_light.svg | 4 + src/resources.qrc | 1 + 15 files changed, 402 insertions(+), 11 deletions(-) create mode 100644 docs/source/images/analysis_dialog.png create mode 100644 docs/source/user-docs/preferences/analysis.rst create mode 100644 src/dialogs/preferences/AnalOptionsWidget.cpp create mode 100644 src/dialogs/preferences/AnalOptionsWidget.h create mode 100644 src/dialogs/preferences/AnalOptionsWidget.ui create mode 100644 src/img/icons/light/cog_light.svg diff --git a/docs/source/images/analysis_dialog.png b/docs/source/images/analysis_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..51c990a8ea1180386fc366975fb1c5ae4a029c86 GIT binary patch literal 66061 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 Preferences -> Analysis`` + +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. + +**Configuration variable:** ``anal.autoname`` + + +Search for new functions following already defined functions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Cutter will check if there is a candidate for a new function following an already defined one, as the compiler usually +state them together. This option is taking the advantages of both Recursive Analysis and Linear Sweep into some kind of a hybrid mode. For each discovered function, the analysis will try to check for a function-prologue, usually following a gap of null bytes or ``cc`` bytes. This will help with discovering functions which are not referenced in the program. As such, it will make the analysis slower and prone to false-positives. + +**Configuration variable:** ``anal.hasnext`` + + +Create references for unconditional jumps +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +When encountering unconditional jumps during the analysis, Cutter will add a code-reference even if it is not guaranteed +that the jump will take place. + +**Configuration variable:** ``anal.jmp.ref`` + + +Analyze jump tables in switch statements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +When encountering switch statements during analysis, continue and analyze the target blocks of the jump tables. + +**Configuration variable:** ``anal.jmp.tbl`` + + +Analyze ``push`` + ``ret`` as ``jmp`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +When performing analysis of a function, treat the sequence of ``push`` followed by ``ret`` instruction as a ``jmp``. +This can help Cutter to continue the analysis to target of the ``jmp``. + +**Configuration variable:** ``anal.pushret`` + + +Show verbose information when performing analysis +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +When enabled, Cutter will print warnings it encountered while preforming analysis. These warnings can help the user +understand if anything went wrong in the analysis. This function is not only helpful when trying to perform a full +analysis of the program, but also when trying to analyze and define new functions. + +**Configuration variable:** ``anal.verbose`` + + +Verbose output from type analysis +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Print warnings encountered while preforming type analysis. These warnings can help the user understand if anything went +wrong in the analysis. + +**Configuration variable:** ``anal.types.verbose`` diff --git a/src/Cutter.pro b/src/Cutter.pro index 676bfbbf..114a7c61 100644 --- a/src/Cutter.pro +++ b/src/Cutter.pro @@ -435,7 +435,8 @@ SOURCES += \ widgets/SimpleTextGraphView.cpp \ widgets/R2GraphWidget.cpp \ widgets/CallGraph.cpp \ - widgets/AddressableDockWidget.cpp + widgets/AddressableDockWidget.cpp \ + dialogs/preferences/AnalOptionsWidget.cpp GRAPHVIZ_SOURCES = \ widgets/GraphvizLayout.cpp @@ -592,7 +593,8 @@ HEADERS += \ widgets/SimpleTextGraphView.h \ widgets/R2GraphWidget.h \ widgets/CallGraph.h \ - widgets/AddressableDockWidget.h + widgets/AddressableDockWidget.h \ + dialogs/preferences/AnalOptionsWidget.h GRAPHVIZ_HEADERS = widgets/GraphvizLayout.h @@ -660,7 +662,8 @@ FORMS += \ dialogs/preferences/ColorThemeEditDialog.ui \ widgets/ListDockWidget.ui \ dialogs/LayoutManager.ui \ - widgets/R2GraphWidget.ui + widgets/R2GraphWidget.ui \ + dialogs/preferences/AnalOptionsWidget.ui RESOURCES += \ resources.qrc \ diff --git a/src/common/AnalTask.cpp b/src/common/AnalTask.cpp index 137e3a99..5cbf7e53 100644 --- a/src/common/AnalTask.cpp +++ b/src/common/AnalTask.cpp @@ -21,11 +21,17 @@ void AnalTask::interrupt() r_cons_singleton()->context->breaked = true; } +QString AnalTask::getTitle() { + // If no file is loaded we consider it's Initial Analysis + QJsonArray openedFiles = Core()->getOpenedFiles(); + if (!openedFiles.size()) { + return tr("Initial Analysis"); + } + return tr("Analyzing Program"); +} + void AnalTask::runTask() { - log(tr("Loading the file...")); - openFailed = false; - int perms = R_PERM_RX; if (options.writeEnabled) { perms |= R_PERM_W; @@ -39,6 +45,8 @@ void AnalTask::runTask() // Do not reload the file if already loaded QJsonArray openedFiles = Core()->getOpenedFiles(); if (!openedFiles.size() && options.filename.length()) { + log(tr("Loading the file...")); + openFailed = false; bool fileLoaded = Core()->loadFile(options.filename, options.binLoadAddr, options.mapAddr, diff --git a/src/common/AnalTask.h b/src/common/AnalTask.h index bbcbcf03..eb9044a9 100644 --- a/src/common/AnalTask.h +++ b/src/common/AnalTask.h @@ -17,7 +17,7 @@ public: explicit AnalTask(); ~AnalTask(); - QString getTitle() override { return tr("Initial Analysis"); } + QString getTitle() override; void setOptions(const InitialOptions &options) { this->options = options; } diff --git a/src/core/MainWindow.cpp b/src/core/MainWindow.cpp index 4c77a12b..944b69a4 100644 --- a/src/core/MainWindow.cpp +++ b/src/core/MainWindow.cpp @@ -2,6 +2,7 @@ #include "ui_MainWindow.h" // Common Headers +#include "common/AnalTask.h" #include "common/BugReporting.h" #include "common/Highlighter.h" #include "common/Helpers.h" @@ -243,6 +244,10 @@ void MainWindow::initUI() enableDebugWidgetsMenu(false); readSettings(); + + // Display tooltip for the Analyze Program action + ui->actionAnalyze->setToolTip("Analyze the program using radare2's \"aaa\" command"); + ui->menuFile->setToolTipsVisible(true); } void MainWindow::initToolBar() @@ -1579,9 +1584,24 @@ void MainWindow::on_actionRefresh_Panels_triggered() this->refreshAll(); } +/** + * @brief A signal that creates an AsyncTask to re-analyze the current file + */ void MainWindow::on_actionAnalyze_triggered() { - // TODO: implement this, but do NOT open InitialOptionsDialog!! + auto *analTask = new AnalTask(); + InitialOptions options; + options.analCmd = { {"aaa", "Auto analysis"} }; + analTask->setOptions(options); + AsyncTask::Ptr analTaskPtr(analTask); + + auto *taskDialog = new AsyncTaskDialog(analTaskPtr); + taskDialog->setInterruptOnClose(true); + taskDialog->setAttribute(Qt::WA_DeleteOnClose); + taskDialog->show(); + connect(analTask, &AnalTask::finished, this, &MainWindow::refreshAll); + + Core()->getAsyncTaskManager()->start(analTaskPtr); } void MainWindow::on_actionImportPDB_triggered() diff --git a/src/core/MainWindow.h b/src/core/MainWindow.h index 7a21390a..3bfd783e 100644 --- a/src/core/MainWindow.h +++ b/src/core/MainWindow.h @@ -150,6 +150,8 @@ public slots: void on_actionTabs_triggered(); + void on_actionAnalyze_triggered(); + void lockUnlock_Docks(bool what); void on_actionRun_Script_triggered(); @@ -192,8 +194,6 @@ private slots: void on_actionPreferences_triggered(); - void on_actionAnalyze_triggered(); - void on_actionImportPDB_triggered(); void on_actionExport_as_code_triggered(); diff --git a/src/core/MainWindow.ui b/src/core/MainWindow.ui index b0008510..6ea2249e 100644 --- a/src/core/MainWindow.ui +++ b/src/core/MainWindow.ui @@ -75,6 +75,7 @@ + @@ -741,7 +742,7 @@ - Analyze + Analyze Program diff --git a/src/dialogs/preferences/AnalOptionsWidget.cpp b/src/dialogs/preferences/AnalOptionsWidget.cpp new file mode 100644 index 00000000..2ea6df5a --- /dev/null +++ b/src/dialogs/preferences/AnalOptionsWidget.cpp @@ -0,0 +1,52 @@ +#include "AnalOptionsWidget.h" +#include "ui_AnalOptionsWidget.h" + +#include "PreferencesDialog.h" + +#include "common/Helpers.h" +#include "common/Configuration.h" + +#include "core/MainWindow.h" + +AnalOptionsWidget::AnalOptionsWidget(PreferencesDialog *dialog) + : QDialog(dialog), + ui(new Ui::AnalOptionsWidget) +{ + ui->setupUi(this); + + checkboxes = { + { ui->autonameCheckbox, "anal.autoname" }, + { ui->hasnextCheckbox, "anal.hasnext" }, + { ui->jmpRefCheckbox, "anal.jmp.ref" }, + { ui->jmpTblCheckbox, "anal.jmp.tbl" }, + { ui->pushRetCheckBox, "anal.pushret" }, + { ui->typesVerboseCheckBox, "anal.types.verbose" }, + { ui->verboseCheckBox, "anal.verbose" } + }; + + // Connect each checkbox from "checkboxes" to the generic signal "checkboxEnabler" + for (ConfigCheckbox &confCheckbox : checkboxes) { + QString val = confCheckbox.config; + QCheckBox &cb = *confCheckbox.checkBox; + connect(confCheckbox.checkBox, &QCheckBox::stateChanged, this, [this, val, &cb]() { checkboxEnabler(&cb, val); }); + } + + ui->analyzePushButton->setToolTip("Analyze the program using radare2's \"aaa\" command"); + auto *mainWindow = new MainWindow(this); + connect(ui->analyzePushButton, &QPushButton::clicked, mainWindow, &MainWindow::on_actionAnalyze_triggered); + updateAnalOptionsFromVars(); +} + +AnalOptionsWidget::~AnalOptionsWidget() {} + +void AnalOptionsWidget::checkboxEnabler(QCheckBox *checkBox, const QString &config) +{ + Config()->setConfig(config, checkBox->isChecked()); +} + +void AnalOptionsWidget::updateAnalOptionsFromVars() +{ + for (ConfigCheckbox &confCheckbox : checkboxes) { + qhelpers::setCheckedWithoutSignals(confCheckbox.checkBox, Core()->getConfigb(confCheckbox.config)); + } +} \ No newline at end of file diff --git a/src/dialogs/preferences/AnalOptionsWidget.h b/src/dialogs/preferences/AnalOptionsWidget.h new file mode 100644 index 00000000..a21f0a75 --- /dev/null +++ b/src/dialogs/preferences/AnalOptionsWidget.h @@ -0,0 +1,46 @@ +#ifndef ANALOPTIONSWIDGET_H +#define ANALOPTIONSWIDGET_H + +#include +#include + +#include "core/Cutter.h" + +class PreferencesDialog; + +namespace Ui { +class AnalOptionsWidget; +} + +class AnalOptionsWidget : public QDialog +{ + Q_OBJECT + +public: + explicit AnalOptionsWidget(PreferencesDialog *dialog); + ~AnalOptionsWidget(); + +private: + std::unique_ptr ui; + struct ConfigCheckbox { + QCheckBox *checkBox; + QString config; + }; + QList checkboxes; + +private slots: + /** + * @brief A slot to display the options in the dialog according to the current anal.* configuration + */ + void updateAnalOptionsFromVars(); + + /** + * @brief A generic slot to handle the simple cases where a checkbox is toggled + * while it's only responsible for a single independent boolean configuration eval. + * @param checkBox - The checkbox which is responsible for the signal + * @param config - the configuration string to be toggled + */ + static void checkboxEnabler(QCheckBox *checkbox, const QString &config); +}; + +#endif // ANALOPTIONSWIDGET_H diff --git a/src/dialogs/preferences/AnalOptionsWidget.ui b/src/dialogs/preferences/AnalOptionsWidget.ui new file mode 100644 index 00000000..501f6ec6 --- /dev/null +++ b/src/dialogs/preferences/AnalOptionsWidget.ui @@ -0,0 +1,174 @@ + + + AnalOptionsWidget + + + + 0 + 0 + 633 + 689 + + + + + 0 + 0 + + + + Analysis + + + + + + + + + 0 + 0 + + + + true + + + + + 0 + 0 + 611 + 610 + + + + + + 10 + 190 + 601 + 23 + + + + Show verbose information when performing analysis (anal.verbose) + + + + + + 10 + 130 + 601 + 23 + + + + Analyze push+ret as jmp (anal.pushret) + + + + + + 10 + 160 + 601 + 23 + + + + Verbose output from type analysis (anal.types.verbose) + + + + + + 10 + 10 + 601 + 23 + + + + Speculatively set a name for the functions (anal.autoname) + + + + + + 10 + 40 + 601 + 23 + + + + Search for new functions following already defined functions (anal.hasnext) + + + + + + 10 + 70 + 601 + 23 + + + + Create references for unconditional jumps (anal.jmp.ref) + + + + + + 10 + 100 + 601 + 23 + + + + Analyze jump tables in switch statements (anal.jmp.tbl) + + + + + + + + + + + + 0 + 0 + + + + Analyze program + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + diff --git a/src/dialogs/preferences/PreferencesDialog.cpp b/src/dialogs/preferences/PreferencesDialog.cpp index 7b9f5372..3a09036b 100644 --- a/src/dialogs/preferences/PreferencesDialog.cpp +++ b/src/dialogs/preferences/PreferencesDialog.cpp @@ -7,6 +7,7 @@ #include "DebugOptionsWidget.h" #include "PluginsOptionsWidget.h" #include "InitializationFileEditor.h" +#include "AnalOptionsWidget.h" #include "PreferenceCategory.h" @@ -57,6 +58,11 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) tr("Initialization Script"), new InitializationFileEditor(this), QIcon(":/img/icons/initialization.svg") + }, + { + tr("Analysis"), + new AnalOptionsWidget(this), + QIcon(":/img/icons/cog_light.svg") } }; @@ -119,6 +125,7 @@ void PreferencesDialog::chooseThemeIcons() { QStringLiteral("Appearance"), QStringLiteral("polar.svg") }, { QStringLiteral("Plugins"), QStringLiteral("plugins.svg") }, { QStringLiteral("Initialization Script"), QStringLiteral("initialization.svg") }, + { QStringLiteral("Analysis"), QStringLiteral("cog_light.svg") }, }; QList> supportedIconsNames; diff --git a/src/img/icons/light/cog_light.svg b/src/img/icons/light/cog_light.svg new file mode 100644 index 00000000..41e8c856 --- /dev/null +++ b/src/img/icons/light/cog_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/resources.qrc b/src/resources.qrc index a072e2ff..3dcb74f8 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -63,6 +63,7 @@ img/icons/bug.svg img/icons/light/bug.svg img/icons/cog_light.svg + img/icons/light/cog_light.svg img/icons/cog_white.svg img/icons/new_light.svg img/icons/run_light.svg