cutter/src/common/AnalTask.cpp

121 lines
3.2 KiB
C++
Raw Normal View History

#include "core/Cutter.h"
#include "common/AnalTask.h"
#include "core/MainWindow.h"
#include "dialogs/InitialOptionsDialog.h"
#include <QJsonArray>
2018-05-05 13:20:14 +00:00
#include <QDebug>
#include <QCheckBox>
2018-05-28 14:19:04 +00:00
AnalTask::AnalTask() :
AsyncTask()
{
}
2018-05-26 18:09:20 +00:00
AnalTask::~AnalTask()
{
}
2018-05-26 18:09:20 +00:00
void AnalTask::interrupt()
{
2018-05-26 18:09:20 +00:00
AsyncTask::interrupt();
2020-10-28 12:28:04 +00:00
rz_cons_singleton()->context->breaked = true;
2018-05-26 18:09:20 +00:00
}
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");
}
2018-05-26 18:09:20 +00:00
void AnalTask::runTask()
{
2020-10-28 12:28:04 +00:00
int perms = RZ_PERM_RX;
if (options.writeEnabled) {
2020-10-28 12:28:04 +00:00
perms |= RZ_PERM_W;
emit Core()->ioModeChanged();
}
2018-05-05 13:20:14 +00:00
// Demangle (must be before file Core()->loadFile)
Core()->setConfig("bin.demangle", options.demangle);
2018-05-05 13:20:14 +00:00
// Do not reload the file if already loaded
QJsonArray openedFiles = Core()->getOpenedFiles();
2018-07-06 21:23:51 +00:00
if (!openedFiles.size() && options.filename.length()) {
log(tr("Loading the file..."));
openFailed = false;
bool fileLoaded = Core()->loadFile(options.filename,
options.binLoadAddr,
options.mapAddr,
perms,
options.useVA,
options.loadBinInfo,
options.forceBinPlugin);
if (!fileLoaded) {
// Something wrong happened, fallback to open dialog
openFailed = true;
emit openFileFailed();
2018-07-06 21:23:51 +00:00
interrupt();
return;
}
}
2020-10-28 12:28:04 +00:00
// rz_core_bin_load might change asm.bits, so let's set that after the bin is loaded
Core()->setCPU(options.arch, options.cpu, options.bits);
2018-05-27 19:49:14 +00:00
if (isInterrupted()) {
return;
}
if (!options.os.isNull()) {
2020-03-20 18:11:30 +00:00
Core()->cmdRaw("e asm.os=" + options.os);
}
if (!options.pdbFile.isNull()) {
log(tr("Loading PDB file..."));
Core()->loadPDB(options.pdbFile);
}
2018-05-27 19:49:14 +00:00
if (isInterrupted()) {
return;
}
if (!options.shellcode.isNull() && options.shellcode.size() / 2 > 0) {
log(tr("Loading shellcode..."));
2020-03-20 18:11:30 +00:00
Core()->cmdRaw("wx " + options.shellcode);
}
2018-07-24 17:50:55 +00:00
if (options.endian != InitialOptions::Endianness::Auto) {
Core()->setEndianness(options.endian == InitialOptions::Endianness::Big);
}
2020-03-20 18:11:30 +00:00
Core()->cmdRaw("fs *");
2018-07-24 17:50:55 +00:00
if (!options.script.isNull()) {
log(tr("Executing script..."));
Core()->loadScript(options.script);
}
2018-05-27 19:49:14 +00:00
if (isInterrupted()) {
return;
}
2018-05-27 19:38:19 +00:00
if (!options.analCmd.empty()) {
log(tr("Executing analysis..."));
for (const CommandDescription &cmd : options.analCmd) {
2018-05-27 19:38:19 +00:00
if (isInterrupted()) {
return;
}
log(cmd.description);
2020-03-20 18:11:30 +00:00
// use cmd instead of cmdRaw because commands can be unexpected
Core()->cmd(cmd.command);
2018-05-27 19:38:19 +00:00
}
log(tr("Analysis complete!"));
2018-05-27 19:38:19 +00:00
} else {
log(tr("Skipping Analysis."));
2018-05-27 19:38:19 +00:00
}
}