mirror of
https://github.com/rizinorg/cutter.git
synced 2025-01-31 16:47:26 +00:00
Refactor Analysis Options
This commit is contained in:
parent
f09d32bd3d
commit
4ce04c4f95
@ -21,13 +21,6 @@ void AnalTask::interrupt()
|
|||||||
r_cons_singleton()->breaked = true;
|
r_cons_singleton()->breaked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnalTask::interruptAndWait()
|
|
||||||
{
|
|
||||||
do {
|
|
||||||
interrupt();
|
|
||||||
} while(!wait(10));
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalTask::runTask()
|
void AnalTask::runTask()
|
||||||
{
|
{
|
||||||
log(tr("Loading Binary...\n"));
|
log(tr("Loading Binary...\n"));
|
||||||
@ -81,10 +74,17 @@ void AnalTask::runTask()
|
|||||||
// Use prj.simple as default as long as regular projects are broken
|
// Use prj.simple as default as long as regular projects are broken
|
||||||
Core()->setConfig("prj.simple", true);
|
Core()->setConfig("prj.simple", true);
|
||||||
|
|
||||||
// Start analysis
|
if (!options.analCmd.empty()) {
|
||||||
log(tr("Analysis in progress...\n"));
|
log(tr("Analyzing...\n"));
|
||||||
|
for (QString cmd : options.analCmd) {
|
||||||
Core()->analyze(options.analLevel, options.analAdvanced);
|
if (isInterrupted()) {
|
||||||
|
return;
|
||||||
log(tr("Analysis complete!"));
|
}
|
||||||
|
log(" " + tr("Running") + " " + cmd + "\n");
|
||||||
|
Core()->cmd(cmd);
|
||||||
|
}
|
||||||
|
log(tr("Analysis complete!\n"));
|
||||||
|
} else {
|
||||||
|
log(tr("Skipping Analysis.\n"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,7 @@ struct InitialOptions
|
|||||||
|
|
||||||
int bbsize = 0;
|
int bbsize = 0;
|
||||||
|
|
||||||
int analLevel = 1;
|
QList<QString> analCmd;
|
||||||
QList<QString> analAdvanced;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class AnalTask : public AsyncTask
|
class AnalTask : public AsyncTask
|
||||||
@ -53,7 +52,6 @@ public:
|
|||||||
void setOptions(const InitialOptions &options) { this->options = options; }
|
void setOptions(const InitialOptions &options) { this->options = options; }
|
||||||
|
|
||||||
void interrupt() override;
|
void interrupt() override;
|
||||||
void interruptAndWait();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void runTask() override;
|
void runTask() override;
|
||||||
|
@ -145,6 +145,53 @@ QString OptionsDialog::getSelectedOS()
|
|||||||
return os.isValid() ? os.toString() : nullptr;
|
return os.isValid() ? os.toString() : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<QString> OptionsDialog::getSelectedAdvancedAnalCmds()
|
||||||
|
{
|
||||||
|
QList<QString> advanced = QList<QString>();
|
||||||
|
if (ui->analSlider->value() == 3) {
|
||||||
|
if (ui->aa_symbols->isChecked()) {
|
||||||
|
advanced << "aa";
|
||||||
|
}
|
||||||
|
if (ui->aar_references->isChecked()) {
|
||||||
|
advanced << "aar";
|
||||||
|
}
|
||||||
|
if (ui->aac_calls->isChecked()) {
|
||||||
|
advanced << "aac";
|
||||||
|
}
|
||||||
|
if (ui->aab_basicblocks->isChecked()) {
|
||||||
|
advanced << "aab";
|
||||||
|
}
|
||||||
|
if (ui->aan_rename->isChecked()) {
|
||||||
|
advanced << "aan";
|
||||||
|
}
|
||||||
|
if (ui->aae_emulate->isChecked()) {
|
||||||
|
advanced << "aae";
|
||||||
|
}
|
||||||
|
if (ui->aat_consecutive->isChecked()) {
|
||||||
|
advanced << "aat";
|
||||||
|
}
|
||||||
|
if (ui->afta_typeargument->isChecked()) {
|
||||||
|
advanced << "afta";
|
||||||
|
}
|
||||||
|
if (ui->aaT_aftertrap->isChecked()) {
|
||||||
|
advanced << "aaT";
|
||||||
|
}
|
||||||
|
if (ui->aap_preludes->isChecked()) {
|
||||||
|
advanced << "aap";
|
||||||
|
}
|
||||||
|
if (ui->jmptbl->isChecked()) {
|
||||||
|
advanced << "e! anal.jmptbl";
|
||||||
|
}
|
||||||
|
if (ui->pushret->isChecked()) {
|
||||||
|
advanced << "e! anal.pushret";
|
||||||
|
}
|
||||||
|
if (ui->hasnext->isChecked()) {
|
||||||
|
advanced << "e! anal.hasnext";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return advanced;
|
||||||
|
}
|
||||||
|
|
||||||
void OptionsDialog::setupAndStartAnalysis(int level, QList<QString> advanced)
|
void OptionsDialog::setupAndStartAnalysis(int level, QList<QString> advanced)
|
||||||
{
|
{
|
||||||
ui->analSlider->setValue(level);
|
ui->analSlider->setValue(level);
|
||||||
@ -191,6 +238,22 @@ void OptionsDialog::setupAndStartAnalysis(int level, QList<QString> advanced)
|
|||||||
options.endian = getSelectedEndianness();
|
options.endian = getSelectedEndianness();
|
||||||
options.bbsize = getSelectedBBSize();
|
options.bbsize = getSelectedBBSize();
|
||||||
|
|
||||||
|
switch(level) {
|
||||||
|
case 1:
|
||||||
|
options.analCmd = { "aaa" };
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
options.analCmd = { "aaaa" };
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
options.analCmd = advanced;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
options.analCmd = {};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
AnalTask *analTask = new AnalTask(main);
|
AnalTask *analTask = new AnalTask(main);
|
||||||
analTask->setOptions(options);
|
analTask->setOptions(options);
|
||||||
|
|
||||||
@ -214,50 +277,7 @@ void OptionsDialog::updateProgress(const QString &status)
|
|||||||
|
|
||||||
void OptionsDialog::on_okButton_clicked()
|
void OptionsDialog::on_okButton_clicked()
|
||||||
{
|
{
|
||||||
QList<QString> advanced = QList<QString>();
|
setupAndStartAnalysis(ui->analSlider->value(), getSelectedAdvancedAnalCmds());
|
||||||
if (ui->analSlider->value() == 3) {
|
|
||||||
if (ui->aa_symbols->isChecked()) {
|
|
||||||
advanced << "aa";
|
|
||||||
}
|
|
||||||
if (ui->aar_references->isChecked()) {
|
|
||||||
advanced << "aar";
|
|
||||||
}
|
|
||||||
if (ui->aac_calls->isChecked()) {
|
|
||||||
advanced << "aac";
|
|
||||||
}
|
|
||||||
if (ui->aab_basicblocks->isChecked()) {
|
|
||||||
advanced << "aab";
|
|
||||||
}
|
|
||||||
if (ui->aan_rename->isChecked()) {
|
|
||||||
advanced << "aan";
|
|
||||||
}
|
|
||||||
if (ui->aae_emulate->isChecked()) {
|
|
||||||
advanced << "aae";
|
|
||||||
}
|
|
||||||
if (ui->aat_consecutive->isChecked()) {
|
|
||||||
advanced << "aat";
|
|
||||||
}
|
|
||||||
if (ui->afta_typeargument->isChecked()) {
|
|
||||||
advanced << "afta";
|
|
||||||
}
|
|
||||||
if (ui->aaT_aftertrap->isChecked()) {
|
|
||||||
advanced << "aaT";
|
|
||||||
}
|
|
||||||
if (ui->aap_preludes->isChecked()) {
|
|
||||||
advanced << "aap";
|
|
||||||
}
|
|
||||||
if (ui->jmptbl->isChecked()) {
|
|
||||||
advanced << "e! anal.jmptbl";
|
|
||||||
}
|
|
||||||
if (ui->pushret->isChecked()) {
|
|
||||||
advanced << "e! anal.pushret";
|
|
||||||
}
|
|
||||||
if (ui->hasnext->isChecked()) {
|
|
||||||
advanced << "e! anal.hasnext";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setupAndStartAnalysis(ui->analSlider->value(), advanced);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsDialog::analysisFinished()
|
void OptionsDialog::analysisFinished()
|
||||||
|
@ -26,6 +26,7 @@ public:
|
|||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void updateProgress(const QString &str);
|
void updateProgress(const QString &str);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_okButton_clicked();
|
void on_okButton_clicked();
|
||||||
void on_analSlider_valueChanged(int value);
|
void on_analSlider_valueChanged(int value);
|
||||||
@ -63,6 +64,7 @@ public:
|
|||||||
int getSelectedBBSize();
|
int getSelectedBBSize();
|
||||||
InitialOptions::Endianness getSelectedEndianness();
|
InitialOptions::Endianness getSelectedEndianness();
|
||||||
QString getSelectedOS();
|
QString getSelectedOS();
|
||||||
|
QList<QString> getSelectedAdvancedAnalCmds();
|
||||||
|
|
||||||
void reject() override;
|
void reject() override;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user