Made CutterCore singleton

This commit is contained in:
xarkes 2017-10-09 20:08:35 +02:00
parent 22cb654046
commit 93195999d8
39 changed files with 324 additions and 332 deletions

View File

@ -12,6 +12,10 @@ Make a clear description of the bug/feature, use screenshots, send binaries, etc
Note that cutter is still under development and many parts of the code are to be improved. Note that cutter is still under development and many parts of the code are to be improved.
### CutterCore class
This is the main class where every link with r2 is made. It is *unique* accross the whole process. To access it, simply call `CutterCore::getInstance()`.
### Calling a radare2 command ### Calling a radare2 command
There are two ways to do it: There are two ways to do it:
@ -20,12 +24,12 @@ There are two ways to do it:
### Seek the current file ### Seek the current file
To modify radare2 seek use `MainWindow::seek(const RVA offset)`. This is important because it will emit a `MainWindow::seekChanged(RVA offset)` signal. To modify radare2 seek use `CutterCore::seek(const RVA offset)`. This is important because it will emit a `CutterCore::seekChanged(RVA offset)` signal.
Never ever call cmd("s offset"); Never ever call cmd("s offset");
### Creating a widget ### Creating a widget
Make sure to connect the `MainWindow::seekChanged(RVA offset)` signal so your widget refreshes its output when radare2 seek is modified (switching to another function, etc.). Make sure to connect the `CutterCore::seekChanged(RVA offset)` signal so your widget refreshes its output when radare2 seek is modified (switching to another function, etc.).
## General coding guidelines ## General coding guidelines

View File

@ -8,7 +8,8 @@
AnalThread::AnalThread(OptionsDialog *parent) : AnalThread::AnalThread(OptionsDialog *parent) :
QThread(parent), QThread(parent),
level(2), level(2),
main(nullptr) main(nullptr),
core(CutterCore::getInstance())
{ {
} }
@ -43,7 +44,7 @@ void AnalThread::run()
// Advanced Options // Advanced Options
// //
main->core->setCPU(optionsDialog->getSelectedArch(), optionsDialog->getSelectedCPU(), optionsDialog->getSelectedBits()); core->setCPU(optionsDialog->getSelectedArch(), optionsDialog->getSelectedCPU(), optionsDialog->getSelectedBits());
bool rw = false; bool rw = false;
bool load_bininfo = ui->binCheckBox->isChecked(); bool load_bininfo = ui->binCheckBox->isChecked();
@ -54,7 +55,7 @@ void AnalThread::run()
{ {
va = 2; va = 2;
loadaddr = UT64_MAX; loadaddr = UT64_MAX;
r_config_set_i(main->core->core()->config, "bin.laddr", loadaddr); r_config_set_i(core->core()->config, "bin.laddr", loadaddr);
mapaddr = 0; mapaddr = 0;
} }
} }
@ -76,22 +77,22 @@ void AnalThread::run()
forceBinPlugin = pluginDesc.name; forceBinPlugin = pluginDesc.name;
} }
main->core->setConfig("bin.demangle", ui->demangleCheckBox->isChecked()); core->setConfig("bin.demangle", ui->demangleCheckBox->isChecked());
main->core->loadFile(main->getFilename(), loadaddr, mapaddr, rw, va, binidx, load_bininfo, forceBinPlugin); core->loadFile(main->getFilename(), loadaddr, mapaddr, rw, va, binidx, load_bininfo, forceBinPlugin);
emit updateProgress("Analysis in progress."); emit updateProgress("Analysis in progress.");
QString os = optionsDialog->getSelectedOS(); QString os = optionsDialog->getSelectedOS();
if (!os.isNull()) if (!os.isNull())
{ {
main->core->cmd("e asm.os=" + os); core->cmd("e asm.os=" + os);
} }
if (ui->pdbCheckBox->isChecked()) if (ui->pdbCheckBox->isChecked())
{ {
main->core->loadPDB(ui->pdbLineEdit->text()); core->loadPDB(ui->pdbLineEdit->text());
} }
//qDebug() << "Anal level: " << this->level; //qDebug() << "Anal level: " << this->level;
main->core->analyze(this->level, this->advanced); core->analyze(this->level, this->advanced);
} }

View File

@ -28,6 +28,7 @@ private:
int level; int level;
QList<QString> advanced; QList<QString> advanced;
MainWindow *main; MainWindow *main;
CutterCore *core;
}; };
#endif // ANALTHREAD_H #endif // ANALTHREAD_H

View File

@ -84,7 +84,7 @@ static void registerCustomFonts()
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
core(new CutterCore), core(CutterCore::getInstance()),
memoryDock(nullptr), memoryDock(nullptr),
notepadDock(nullptr), notepadDock(nullptr),
asmDock(nullptr), asmDock(nullptr),
@ -120,7 +120,6 @@ MainWindow::~MainWindow()
delete core; delete core;
} }
void MainWindow::initUI() void MainWindow::initUI()
{ {
ui->setupUi(this); ui->setupUi(this);
@ -133,7 +132,7 @@ void MainWindow::initUI()
// Hide central tab widget tabs // Hide central tab widget tabs
QTabBar *centralbar = ui->centralTabWidget->tabBar(); QTabBar *centralbar = ui->centralTabWidget->tabBar();
centralbar->setVisible(false); centralbar->setVisible(false);
consoleWidget = new ConsoleWidget(this, this); consoleWidget = new ConsoleWidget(this);
ui->tabVerticalLayout->addWidget(consoleWidget); ui->tabVerticalLayout->addWidget(consoleWidget);
// Sepparator between back/forward and undo/redo buttons // Sepparator between back/forward and undo/redo buttons
@ -185,7 +184,7 @@ void MainWindow::initUI()
dockWidgets.reserve(12); dockWidgets.reserve(12);
// Add Memory DockWidget // Add Memory DockWidget
this->memoryDock = new MemoryWidget(this); this->memoryDock = new MemoryWidget();
dockWidgets.push_back(memoryDock); dockWidgets.push_back(memoryDock);
// To use in the future when we handle more than one memory views // To use in the future when we handle more than one memory views
// this->memoryDock->setAttribute(Qt::WA_DeleteOnClose); // this->memoryDock->setAttribute(Qt::WA_DeleteOnClose);
@ -601,7 +600,7 @@ void MainWindow::on_actionMem_triggered()
{ {
//this->memoryDock->show(); //this->memoryDock->show();
//this->memoryDock->raise(); //this->memoryDock->raise();
MemoryWidget *newMemDock = new MemoryWidget(this); MemoryWidget *newMemDock = new MemoryWidget();
this->dockWidgets << newMemDock; this->dockWidgets << newMemDock;
newMemDock->setAttribute(Qt::WA_DeleteOnClose); newMemDock->setAttribute(Qt::WA_DeleteOnClose);
this->tabifyDockWidget(this->memoryDock, newMemDock); this->tabifyDockWidget(this->memoryDock, newMemDock);
@ -694,20 +693,13 @@ void MainWindow::setCursorAddress(RVA addr)
emit cursorAddressChanged(core->getOffset()); emit cursorAddressChanged(core->getOffset());
} }
void MainWindow::seek(const RVA offset)
{
core->seek(offset);
setCursorAddress(core->getOffset());
emit seekChanged(core->getOffset());
}
void MainWindow::backButton_clicked() void MainWindow::backButton_clicked()
{ {
QList<RVA> seek_history = core->getSeekHistory(); QList<RVA> seek_history = core->getSeekHistory();
this->core->cmd("s-"); this->core->cmd("s-");
RVA offset = this->core->getOffset(); RVA offset = this->core->getOffset();
//QString fcn = this->core->cmdFunctionAt(QString::number(offset)); //QString fcn = this->core->cmdFunctionAt(QString::number(offset));
this->seek(offset); core->seek(offset);
} }
void MainWindow::on_actionCalculator_triggered() void MainWindow::on_actionCalculator_triggered()
@ -920,7 +912,7 @@ void MainWindow::on_actionForward_triggered()
this->core->cmd("s+"); this->core->cmd("s+");
RVA offset = core->getOffset(); RVA offset = core->getOffset();
this->addDebugOutput(QString::number(offset)); this->addDebugOutput(QString::number(offset));
this->seek(offset); core->seek(offset);
} }
void MainWindow::toggleResponsive(bool maybe) void MainWindow::toggleResponsive(bool maybe)

View File

@ -45,10 +45,6 @@ class MainWindow : public QMainWindow
Q_OBJECT Q_OBJECT
public: public:
CutterCore* core;
MemoryWidget *memoryDock;
Notepad *notepadDock;
bool responsive; bool responsive;
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = 0);
@ -77,8 +73,7 @@ public:
void refreshOmniBar(const QStringList &flags); void refreshOmniBar(const QStringList &flags);
signals: signals:
void seekChanged(RVA offset); void cursorAddressChanged(RVA offset); // TODO cursor should be handled by its own widget
void cursorAddressChanged(RVA offset);
public slots: public slots:
@ -173,10 +168,13 @@ private slots:
void on_actionAsmOptions_triggered(); void on_actionAsmOptions_triggered();
private: private:
CutterCore *core;
QDockWidget *asmDock; QDockWidget *asmDock;
QDockWidget *calcDock; QDockWidget *calcDock;
Omnibar *omnibar; Omnibar *omnibar;
SideBar *sideBar; SideBar *sideBar;
MemoryWidget *memoryDock;
Notepad *notepadDock;
bool doLock; bool doLock;
void refreshMem(); void refreshMem();

View File

@ -3,8 +3,8 @@
#include "cutter.h" #include "cutter.h"
#include "sdb.h" #include "sdb.h"
#include "Settings.h" #include "Settings.h"
#include "MainWindow.h"
Q_GLOBAL_STATIC(ccClass, uniqueInstance)
#define DB this->db #define DB this->db
@ -69,6 +69,12 @@ CutterCore::CutterCore(QObject *parent) :
} }
CutterCore *CutterCore::getInstance()
{
return uniqueInstance;
}
int CutterCore::getCycloComplex(ut64 addr) int CutterCore::getCycloComplex(ut64 addr)
{ {
CORE_LOCK(); CORE_LOCK();
@ -179,12 +185,14 @@ QString CutterCore::cmd(const QString &str)
{ {
CORE_LOCK(); CORE_LOCK();
RVA offset = core_->offset;
QByteArray cmd = str.toUtf8(); QByteArray cmd = str.toUtf8();
//r_cons_flush();
char *res = r_core_cmd_str(this->core_, cmd.constData()); char *res = r_core_cmd_str(this->core_, cmd.constData());
QString o = QString(res ? res : ""); QString o = QString(res ? res : "");
//r_mem_free was added in https://github.com/radare/radare2/commit/cd28744049492dc8ac25a1f2b3ba0e42f0e9ce93
r_mem_free(res); r_mem_free(res);
if (offset != core_->offset) {
emit seekChanged(core_->offset);
}
return o; return o;
} }
@ -378,6 +386,7 @@ void CutterCore::seek(ut64 offset)
{ {
CORE_LOCK(); CORE_LOCK();
r_core_seek(this->core_, offset, true); r_core_seek(this->core_, offset, true);
emit seekChanged(core_->offset);
} }

View File

@ -180,20 +180,23 @@ Q_DECLARE_METATYPE(RBinPluginDescription)
class CutterCore: public QObject class CutterCore: public QObject
{ {
Q_OBJECT Q_OBJECT
friend class ccClass;
public: public:
QString projectPath; QString projectPath;
explicit CutterCore(QObject *parent = 0); explicit CutterCore(QObject *parent = 0);
~CutterCore(); ~CutterCore();
static CutterCore* getInstance();
/* Getters */
RVA getOffset() const { return core_->offset; } RVA getOffset() const { return core_->offset; }
static QString sanitizeStringForCommand(QString s);
int getCycloComplex(ut64 addr); int getCycloComplex(ut64 addr);
int getFcnSize(ut64 addr); int getFcnSize(ut64 addr);
int fcnCyclomaticComplexity(ut64 addr); int fcnCyclomaticComplexity(ut64 addr);
int fcnBasicBlockCount(ut64 addr); int fcnBasicBlockCount(ut64 addr);
int fcnEndBbs(RVA addr); int fcnEndBbs(RVA addr);
static QString sanitizeStringForCommand(QString s);
QString cmd(const QString &str); QString cmd(const QString &str);
QJsonDocument cmdj(const QString &str); QJsonDocument cmdj(const QString &str);
QStringList cmdList(const QString &str) { auto l = cmd(str).split("\n"); l.removeAll(""); return l; } QStringList cmdList(const QString &str) { auto l = cmd(str).split("\n"); l.removeAll(""); return l; }
@ -210,11 +213,11 @@ public:
ut64 math(const QString &expr); ut64 math(const QString &expr);
QString itoa(ut64 num, int rdx = 16); QString itoa(ut64 num, int rdx = 16);
/* Config related */
void setConfig(const QString &k, const QString &v); void setConfig(const QString &k, const QString &v);
void setConfig(const QString &k, int v); void setConfig(const QString &k, int v);
void setConfig(const QString &k, bool v); void setConfig(const QString &k, bool v);
void setConfig(const QString &k, const char *v) { setConfig(k, QString(v)); } void setConfig(const QString &k, const char *v) { setConfig(k, QString(v)); }
int getConfigi(const QString &k); int getConfigi(const QString &k);
bool getConfigb(const QString &k); bool getConfigb(const QString &k);
QString getConfig(const QString &k); QString getConfig(const QString &k);
@ -227,7 +230,8 @@ public:
RAnalFunction *functionAt(ut64 addr); RAnalFunction *functionAt(ut64 addr);
QString cmdFunctionAt(QString addr); QString cmdFunctionAt(QString addr);
QString cmdFunctionAt(RVA addr); QString cmdFunctionAt(RVA addr);
/* sdb */
/* SDB */
QList<QString> sdbList(QString path); QList<QString> sdbList(QString path);
QList<QString> sdbListKeys(QString path); QList<QString> sdbListKeys(QString path);
QString sdbGet(QString path, QString key); QString sdbGet(QString path, QString key);
@ -297,6 +301,12 @@ signals:
*/ */
void asmOptionsChanged(); void asmOptionsChanged();
/*!
* \brief seekChanged is emitted each time radare2 seek value is modified
* \param offset
*/
void seekChanged(RVA offset);
public slots: public slots:
private: private:
@ -307,4 +317,8 @@ private:
RCore *core_; RCore *core_;
}; };
class ccClass : public CutterCore
{
};
#endif // CUTTER_H #endif // CUTTER_H

View File

@ -7,7 +7,8 @@
CreateNewDialog::CreateNewDialog(QWidget *parent) : CreateNewDialog::CreateNewDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::CreateNewDialog), ui(new Ui::CreateNewDialog),
w(new MainWindow) w(new MainWindow),
core(CutterCore::getInstance())
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint)); setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint));
@ -69,7 +70,7 @@ void CreateNewDialog::on_exampleButton_clicked()
void CreateNewDialog::on_buttonCreate_clicked() void CreateNewDialog::on_buttonCreate_clicked()
{ {
RCoreLocked lcore = w->core->core(); RCoreLocked lcore = core->core();
QString type = ui->comboType->currentText(); QString type = ui->comboType->currentText();
QString str; QString str;
bool created = false; bool created = false;
@ -85,7 +86,7 @@ void CreateNewDialog::on_buttonCreate_clicked()
{ {
char file[32]; char file[32];
snprintf(file, sizeof(file) - 1, "malloc://%d", code->len); snprintf(file, sizeof(file) - 1, "malloc://%d", code->len);
if (w->core->loadFile(file, 0, 0, 1, 0, 0, false)) if (core->loadFile(file, 0, 0, 1, 0, 0, false))
{ {
created = true; created = true;
r_core_write_at(lcore, 0, code->buf, code->len); r_core_write_at(lcore, 0, code->buf, code->len);
@ -108,7 +109,7 @@ void CreateNewDialog::on_buttonCreate_clicked()
char file[32]; char file[32];
created = true; created = true;
snprintf(file, sizeof(file) - 1, "malloc://%d", fsize); snprintf(file, sizeof(file) - 1, "malloc://%d", fsize);
if (w->core->loadFile(file, 0, 0, 1, 0, 0, false)) if (core->loadFile(file, 0, 0, 1, 0, 0, false))
{ {
r_core_patch(lcore, ui->plainTextEdit->toPlainText().toUtf8().constData()); r_core_patch(lcore, ui->plainTextEdit->toPlainText().toUtf8().constData());
r_core_seek(lcore, 0, 1); r_core_seek(lcore, 0, 1);
@ -136,14 +137,14 @@ void CreateNewDialog::on_buttonCreate_clicked()
char file[32]; char file[32];
created = true; created = true;
snprintf(file, sizeof(file) - 1, "malloc://%d", fsize); snprintf(file, sizeof(file) - 1, "malloc://%d", fsize);
if (w->core->loadFile(file, 0, 0, 1, 0, 0, false)) if (core->loadFile(file, 0, 0, 1, 0, 0, false))
{ {
created = true; created = true;
QString str = ui->plainTextEdit->toPlainText(); QString str = ui->plainTextEdit->toPlainText();
QList <QString> lines = str.split("\n"); QList <QString> lines = str.split("\n");
foreach (QString str, lines) foreach (QString str, lines)
{ {
w->core->cmd(str); core->cmd(str);
} }
} }
else else
@ -164,7 +165,7 @@ void CreateNewDialog::on_buttonCreate_clicked()
if (sz > 0) if (sz > 0)
{ {
snprintf(file, sizeof(file) - 1, "malloc://%d", (int)sz); snprintf(file, sizeof(file) - 1, "malloc://%d", (int)sz);
if (w->core->loadFile(file, 0, 0, 1, 0, 0, false)) if (core->loadFile(file, 0, 0, 1, 0, 0, false))
{ {
created = true; created = true;
r_core_write_at(lcore, 0, (const ut8 *)hexpairs.constData(), (int)sz); r_core_write_at(lcore, 0, (const ut8 *)hexpairs.constData(), (int)sz);
@ -189,7 +190,7 @@ void CreateNewDialog::on_buttonCreate_clicked()
if (sz > 0) if (sz > 0)
{ {
snprintf(file, sizeof(file) - 1, "malloc://%d", sz); snprintf(file, sizeof(file) - 1, "malloc://%d", sz);
if (w->core->loadFile(file, 0, 0, 1, 0, 0, false)) if (core->loadFile(file, 0, 0, 1, 0, 0, false))
{ {
created = true; created = true;
r_core_write_at(lcore, 0, buf, sz); r_core_write_at(lcore, 0, buf, sz);
@ -215,8 +216,8 @@ void CreateNewDialog::on_buttonCreate_clicked()
{ {
__alert("TODO: non-raw fileformat is not yet supported"); __alert("TODO: non-raw fileformat is not yet supported");
created = false; created = false;
delete w->core; delete core;
w->core = nullptr; core = nullptr;
} }
if (created) if (created)
@ -225,7 +226,7 @@ void CreateNewDialog::on_buttonCreate_clicked()
// Close dialog and open OptionsDialog // Close dialog and open OptionsDialog
close(); close();
w->core->seek(0); core->seek(0);
w->updateFrames(); w->updateFrames();
w->setFilename("-"); w->setFilename("-");
w->addOutput(tr("Finished, check its contents")); w->addOutput(tr("Finished, check its contents"));

View File

@ -30,6 +30,7 @@ private slots:
private: private:
std::unique_ptr<Ui::CreateNewDialog> ui; std::unique_ptr<Ui::CreateNewDialog> ui;
MainWindow *w; MainWindow *w;
CutterCore *core;
}; };
#endif // CREATENEWDIALOG_H #endif // CREATENEWDIALOG_H

View File

@ -16,8 +16,9 @@
OptionsDialog::OptionsDialog(MainWindow *main): OptionsDialog::OptionsDialog(MainWindow *main):
QDialog(0), // parent may not be main QDialog(0), // parent may not be main
analThread(this), analThread(this),
main(main),
defaultAnalLevel(1), defaultAnalLevel(1),
core(CutterCore::getInstance()),
main(main),
ui(new Ui::OptionsDialog) ui(new Ui::OptionsDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
@ -28,25 +29,25 @@ OptionsDialog::OptionsDialog(MainWindow *main):
ui->analSlider->setValue(defaultAnalLevel); ui->analSlider->setValue(defaultAnalLevel);
// Fill the plugins combo // Fill the plugins combo
asm_plugins = main->core->getAsmPluginNames(); asm_plugins = core->getAsmPluginNames();
for (auto plugin : asm_plugins) for (auto plugin : asm_plugins)
ui->archComboBox->addItem(plugin, plugin); ui->archComboBox->addItem(plugin, plugin);
ui->archComboBox->setToolTip(main->core->cmd("e? asm.arch").trimmed()); ui->archComboBox->setToolTip(core->cmd("e? asm.arch").trimmed());
// cpu combo box // cpu combo box
ui->cpuComboBox->lineEdit()->setPlaceholderText(tr("Auto")); ui->cpuComboBox->lineEdit()->setPlaceholderText(tr("Auto"));
ui->cpuComboBox->setToolTip(main->core->cmd("e? asm.cpu").trimmed()); ui->cpuComboBox->setToolTip(core->cmd("e? asm.cpu").trimmed());
updateCPUComboBox(); updateCPUComboBox();
// os combo box // os combo box
for (const auto &plugin : main->core->cmdList("e asm.os=?")) for (const auto &plugin : core->cmdList("e asm.os=?"))
ui->kernelComboBox->addItem(plugin, plugin); ui->kernelComboBox->addItem(plugin, plugin);
ui->kernelComboBox->setToolTip(main->core->cmd("e? asm.os").trimmed()); ui->kernelComboBox->setToolTip(core->cmd("e? asm.os").trimmed());
ui->bitsComboBox->setToolTip(main->core->cmd("e? asm.bits").trimmed()); ui->bitsComboBox->setToolTip(core->cmd("e? asm.bits").trimmed());
for (auto plugin : main->core->getRBinPluginDescriptions("bin")) for (auto plugin : core->getRBinPluginDescriptions("bin"))
ui->formatComboBox->addItem(plugin.name, QVariant::fromValue(plugin)); ui->formatComboBox->addItem(plugin.name, QVariant::fromValue(plugin));
ui->hideFrame->setVisible(false); ui->hideFrame->setVisible(false);
@ -63,7 +64,7 @@ OptionsDialog::OptionsDialog(MainWindow *main):
ui->programLineEdit->setText(main->getFilename()); ui->programLineEdit->setText(main->getFilename());
QFileInfo fi(this->main->getFilename()); QFileInfo fi(this->main->getFilename());
this->main->core->tryFile(fi.filePath(), fi.isWritable()); this->core->tryFile(fi.filePath(), fi.isWritable());
} }
OptionsDialog::~OptionsDialog() {} OptionsDialog::~OptionsDialog() {}
@ -80,7 +81,7 @@ void OptionsDialog::updateCPUComboBox()
cmd += " @a:" + arch; cmd += " @a:" + arch;
ui->cpuComboBox->addItem(""); ui->cpuComboBox->addItem("");
ui->cpuComboBox->addItems(main->core->cmdList(cmd)); ui->cpuComboBox->addItems(core->cmdList(cmd));
ui->cpuComboBox->lineEdit()->setText(currentText); ui->cpuComboBox->lineEdit()->setText(currentText);
} }
@ -134,7 +135,7 @@ void OptionsDialog::setupAndStartAnalysis(int level, QList<QString> advanced)
main->initUI(); main->initUI();
main->core->resetDefaultAsmOptions(); core->resetDefaultAsmOptions();
// Threads stuff // Threads stuff
// connect signal/slot // connect signal/slot

View File

@ -41,6 +41,7 @@ private slots:
private: private:
AnalThread analThread; AnalThread analThread;
MainWindow *main; MainWindow *main;
CutterCore *core;
int defaultAnalLevel; int defaultAnalLevel;
QString analysisDescription(int level); QString analysisDescription(int level);

View File

@ -10,7 +10,8 @@ XrefsDialog::XrefsDialog(MainWindow *main, QWidget *parent) :
addr(0), addr(0),
func_name(QString::null), func_name(QString::null),
ui(new Ui::XrefsDialog), ui(new Ui::XrefsDialog),
main(main) main(main),
core(CutterCore::getInstance())
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint)); setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint));
@ -20,7 +21,7 @@ XrefsDialog::XrefsDialog(MainWindow *main, QWidget *parent) :
asm_docu->setDocumentMargin(10); asm_docu->setDocumentMargin(10);
// Syntax highlight // Syntax highlight
highlighter = new Highlighter(this->main, ui->previewTextEdit->document()); highlighter = new Highlighter(ui->previewTextEdit->document());
// Highlight current line // Highlight current line
connect(ui->previewTextEdit, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); connect(ui->previewTextEdit, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine()));
@ -37,10 +38,10 @@ void XrefsDialog::fillRefs(QList<XrefDescription> refs, QList<XrefDescription> x
QTreeWidgetItem *tempItem = new QTreeWidgetItem(); QTreeWidgetItem *tempItem = new QTreeWidgetItem();
tempItem->setText(0, RAddressString(xref.to)); tempItem->setText(0, RAddressString(xref.to));
tempItem->setText(1, main->core->disassembleSingleInstruction(xref.from)); tempItem->setText(1, core->disassembleSingleInstruction(xref.from));
tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref)); tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref));
//tempItem->setToolTip( 0, this->main->core->cmd("pdi 10 @ " + refs.at(i).at(0)) ); //tempItem->setToolTip( 0, this->core->cmd("pdi 10 @ " + refs.at(i).at(0)) );
//tempItem->setToolTip( 1, this->main->core->cmd("pdi 10 @ " + refs.at(i).at(0)) ); //tempItem->setToolTip( 1, this->core->cmd("pdi 10 @ " + refs.at(i).at(0)) );
ui->fromTreeWidget->insertTopLevelItem(0, tempItem); ui->fromTreeWidget->insertTopLevelItem(0, tempItem);
} }
@ -58,10 +59,10 @@ void XrefsDialog::fillRefs(QList<XrefDescription> refs, QList<XrefDescription> x
QTreeWidgetItem *tempItem = new QTreeWidgetItem(); QTreeWidgetItem *tempItem = new QTreeWidgetItem();
tempItem->setText(0, RAddressString(xref.from)); tempItem->setText(0, RAddressString(xref.from));
tempItem->setText(1, main->core->disassembleSingleInstruction(xref.from)); tempItem->setText(1, core->disassembleSingleInstruction(xref.from));
tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref)); tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref));
//tempItem->setToolTip( 0, this->main->core->cmd("pdi 10 @ " + xrefs.at(i).at(0)) ); //tempItem->setToolTip( 0, this->core->cmd("pdi 10 @ " + xrefs.at(i).at(0)) );
//tempItem->setToolTip( 1, this->main->core->cmd("pdi 10 @ " + xrefs.at(i).at(0)) ); //tempItem->setToolTip( 1, this->core->cmd("pdi 10 @ " + xrefs.at(i).at(0)) );
ui->toTreeWidget->insertTopLevelItem(0, tempItem); ui->toTreeWidget->insertTopLevelItem(0, tempItem);
} }
@ -79,7 +80,7 @@ void XrefsDialog::on_fromTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int
Q_UNUSED(column); Q_UNUSED(column);
XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>(); XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>();
RAnalFunction *fcn = this->main->core->functionAt(xref.to); RAnalFunction *fcn = this->core->functionAt(xref.to);
// TODO Seek // TODO Seek
//this->main->seek(xref.to, fcn ? QString::fromUtf8(fcn->name) : QString::null, true); //this->main->seek(xref.to, fcn ? QString::fromUtf8(fcn->name) : QString::null, true);
@ -91,7 +92,7 @@ void XrefsDialog::on_toTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int c
Q_UNUSED(column); Q_UNUSED(column);
XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>(); XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>();
RAnalFunction *fcn = this->main->core->functionAt(xref.from); RAnalFunction *fcn = this->core->functionAt(xref.from);
// TODO Seek // TODO Seek
//this->main->seek(xref.from, fcn ? QString::fromUtf8(fcn->name) : QString::null, true); //this->main->seek(xref.from, fcn ? QString::fromUtf8(fcn->name) : QString::null, true);
@ -161,10 +162,10 @@ void XrefsDialog::updatePreview(RVA addr)
QString disass; QString disass;
// is the address part of a function, so we can use pdf? // is the address part of a function, so we can use pdf?
if (!main->core->cmdj("afij@" + QString::number(addr)).array().isEmpty()) if (!core->cmdj("afij@" + QString::number(addr)).array().isEmpty())
disass = main->core->cmd("pdf @ " + QString::number(addr)); disass = core->cmd("pdf @ " + QString::number(addr));
else else
disass = main->core->cmd("pd 10 @ " + QString::number(addr)); disass = core->cmd("pd 10 @ " + QString::number(addr));
ui->previewTextEdit->setPlainText(disass.trimmed()); ui->previewTextEdit->setPlainText(disass.trimmed());
@ -190,10 +191,10 @@ void XrefsDialog::fillRefsForAddress(RVA addr, QString name, bool whole_function
// Get Refs and Xrefs // Get Refs and Xrefs
// refs = calls q hace esa funcion // refs = calls q hace esa funcion
QList<XrefDescription> refs = main->core->getXRefs(addr, false, whole_function); QList<XrefDescription> refs = core->getXRefs(addr, false, whole_function);
// xrefs = calls a esa funcion // xrefs = calls a esa funcion
QList<XrefDescription> xrefs = main->core->getXRefs(addr, true, whole_function); QList<XrefDescription> xrefs = core->getXRefs(addr, true, whole_function);
fillRefs(refs, xrefs); fillRefs(refs, xrefs);
} }

View File

@ -43,6 +43,7 @@ private:
std::unique_ptr<Ui::XrefsDialog> ui; std::unique_ptr<Ui::XrefsDialog> ui;
MainWindow *main; MainWindow *main;
CutterCore *core;
Highlighter *highlighter; Highlighter *highlighter;

View File

@ -52,8 +52,6 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
bool anal_level_specified = false; bool anal_level_specified = false;
int anal_level = 0; int anal_level = 0;

View File

@ -3,18 +3,17 @@
#include "Highlighter.h" #include "Highlighter.h"
#include "MainWindow.h" #include "MainWindow.h"
Highlighter::Highlighter(MainWindow *main, QTextDocument *parent) : Highlighter::Highlighter(QTextDocument *parent) :
QSyntaxHighlighter(parent) QSyntaxHighlighter(parent)
{ {
// Radare core found in:
this->main = main;
HighlightingRule rule; HighlightingRule rule;
core = CutterCore::getInstance();
keywordFormat.setForeground(QColor(65, 131, 215)); keywordFormat.setForeground(QColor(65, 131, 215));
keywordFormat.setFontWeight(QFont::Bold); keywordFormat.setFontWeight(QFont::Bold);
foreach (const QString &pattern, this->main->core->opcodes) foreach (const QString &pattern, this->core->opcodes)
{ {
rule.pattern = QRegExp("\\b" + pattern + "\\b"); rule.pattern = QRegExp("\\b" + pattern + "\\b");
rule.pattern.setCaseSensitivity(Qt::CaseInsensitive); rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
@ -25,7 +24,7 @@ Highlighter::Highlighter(MainWindow *main, QTextDocument *parent) :
regFormat.setForeground(QColor(236, 100, 75)); regFormat.setForeground(QColor(236, 100, 75));
regFormat.setFontWeight(QFont::Bold); regFormat.setFontWeight(QFont::Bold);
foreach (const QString &pattern, this->main->core->regs) foreach (const QString &pattern, this->core->regs)
{ {
rule.pattern = QRegExp("\\b" + pattern + "\\b"); rule.pattern = QRegExp("\\b" + pattern + "\\b");
rule.pattern.setCaseSensitivity(Qt::CaseInsensitive); rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);

View File

@ -3,6 +3,7 @@
#include <QSyntaxHighlighter> #include <QSyntaxHighlighter>
#include "cutter.h"
#include <QHash> #include <QHash>
#include <QTextCharFormat> #include <QTextCharFormat>
@ -14,13 +15,13 @@ class Highlighter : public QSyntaxHighlighter
Q_OBJECT Q_OBJECT
public: public:
Highlighter(MainWindow *main, QTextDocument *parent = 0); Highlighter(QTextDocument *parent = 0);
protected: protected:
void highlightBlock(const QString &text); void highlightBlock(const QString &text);
private: private:
MainWindow *main; CutterCore *core;
struct HighlightingRule struct HighlightingRule
{ {

View File

@ -66,7 +66,7 @@ void GraphicsBar::fillData()
this->codeGraphic->setToolTip("gap"); this->codeGraphic->setToolTip("gap");
// Parse JSON data // Parse JSON data
QString jsonData = this->main->core->cmd("p-j"); QString jsonData = CutterCore::getInstance()->cmd("p-j");
QJsonDocument doc = QJsonDocument::fromJson(jsonData.toUtf8()); QJsonDocument doc = QJsonDocument::fromJson(jsonData.toUtf8());
if (doc.isNull()) if (doc.isNull())

View File

@ -26,7 +26,7 @@ CommentsWidget::CommentsWidget(MainWindow *main, QWidget *parent) :
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(showTitleContextMenu(const QPoint &))); this, SLOT(showTitleContextMenu(const QPoint &)));
connect(main->core, SIGNAL(commentsChanged()), this, SLOT(refreshTree())); connect(CutterCore::getInstance(), SIGNAL(commentsChanged()), this, SLOT(refreshTree()));
// Hide the buttons frame // Hide the buttons frame
ui->frame->hide(); ui->frame->hide();
@ -51,8 +51,8 @@ void CommentsWidget::on_commentsTreeWidget_itemDoubleClicked(QTreeWidgetItem *it
// Get offset and name of item double clicked // Get offset and name of item double clicked
CommentDescription comment = item->data(0, Qt::UserRole).value<CommentDescription>(); CommentDescription comment = item->data(0, Qt::UserRole).value<CommentDescription>();
this->main->addDebugOutput(RAddressString(comment.offset) + ": " + comment.name); this->main->addDebugOutput(RAddressString(comment.offset) + ": " + comment.name);
this->main->seek(comment.offset); CutterCore::getInstance()->seek(comment.offset);
//this->main->seek(comment.offset, comment.name, true); //CutterCore::getInstance()->seek(comment.offset, comment.name, true);
} }
void CommentsWidget::on_toolButton_clicked() void CommentsWidget::on_toolButton_clicked()
@ -123,12 +123,12 @@ void CommentsWidget::resizeEvent(QResizeEvent *event)
void CommentsWidget::refreshTree() void CommentsWidget::refreshTree()
{ {
ui->nestedCmtsTreeWidget->clear(); ui->nestedCmtsTreeWidget->clear();
QList<CommentDescription> comments = this->main->core->getAllComments("CCu"); QList<CommentDescription> comments = CutterCore::getInstance()->getAllComments("CCu");
for (CommentDescription comment : comments) for (CommentDescription comment : comments)
{ {
//this->main->add_debug_output(RAddressString(comment.offset)); //this->main->add_debug_output(RAddressString(comment.offset));
QString fcn_name = this->main->core->cmdFunctionAt(comment.offset); QString fcn_name = CutterCore::getInstance()->cmdFunctionAt(comment.offset);
QTreeWidgetItem *item = qhelpers::appendRow(ui->commentsTreeWidget, RAddressString(comment.offset), fcn_name, comment.name); QTreeWidgetItem *item = qhelpers::appendRow(ui->commentsTreeWidget, RAddressString(comment.offset), fcn_name, comment.name);
item->setData(0, Qt::UserRole, QVariant::fromValue(comment)); item->setData(0, Qt::UserRole, QVariant::fromValue(comment));
} }
@ -136,7 +136,7 @@ void CommentsWidget::refreshTree()
// Add nested comments // Add nested comments
ui->nestedCmtsTreeWidget->clear(); ui->nestedCmtsTreeWidget->clear();
QMap<QString, QList<QList<QString>>> cmts = this->main->core->getNestedComments(); QMap<QString, QList<QList<QString>>> cmts = CutterCore::getInstance()->getNestedComments();
for (auto cmt : cmts.keys()) for (auto cmt : cmts.keys())
{ {
QTreeWidgetItem *item = new QTreeWidgetItem(ui->nestedCmtsTreeWidget); QTreeWidgetItem *item = new QTreeWidgetItem(ui->nestedCmtsTreeWidget);

View File

@ -90,11 +90,9 @@ static bool isForbidden(const QString &input)
ConsoleWidget::ConsoleWidget(MainWindow *main, QWidget *parent) : ConsoleWidget::ConsoleWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::ConsoleWidget), ui(new Ui::ConsoleWidget),
core(main->core),
main(main),
debugOutputEnabled(true), debugOutputEnabled(true),
maxHistoryEntries(100), maxHistoryEntries(100),
lastHistoryPosition(invalidHistoryPos) lastHistoryPosition(invalidHistoryPos)
@ -121,11 +119,6 @@ ConsoleWidget::ConsoleWidget(MainWindow *main, QWidget *parent) :
connect(action, SIGNAL(triggered(bool)), ui->outputTextEdit, SLOT(clear())); connect(action, SIGNAL(triggered(bool)), ui->outputTextEdit, SLOT(clear()));
actions.append(action); actions.append(action);
action = new QAction(tr("Sync with core"), ui->outputTextEdit);
action->setCheckable(true);
connect(action, SIGNAL(toggled(bool)), this, SLOT(syncWithCoreToggled(bool)));
actions.append(action);
// Completion // Completion
QCompleter *completer = new QCompleter(radareArgs, this); QCompleter *completer = new QCompleter(radareArgs, this);
completer->setMaxVisibleItems(20); completer->setMaxVisibleItems(20);
@ -176,25 +169,14 @@ void ConsoleWidget::focusInputLineEdit()
ui->inputLineEdit->setFocus(); ui->inputLineEdit->setFocus();
} }
QString ConsoleWidget::executeCommand(QString command)
{
RVA offset = this->core->getOffset();
QString res = this->core->cmd(command);
RVA newOffset = this->core->getOffset();
if (offset != newOffset) {
emit main->seekChanged(newOffset);
}
return res;
}
void ConsoleWidget::on_inputLineEdit_returnPressed() void ConsoleWidget::on_inputLineEdit_returnPressed()
{ {
QString input = ui->inputLineEdit->text(); QString input = ui->inputLineEdit->text();
if (!input.isEmpty() && core != nullptr) if (!input.isEmpty())
{ {
if (!isForbidden(input)) if (!isForbidden(input))
{ {
QString res = executeCommand(input); QString res = CutterCore::getInstance()->cmd(input);
ui->outputTextEdit->appendPlainText(res); ui->outputTextEdit->appendPlainText(res);
scrollOutputToEnd(); scrollOutputToEnd();
historyAdd(input); historyAdd(input);
@ -221,19 +203,6 @@ void ConsoleWidget::showCustomContextMenu(const QPoint &pt)
menu->deleteLater(); menu->deleteLater();
} }
void ConsoleWidget::syncWithCoreToggled(bool checked)
{
// TODO Core and Cutter are always in sync
if (checked)
{
//Enable core syncronization
}
else
{
// Disable core sync
}
}
void ConsoleWidget::historyNext() void ConsoleWidget::historyNext()
{ {
if (!history.isEmpty()) if (!history.isEmpty())

View File

@ -5,9 +5,6 @@
#include <memory> #include <memory>
#include "MainWindow.h" #include "MainWindow.h"
class CutterCore;
class QAction;
namespace Ui namespace Ui
{ {
class ConsoleWidget; class ConsoleWidget;
@ -19,7 +16,7 @@ class ConsoleWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit ConsoleWidget(MainWindow *main, QWidget *parent = 0); explicit ConsoleWidget(QWidget *parent = 0);
~ConsoleWidget(); ~ConsoleWidget();
void addOutput(const QString &msg); void addOutput(const QString &msg);
@ -39,8 +36,6 @@ private slots:
void showCustomContextMenu(const QPoint &pt); void showCustomContextMenu(const QPoint &pt);
void syncWithCoreToggled(bool checked);
void historyNext(); void historyNext();
void historyPrev(); void historyPrev();
@ -53,8 +48,6 @@ private:
QString executeCommand(QString command); QString executeCommand(QString command);
std::unique_ptr<Ui::ConsoleWidget> ui; std::unique_ptr<Ui::ConsoleWidget> ui;
CutterCore *core;
MainWindow *main;
QList<QAction *> actions; QList<QAction *> actions;
bool debugOutputEnabled; bool debugOutputEnabled;
int maxHistoryEntries; int maxHistoryEntries;

View File

@ -37,7 +37,7 @@ void Dashboard::refresh()
void Dashboard::updateContents() void Dashboard::updateContents()
{ {
// Parse and add JSON file info // Parse and add JSON file info
QString info = this->main->core->getFileInfo(); QString info = CutterCore::getInstance()->getFileInfo();
QJsonDocument docu = QJsonDocument::fromJson(info.toUtf8()); QJsonDocument docu = QJsonDocument::fromJson(info.toUtf8());
QJsonObject object = docu.object(); QJsonObject object = docu.object();
@ -145,12 +145,12 @@ void Dashboard::updateContents()
} }
// Add file hashes and libraries // Add file hashes and libraries
QString md5 = this->main->core->cmd("e file.md5"); QString md5 = CutterCore::getInstance()->cmd("e file.md5");
QString sha1 = this->main->core->cmd("e file.sha1"); QString sha1 = CutterCore::getInstance()->cmd("e file.sha1");
ui->md5Edit->setText(md5); ui->md5Edit->setText(md5);
ui->sha1Edit->setText(sha1); ui->sha1Edit->setText(sha1);
QString libs = this->main->core->cmd("il"); QString libs = CutterCore::getInstance()->cmd("il");
QStringList lines = libs.split("\n", QString::SkipEmptyParts); QStringList lines = libs.split("\n", QString::SkipEmptyParts);
if (!lines.isEmpty()) if (!lines.isEmpty())
{ {
@ -189,11 +189,11 @@ void Dashboard::updateContents()
ui->verticalLayout_2->addSpacerItem(spacer); ui->verticalLayout_2->addSpacerItem(spacer);
// Add entropy value // Add entropy value
QString entropy = this->main->core->cmd("ph entropy").trimmed(); QString entropy = CutterCore::getInstance()->cmd("ph entropy").trimmed();
ui->lblEntropy->setText(entropy); ui->lblEntropy->setText(entropy);
// Get stats for the graphs // Get stats for the graphs
QStringList stats = this->main->core->getStats(); QStringList stats = CutterCore::getInstance()->getStats();
// Add data to HTML graphs (stats) // Add data to HTML graphs (stats)
QFile html(":/html/stats.html"); QFile html(":/html/stats.html");

View File

@ -14,12 +14,10 @@
#undef max #undef max
#endif #endif
DisassemblerGraphView::DisassemblerGraphView(QWidget *parent, MainWindow *main) DisassemblerGraphView::DisassemblerGraphView(QWidget *parent)
: QAbstractScrollArea(parent), : QAbstractScrollArea(parent),
//currentGraph(duint(0)), //currentGraph(duint(0)),
//disasm(ConfigUint("Disassembler", "MaxModuleSize")), //disasm(ConfigUint("Disassembler", "MaxModuleSize")),
mCore(main->core),
mMain(main),
mFontMetrics(nullptr), mFontMetrics(nullptr),
syncOrigin(false), syncOrigin(false),
mCip(0), mCip(0),
@ -75,7 +73,7 @@ DisassemblerGraphView::DisassemblerGraphView(QWidget *parent, MainWindow *main)
setupContextMenu(); setupContextMenu();
//Connect to bridge //Connect to bridge
connect(main, SIGNAL(seekChanged(RVA)), this, SLOT(on_seekChanged(RVA))); connect(CutterCore::getInstance(), SIGNAL(seekChanged(RVA)), this, SLOT(on_seekChanged(RVA)));
//connect(Bridge::getBridge(), SIGNAL(loadGraph(BridgeCFGraphList*, duint)), this, SLOT(loadGraphSlot(BridgeCFGraphList*, duint))); //connect(Bridge::getBridge(), SIGNAL(loadGraph(BridgeCFGraphList*, duint)), this, SLOT(loadGraphSlot(BridgeCFGraphList*, duint)));
//connect(Bridge::getBridge(), SIGNAL(graphAt(duint)), this, SLOT(graphAtSlot(duint))); //connect(Bridge::getBridge(), SIGNAL(graphAt(duint)), this, SLOT(graphAtSlot(duint)));
//connect(Bridge::getBridge(), SIGNAL(updateGraph()), this, SLOT(updateGraphSlot())); //connect(Bridge::getBridge(), SIGNAL(updateGraph()), this, SLOT(updateGraphSlot()));
@ -733,11 +731,11 @@ void DisassemblerGraphView::mouseDoubleClickEvent(QMouseEvent* event)
{ {
toggleOverviewSlot(); toggleOverviewSlot();
} }
/*else else
{ {
duint instr = this->getInstrForMouseEvent(event); duint instr = this->getInstrForMouseEvent(event);
DbgCmdExec(QString("graph dis.branchdest(%1), silent").arg(ToPtrString(instr)).toUtf8().constData()); //DbgCmdExec(QString("graph dis.branchdest(%1), silent").arg(ToPtrString(instr)).toUtf8().constData());
}*/ }
} }
void DisassemblerGraphView::prepareGraphNode(DisassemblerBlock & block) void DisassemblerGraphView::prepareGraphNode(DisassemblerBlock & block)
@ -1543,7 +1541,7 @@ void DisassemblerGraphView::tokenizerConfigUpdatedSlot()
void DisassemblerGraphView::loadCurrentGraph() void DisassemblerGraphView::loadCurrentGraph()
{ {
// Read functions // Read functions
QJsonDocument functionsDoc = mCore->cmdj("agj"); QJsonDocument functionsDoc = CutterCore::getInstance()->cmdj("agj");
QJsonArray functions = functionsDoc.array(); QJsonArray functions = functionsDoc.array();
Analysis anal; Analysis anal;

View File

@ -208,7 +208,7 @@ public:
Narrow, Narrow,
}; };
DisassemblerGraphView(QWidget *parent, MainWindow *main); DisassemblerGraphView(QWidget *parent);
~DisassemblerGraphView(); ~DisassemblerGraphView();
void initFont(); void initFont();
void adjustSize(int width, int height); void adjustSize(int width, int height);
@ -286,8 +286,7 @@ public slots:
void decompileSlot(); void decompileSlot();
private: private:
CutterCore *mCore; MainWindow* main;
MainWindow *mMain;
QString status; QString status;
Analysis analysis; Analysis analysis;
duint function; duint function;

View File

@ -43,7 +43,7 @@ void EntrypointWidget::refresh()
void EntrypointWidget::fillEntrypoint() void EntrypointWidget::fillEntrypoint()
{ {
ui->entrypointTreeWidget->clear(); ui->entrypointTreeWidget->clear();
for (auto i : this->main->core->getAllEntrypoint()) for (auto i : CutterCore::getInstance()->getAllEntrypoint())
{ {
QTreeWidgetItem *item = qhelpers::appendRow(ui->entrypointTreeWidget, RAddressString(i.vaddr), i.type); QTreeWidgetItem *item = qhelpers::appendRow(ui->entrypointTreeWidget, RAddressString(i.vaddr), i.type);
item->setData(0, Qt::UserRole, QVariant::fromValue(i)); item->setData(0, Qt::UserRole, QVariant::fromValue(i));
@ -60,6 +60,6 @@ void EntrypointWidget::setScrollMode()
void EntrypointWidget::on_entrypointTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int /* column */) void EntrypointWidget::on_entrypointTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int /* column */)
{ {
EntrypointDescription ep = item->data(0, Qt::UserRole).value<EntrypointDescription>(); EntrypointDescription ep = item->data(0, Qt::UserRole).value<EntrypointDescription>();
this->main->seek(ep.vaddr); CutterCore::getInstance()->seek(ep.vaddr);
//this->main->seek(ep.vaddr, ep.type, true); //CutterCore::getInstance()->seek(ep.vaddr, ep.type, true);
} }

View File

@ -162,7 +162,7 @@ void ExportsWidget::refresh()
void ExportsWidget::refreshExports() void ExportsWidget::refreshExports()
{ {
exports_model->beginReloadExports(); exports_model->beginReloadExports();
exports = main->core->getAllExports(); exports = CutterCore::getInstance()->getAllExports();
exports_model->endReloadExports(); exports_model->endReloadExports();
ui->exportsTreeView->resizeColumnToContents(0); ui->exportsTreeView->resizeColumnToContents(0);
@ -179,5 +179,5 @@ void ExportsWidget::setScrollMode()
void ExportsWidget::on_exportsTreeView_doubleClicked(const QModelIndex &index) void ExportsWidget::on_exportsTreeView_doubleClicked(const QModelIndex &index)
{ {
ExportDescription exp = index.data(ExportsModel::ExportDescriptionRole).value<ExportDescription>(); ExportDescription exp = index.data(ExportsModel::ExportDescriptionRole).value<ExportDescription>();
this->main->seek(exp.vaddr); CutterCore::getInstance()->seek(exp.vaddr);
} }

View File

@ -137,7 +137,7 @@ FlagsWidget::FlagsWidget(MainWindow *main, QWidget *parent) :
ui->flagsTreeView->setModel(flags_proxy_model); ui->flagsTreeView->setModel(flags_proxy_model);
ui->flagsTreeView->sortByColumn(FlagsModel::OFFSET, Qt::AscendingOrder); ui->flagsTreeView->sortByColumn(FlagsModel::OFFSET, Qt::AscendingOrder);
connect(main->core, SIGNAL(flagsChanged()), this, SLOT(flagsChanged())); connect(CutterCore::getInstance(), SIGNAL(flagsChanged()), this, SLOT(flagsChanged()));
} }
FlagsWidget::~FlagsWidget() {} FlagsWidget::~FlagsWidget() {}
@ -157,7 +157,7 @@ void FlagsWidget::refresh()
void FlagsWidget::on_flagsTreeView_doubleClicked(const QModelIndex &index) void FlagsWidget::on_flagsTreeView_doubleClicked(const QModelIndex &index)
{ {
FlagDescription flag = index.data(FlagsModel::FlagDescriptionRole).value<FlagDescription>(); FlagDescription flag = index.data(FlagsModel::FlagDescriptionRole).value<FlagDescription>();
this->main->seek(flag.offset); CutterCore::getInstance()->seek(flag.offset);
} }
void FlagsWidget::on_flagspaceCombo_currentTextChanged(const QString &arg1) void FlagsWidget::on_flagspaceCombo_currentTextChanged(const QString &arg1)
@ -181,7 +181,7 @@ void FlagsWidget::refreshFlagspaces()
ui->flagspaceCombo->clear(); ui->flagspaceCombo->clear();
ui->flagspaceCombo->addItem(tr("(all)")); ui->flagspaceCombo->addItem(tr("(all)"));
for (auto i : main->core->getAllFlagspaces()) for (auto i : CutterCore::getInstance()->getAllFlagspaces())
{ {
ui->flagspaceCombo->addItem(i.name, QVariant::fromValue(i)); ui->flagspaceCombo->addItem(i.name, QVariant::fromValue(i));
} }
@ -202,7 +202,7 @@ void FlagsWidget::refreshFlags()
flags_model->beginReloadFlags(); flags_model->beginReloadFlags();
flags = main->core->getAllFlags(flagspace); flags = CutterCore::getInstance()->getAllFlags(flagspace);
flags_model->endReloadFlags(); flags_model->endReloadFlags();
ui->flagsTreeView->resizeColumnToContents(0); ui->flagsTreeView->resizeColumnToContents(0);

View File

@ -26,7 +26,7 @@ FunctionModel::FunctionModel(QList<FunctionDescription> *functions, QSet<RVA> *i
{ {
connect(main, SIGNAL(cursorAddressChanged(RVA)), this, SLOT(cursorAddressChanged(RVA))); connect(main, SIGNAL(cursorAddressChanged(RVA)), this, SLOT(cursorAddressChanged(RVA)));
connect(main->core, SIGNAL(functionRenamed(QString, QString)), this, SLOT(functionRenamed(QString, QString))); connect(CutterCore::getInstance(), SIGNAL(functionRenamed(QString, QString)), this, SLOT(functionRenamed(QString, QString)));
} }
QModelIndex FunctionModel::index(int row, int column, const QModelIndex &parent) const QModelIndex FunctionModel::index(int row, int column, const QModelIndex &parent) const
@ -145,7 +145,7 @@ QVariant FunctionModel::data(const QModelIndex &index, int role) const
case Qt::ToolTipRole: case Qt::ToolTipRole:
{ {
QList<QString> info = main->core->cmd("afi @ " + function.name).split("\n"); QList<QString> info = CutterCore::getInstance()->cmd("afi @ " + function.name).split("\n");
if (info.length() > 2) if (info.length() > 2)
{ {
QString size = info[4].split(" ")[1]; QString size = info[4].split(" ")[1];
@ -154,8 +154,8 @@ QVariant FunctionModel::data(const QModelIndex &index, int role) const
return QString("Summary:\n\n Size: " + size + return QString("Summary:\n\n Size: " + size +
"\n Cyclomatic complexity: " + complex + "\n Cyclomatic complexity: " + complex +
"\n Basic blocks: " + bb + "\n Basic blocks: " + bb +
"\n\nDisasm preview:\n\n" + main->core->cmd("pdi 10 @ " + function.name) + "\n\nDisasm preview:\n\n" + CutterCore::getInstance()->cmd("pdi 10 @ " + function.name) +
"\nStrings:\n\n" + main->core->cmd("pdsf @ " + function.name)); "\nStrings:\n\n" + CutterCore::getInstance()->cmd("pdsf @ " + function.name));
} }
return QVariant(); return QVariant();
} }
@ -226,7 +226,7 @@ void FunctionModel::updateCurrentIndex()
{ {
const FunctionDescription &function = functions->at(i); const FunctionDescription &function = functions->at(i);
if (function.contains(this->main->core->getOffset()) if (function.contains(CutterCore::getInstance()->getOffset())
&& function.offset >= offset) && function.offset >= offset)
{ {
offset = function.offset; offset = function.offset;
@ -396,10 +396,10 @@ void FunctionsWidget::refreshTree()
function_model->beginReloadFunctions(); function_model->beginReloadFunctions();
nested_function_model->beginReloadFunctions(); nested_function_model->beginReloadFunctions();
functions = this->main->core->getAllFunctions(); functions = CutterCore::getInstance()->getAllFunctions();
import_addresses.clear(); import_addresses.clear();
foreach (ImportDescription import, main->core->getAllImports()) foreach (ImportDescription import, CutterCore::getInstance()->getAllImports())
import_addresses.insert(import.plt); import_addresses.insert(import.plt);
function_model->endReloadFunctions(); function_model->endReloadFunctions();
@ -422,7 +422,7 @@ QTreeView *FunctionsWidget::getCurrentTreeView()
void FunctionsWidget::functionsTreeView_doubleClicked(const QModelIndex &index) void FunctionsWidget::functionsTreeView_doubleClicked(const QModelIndex &index)
{ {
FunctionDescription function = index.data(FunctionModel::FunctionDescriptionRole).value<FunctionDescription>(); FunctionDescription function = index.data(FunctionModel::FunctionDescriptionRole).value<FunctionDescription>();
this->main->seek(function.offset); CutterCore::getInstance()->seek(function.offset);
} }
void FunctionsWidget::showFunctionsContextMenu(const QPoint &pt) void FunctionsWidget::showFunctionsContextMenu(const QPoint &pt)
@ -458,9 +458,9 @@ void FunctionsWidget::on_actionDisasAdd_comment_triggered()
QString comment = c->getComment(); QString comment = c->getComment();
this->main->addDebugOutput("Comment: " + comment + " at: " + function.name); this->main->addDebugOutput("Comment: " + comment + " at: " + function.name);
// Rename function in r2 core // Rename function in r2 core
this->main->core->setComment(function.offset, comment); CutterCore::getInstance()->setComment(function.offset, comment);
// Seek to new renamed function // Seek to new renamed function
this->main->seek(function.offset); CutterCore::getInstance()->seek(function.offset);
// TODO: Refresh functions tree widget // TODO: Refresh functions tree widget
} }
this->main->refreshComments(); this->main->refreshComments();
@ -483,7 +483,7 @@ void FunctionsWidget::on_actionFunctionsRename_triggered()
// Get new function name // Get new function name
QString new_name = r->getFunctionName(); QString new_name = r->getFunctionName();
// Rename function in r2 core // Rename function in r2 core
this->main->core->renameFunction(function.name, new_name); CutterCore::getInstance()->renameFunction(function.name, new_name);
// Scroll to show the new name in functions tree widget // Scroll to show the new name in functions tree widget
// //
@ -494,7 +494,7 @@ void FunctionsWidget::on_actionFunctionsRename_triggered()
// //
//ui->functionsTreeWidget->scrollToItem(selected_rows.first(), QAbstractItemView::PositionAtTop); //ui->functionsTreeWidget->scrollToItem(selected_rows.first(), QAbstractItemView::PositionAtTop);
// Seek to new renamed function // Seek to new renamed function
this->main->seek(function.offset); CutterCore::getInstance()->seek(function.offset);
} }
} }

View File

@ -63,7 +63,7 @@ void ImportsWidget::refresh()
void ImportsWidget::fillImports() void ImportsWidget::fillImports()
{ {
ui->importsTreeWidget->clear(); ui->importsTreeWidget->clear();
for (auto i : this->main->core->getAllImports()) for (auto i : CutterCore::getInstance()->getAllImports())
{ {
QTreeWidgetItem *item = qhelpers::appendRow(ui->importsTreeWidget, RAddressString(i.plt), i.type, "", i.name); QTreeWidgetItem *item = qhelpers::appendRow(ui->importsTreeWidget, RAddressString(i.plt), i.type, "", i.name);
item->setData(0, Qt::UserRole, QVariant::fromValue(i)); item->setData(0, Qt::UserRole, QVariant::fromValue(i));
@ -108,5 +108,5 @@ void ImportsWidget::setScrollMode()
void ImportsWidget::on_importsTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int /* column */) void ImportsWidget::on_importsTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int /* column */)
{ {
ImportDescription imp = item->data(0, Qt::UserRole).value<ImportDescription>(); ImportDescription imp = item->data(0, Qt::UserRole).value<ImportDescription>();
this->main->seek(imp.plt); CutterCore::getInstance()->seek(imp.plt);
} }

View File

@ -25,15 +25,12 @@
#include <cassert> #include <cassert>
MemoryWidget::MemoryWidget(MainWindow *main) : MemoryWidget::MemoryWidget() :
DockWidget(main), ui(new Ui::MemoryWidget),
ui(new Ui::MemoryWidget) core(CutterCore::getInstance())
{ {
ui->setupUi(this); ui->setupUi(this);
// Radare core found in:
this->main = main;
this->disasTextEdit = ui->disasTextEdit_2; this->disasTextEdit = ui->disasTextEdit_2;
this->hexOffsetText = ui->hexOffsetText_2; this->hexOffsetText = ui->hexOffsetText_2;
this->hexHexText = ui->hexHexText_2; this->hexHexText = ui->hexHexText_2;
@ -142,11 +139,11 @@ MemoryWidget::MemoryWidget(MainWindow *main) :
// Create Graph View // Create Graph View
ui->tabGraph->setLayout(new QGridLayout); ui->tabGraph->setLayout(new QGridLayout);
mGraphView = new DisassemblerGraphView(ui->tabGraph, main); mGraphView = new DisassemblerGraphView(ui->tabGraph);
ui->tabGraph->layout()->addWidget(mGraphView); ui->tabGraph->layout()->addWidget(mGraphView);
// Space to switch between disassembly and graph // Space to switch between disassembly and graph
QShortcut *graph_shortcut = new QShortcut(QKeySequence(Qt::Key_Space), this->main); QShortcut *graph_shortcut = new QShortcut(QKeySequence(Qt::Key_Space), this);
connect(graph_shortcut, SIGNAL(activated()), this, SLOT(cycleViews())); connect(graph_shortcut, SIGNAL(activated()), this, SLOT(cycleViews()));
//graph_shortcut->setContext(Qt::WidgetShortcut); //graph_shortcut->setContext(Qt::WidgetShortcut);
@ -174,11 +171,11 @@ MemoryWidget::MemoryWidget(MainWindow *main) :
connect(this->disasTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(disasmScrolled())); connect(this->disasTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(disasmScrolled()));
connect(this->hexASCIIText->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(hexScrolled())); connect(this->hexASCIIText->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(hexScrolled()));
connect(main, SIGNAL(seekChanged(RVA)), this, SLOT(on_seekChanged(RVA))); connect(core, SIGNAL(seekChanged(RVA)), this, SLOT(on_seekChanged(RVA)));
connect(main, SIGNAL(cursorAddressChanged(RVA)), this, SLOT(on_cursorAddressChanged(RVA))); //connect(main, SIGNAL(cursorAddressChanged(RVA)), this, SLOT(on_cursorAddressChanged(RVA)));
connect(main->core, SIGNAL(flagsChanged()), this, SLOT(updateViews())); connect(core, SIGNAL(flagsChanged()), this, SLOT(updateViews()));
connect(main->core, SIGNAL(commentsChanged()), this, SLOT(updateViews())); connect(core, SIGNAL(commentsChanged()), this, SLOT(updateViews()));
connect(main->core, SIGNAL(asmOptionsChanged()), this, SLOT(updateViews())); connect(core, SIGNAL(asmOptionsChanged()), this, SLOT(updateViews()));
fillPlugins(); fillPlugins();
} }
@ -202,12 +199,12 @@ void MemoryWidget::on_cursorAddressChanged(RVA addr)
void MemoryWidget::highlightDisasms() void MemoryWidget::highlightDisasms()
{ {
// Syntax Highliting // Syntax Highliting
highlighter = new Highlighter(this->main, ui->disasTextEdit_2->document()); highlighter = new Highlighter(ui->disasTextEdit_2->document());
highlighter_5 = new Highlighter(this->main, ui->hexDisasTextEdit_2->document()); highlighter_5 = new Highlighter(ui->hexDisasTextEdit_2->document());
ascii_highlighter = new AsciiHighlighter(ui->hexASCIIText_2->document()); ascii_highlighter = new AsciiHighlighter(ui->hexASCIIText_2->document());
hex_highlighter = new HexHighlighter(ui->hexHexText_2->document()); hex_highlighter = new HexHighlighter(ui->hexHexText_2->document());
preview_highlighter = new Highlighter(this->main, ui->previewTextEdit->document()); preview_highlighter = new Highlighter(ui->previewTextEdit->document());
deco_highlighter = new Highlighter(this->main, ui->decoTextEdit->document()); deco_highlighter = new Highlighter(ui->decoTextEdit->document());
} }
@ -404,7 +401,7 @@ void MemoryWidget::setup()
{ {
setScrollMode(); setScrollMode();
const QString off = main->core->cmd("afo entry0").trimmed(); const QString off = core->cmd("afo entry0").trimmed();
RVA offset = off.toULongLong(0, 16); RVA offset = off.toULongLong(0, 16);
updateViews(offset); updateViews(offset);
@ -430,7 +427,7 @@ void MemoryWidget::refresh()
void MemoryWidget::fillPlugins() void MemoryWidget::fillPlugins()
{ {
// Fill the plugins combo for the hexdump sidebar // Fill the plugins combo for the hexdump sidebar
ui->hexArchComboBox_2->insertItems(0, main->core->getAsmPluginNames()); ui->hexArchComboBox_2->insertItems(0, core->getAsmPluginNames());
} }
void MemoryWidget::addTextDisasm(QString txt) void MemoryWidget::addTextDisasm(QString txt)
@ -472,8 +469,8 @@ bool MemoryWidget::loadMoreDisassembly()
if (offset != RVA_INVALID) if (offset != RVA_INVALID)
{ {
main->core->seek(offset); core->seek(offset);
QString raw = this->main->core->cmd("pd 200"); QString raw = this->core->cmd("pd 200");
QString txt = raw.section("\n", 1, -1); QString txt = raw.section("\n", 1, -1);
//this->disasTextEdit->appendPlainText(" ;\n ; New content here\n ;\n " + txt.trimmed()); //this->disasTextEdit->appendPlainText(" ;\n ; New content here\n ;\n " + txt.trimmed());
this->disasTextEdit->appendPlainText(txt.trimmed()); this->disasTextEdit->appendPlainText(txt.trimmed());
@ -483,7 +480,7 @@ bool MemoryWidget::loadMoreDisassembly()
tc.movePosition(QTextCursor::End); tc.movePosition(QTextCursor::End);
tc.select(QTextCursor::LineUnderCursor); tc.select(QTextCursor::LineUnderCursor);
QString lastline = tc.selectedText(); QString lastline = tc.selectedText();
this->main->addDebugOutput("Last line: " + lastline); //this->main->addDebugOutput("Last line: " + lastline);
} }
loaded = true; loaded = true;
@ -501,9 +498,9 @@ bool MemoryWidget::loadMoreDisassembly()
//this->main->add_debug_output("First Offset: " + ele); //this->main->add_debug_output("First Offset: " + ele);
if (ele.contains("0x")) { if (ele.contains("0x")) {
int b = this->disasTextEdit->verticalScrollBar()->maximum(); int b = this->disasTextEdit->verticalScrollBar()->maximum();
this->main->core->cmd("ss " + ele); this->core->cmd("ss " + ele);
this->main->core->cmd("so -50"); this->core->cmd("so -50");
QString raw = this->main->core->cmd("pd 50"); QString raw = this->core->cmd("pd 50");
//this->main->add_debug_output(raw); //this->main->add_debug_output(raw);
//QString txt = raw.section("\n", 1, -1); //QString txt = raw.section("\n", 1, -1);
//this->main->add_debug_output(txt); //this->main->add_debug_output(txt);
@ -535,7 +532,7 @@ void MemoryWidget::disasmScrolled()
void MemoryWidget::refreshDisasm() void MemoryWidget::refreshDisasm()
{ {
RCoreLocked lcore = this->main->core->core(); RCoreLocked lcore = this->core->core();
// Prevent further scroll // Prevent further scroll
disconnect(this->disasTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(disasmScrolled())); disconnect(this->disasTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(disasmScrolled()));
@ -548,14 +545,14 @@ void MemoryWidget::refreshDisasm()
if (offset_changed) // new offset (seek) if (offset_changed) // new offset (seek)
{ {
disasm_top_offset = offset; disasm_top_offset = offset;
this->main->core->cmd(QString("s %1").arg(offset)); this->core->cmd(QString("s %1").arg(offset));
} }
else // simple refresh else // simple refresh
{ {
main->core->cmd(QString("s %1").arg(disasm_top_offset)); core->cmd(QString("s %1").arg(disasm_top_offset));
} }
QString txt2 = this->main->core->cmd("pd 200"); QString txt2 = this->core->cmd("pd 200");
disasTextEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); disasTextEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
@ -588,7 +585,7 @@ void MemoryWidget::refreshDisasm()
void MemoryWidget::refreshHexdump(const QString &where) void MemoryWidget::refreshHexdump(const QString &where)
{ {
RCoreLocked lcore = this->main->core->core(); RCoreLocked lcore = this->core->core();
// Prevent further scroll // Prevent further scroll
disconnect(this->hexASCIIText->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(hexScrolled())); disconnect(this->hexASCIIText->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(hexScrolled()));
@ -611,18 +608,18 @@ void MemoryWidget::refreshHexdump(const QString &where)
} }
//int size; //int size;
//size = main->core->get_size(); //size = core->get_size();
QString s = ""; QString s = "";
if (!where.isEmpty()) if (!where.isEmpty())
{ {
this->main->core->cmd("ss " + where); this->core->cmd("ss " + where);
} }
// Add first the hexdump at block size -- // Add first the hexdump at block size --
this->main->core->cmd("ss-" + this->main->core->itoa(hexdumpLength)); this->core->cmd("ss-" + this->core->itoa(hexdumpLength));
//s = this->normalize_addr(this->main->core->cmd("s")); //s = this->normalize_addr(this->core->cmd("s"));
QList<QString> ret = this->get_hexdump(""); QList<QString> ret = this->get_hexdump("");
hexdumpBottomOffset = lcore->offset; hexdumpBottomOffset = lcore->offset;
@ -632,10 +629,10 @@ void MemoryWidget::refreshHexdump(const QString &where)
this->resizeHexdump(); this->resizeHexdump();
// Add then the hexdump at block size ++ // Add then the hexdump at block size ++
this->main->core->cmd("ss+" + this->main->core->itoa(hexdumpLength)); this->core->cmd("ss+" + this->core->itoa(hexdumpLength));
// Get address to move cursor to later // Get address to move cursor to later
//QString s = "0x0" + this->main->core->cmd("s").split("0x")[1].trimmed(); //QString s = "0x0" + this->core->cmd("s").split("0x")[1].trimmed();
s = this->normalize_addr(this->main->core->cmd("s")); s = this->normalize_addr(this->core->cmd("s"));
ret = this->get_hexdump(""); ret = this->get_hexdump("");
hexdumpBottomOffset = lcore->offset; hexdumpBottomOffset = lcore->offset;
@ -658,7 +655,7 @@ void MemoryWidget::refreshHexdump(const QString &where)
QList<QString> MemoryWidget::get_hexdump(const QString &offset) QList<QString> MemoryWidget::get_hexdump(const QString &offset)
{ {
RCoreLocked lcore = this->main->core->core(); RCoreLocked lcore = this->core->core();
QList<QString> ret; QList<QString> ret;
QString hexdump; QString hexdump;
@ -676,17 +673,17 @@ QList<QString> MemoryWidget::get_hexdump(const QString &offset)
hexdumpLength = bsize; hexdumpLength = bsize;
} }
//this->main->add_debug_output("BSize: " + this->main->core->itoa(hexdumpLength, 10)); //this->main->add_debug_output("BSize: " + this->core->itoa(hexdumpLength, 10));
if (offset.isEmpty()) if (offset.isEmpty())
{ {
hexdump = this->main->core->cmd("px " + this->main->core->itoa(hexdumpLength, 10)); hexdump = this->core->cmd("px " + this->core->itoa(hexdumpLength, 10));
} }
else else
{ {
hexdump = this->main->core->cmd("px " + this->main->core->itoa(hexdumpLength, 10) + " @ " + offset); hexdump = this->core->cmd("px " + this->core->itoa(hexdumpLength, 10) + " @ " + offset);
} }
//QString hexdump = this->main->core->cmd ("px 0x" + this->main->core->itoa(size) + " @ 0x0"); //QString hexdump = this->core->cmd ("px 0x" + this->core->itoa(size) + " @ 0x0");
// TODO: use pxl to simplify // TODO: use pxl to simplify
QString offsets; QString offsets;
QString hex; QString hex;
@ -742,12 +739,12 @@ void MemoryWidget::resizeHexdump()
void MemoryWidget::hexScrolled() void MemoryWidget::hexScrolled()
{ {
RCoreLocked lcore = this->main->core->core(); RCoreLocked lcore = this->core->core();
QScrollBar *sb = this->hexASCIIText->verticalScrollBar(); QScrollBar *sb = this->hexASCIIText->verticalScrollBar();
if (sb->value() > sb->maximum() - 10) if (sb->value() > sb->maximum() - 10)
{ {
this->main->addDebugOutput("End is coming"); //this->main->addDebugOutput("End is coming");
QTextCursor tc = this->hexOffsetText->textCursor(); QTextCursor tc = this->hexOffsetText->textCursor();
tc.movePosition(QTextCursor::End); tc.movePosition(QTextCursor::End);
@ -794,7 +791,7 @@ void MemoryWidget::hexScrolled()
int bsize = 800; int bsize = 800;
QString s = QString::number(bsize); QString s = QString::number(bsize);
// s = 2048.. sigh... // s = 2048.. sigh...
QString kk = this->main->core->cmd("? " + firstline + " - " + s); QString kk = this->core->cmd("? " + firstline + " - " + s);
QString k = kk.split(" ")[1]; QString k = kk.split(" ")[1];
QList<QString> ret = this->get_hexdump(k); QList<QString> ret = this->get_hexdump(k);
@ -862,15 +859,15 @@ void MemoryWidget::on_hexHexText_2_selectionChanged()
QString arch = ui->hexArchComboBox_2->currentText(); QString arch = ui->hexArchComboBox_2->currentText();
QString bits = ui->hexBitsComboBox_2->currentText(); QString bits = ui->hexBitsComboBox_2->currentText();
QString oarch = this->main->core->getConfig("asm.arch"); QString oarch = this->core->getConfig("asm.arch");
QString obits = this->main->core->getConfig("asm.bits"); QString obits = this->core->getConfig("asm.bits");
this->main->core->setConfig("asm.arch", arch); this->core->setConfig("asm.arch", arch);
this->main->core->setConfig("asm.bits", bits); this->core->setConfig("asm.bits", bits);
QString str = this->main->core->cmd("pad " + sel_text); QString str = this->core->cmd("pad " + sel_text);
this->hexDisasTextEdit->setPlainText(str); this->hexDisasTextEdit->setPlainText(str);
this->main->core->setConfig("asm.arch", oarch); this->core->setConfig("asm.arch", oarch);
this->main->core->setConfig("asm.bits", obits); this->core->setConfig("asm.bits", obits);
//qDebug() << "Selected Arch: " << arch; //qDebug() << "Selected Arch: " << arch;
//qDebug() << "Selected Bits: " << bits; //qDebug() << "Selected Bits: " << bits;
//qDebug() << "Selected Text: " << sel_text; //qDebug() << "Selected Text: " << sel_text;
@ -878,41 +875,41 @@ void MemoryWidget::on_hexHexText_2_selectionChanged()
// TODO: update on selection changes.. use cmd("pc "+len+"@"+off) // TODO: update on selection changes.. use cmd("pc "+len+"@"+off)
else if (parsing == "C byte array") else if (parsing == "C byte array")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pc@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pc@x:" + sel_text));
} }
else if (parsing == "C dword array") else if (parsing == "C dword array")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pcw@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pcw@x:" + sel_text));
} }
else if (parsing == "C qword array") else if (parsing == "C qword array")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pcq@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pcq@x:" + sel_text));
} }
else if (parsing == "Assembler") else if (parsing == "Assembler")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pca@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pca@x:" + sel_text));
} }
else if (parsing == "String") else if (parsing == "String")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pcs@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pcs@x:" + sel_text));
} }
else if (parsing == "JSON") else if (parsing == "JSON")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pcj@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pcj@x:" + sel_text));
} }
else if (parsing == "Javascript") else if (parsing == "Javascript")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pcJ@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pcJ@x:" + sel_text));
} }
else if (parsing == "Python") else if (parsing == "Python")
{ {
this->hexDisasTextEdit->setPlainText(this->main->core->cmd("pcp@x:" + sel_text)); this->hexDisasTextEdit->setPlainText(this->core->cmd("pcp@x:" + sel_text));
} }
// Fill the information tab hashes and entropy // Fill the information tab hashes and entropy
ui->bytesMD5->setText(this->main->core->cmd("ph md5@x:" + sel_text).trimmed()); ui->bytesMD5->setText(this->core->cmd("ph md5@x:" + sel_text).trimmed());
ui->bytesSHA1->setText(this->main->core->cmd("ph sha1@x:" + sel_text).trimmed()); ui->bytesSHA1->setText(this->core->cmd("ph sha1@x:" + sel_text).trimmed());
ui->bytesEntropy->setText(this->main->core->cmd("ph entropy@x:" + sel_text).trimmed()); ui->bytesEntropy->setText(this->core->cmd("ph entropy@x:" + sel_text).trimmed());
ui->bytesMD5->setCursorPosition(0); ui->bytesMD5->setCursorPosition(0);
ui->bytesSHA1->setCursorPosition(0); ui->bytesSHA1->setCursorPosition(0);
} }
@ -988,7 +985,7 @@ void MemoryWidget::showHexASCIIContextMenu(const QPoint &pt)
void MemoryWidget::on_actionDisplayOptions_triggered() void MemoryWidget::on_actionDisplayOptions_triggered()
{ {
auto dialog = new AsmOptionsDialog(main->core, this); auto dialog = new AsmOptionsDialog(core, this);
dialog->show(); dialog->show();
} }
@ -1070,10 +1067,12 @@ void MemoryWidget::showXrefsDialog()
QString ele = lastline.split(" ", QString::SkipEmptyParts)[0]; QString ele = lastline.split(" ", QString::SkipEmptyParts)[0];
if (ele.contains("0x")) if (ele.contains("0x"))
{ {
RVA addr = ele.toLongLong(0, 16); /*TODO FIXME
* RVA addr = ele.toLongLong(0, 16);
XrefsDialog *x = new XrefsDialog(this->main, this); XrefsDialog *x = new XrefsDialog(this->main, this);
x->fillRefsForAddress(addr, RAddressString(addr), false); x->fillRefsForAddress(addr, RAddressString(addr), false);
x->exec(); x->exec();
*/
} }
} }
@ -1196,7 +1195,8 @@ void MemoryWidget::on_actionSend_to_Notepad_triggered()
{ {
QTextCursor cursor = ui->disasTextEdit_2->textCursor(); QTextCursor cursor = ui->disasTextEdit_2->textCursor();
QString text = cursor.selectedText(); QString text = cursor.selectedText();
this->main->sendToNotepad(text); // TODO
// this->main->sendToNotepad(text);
} }
void MemoryWidget::on_actionDisasAdd_comment_triggered() void MemoryWidget::on_actionDisasAdd_comment_triggered()
@ -1204,7 +1204,7 @@ void MemoryWidget::on_actionDisasAdd_comment_triggered()
RVA offset = readCurrentDisassemblyOffset(); RVA offset = readCurrentDisassemblyOffset();
// Get function for clicked offset // Get function for clicked offset
RAnalFunction *fcn = this->main->core->functionAt(offset); RAnalFunction *fcn = this->core->functionAt(offset);
CommentsDialog *c = new CommentsDialog(this); CommentsDialog *c = new CommentsDialog(this);
if (c->exec()) if (c->exec())
{ {
@ -1212,16 +1212,16 @@ void MemoryWidget::on_actionDisasAdd_comment_triggered()
QString comment = c->getComment(); QString comment = c->getComment();
//this->main->add_debug_output("Comment: " + comment + " at: " + ele); //this->main->add_debug_output("Comment: " + comment + " at: " + ele);
// Rename function in r2 core // Rename function in r2 core
this->main->core->setComment(offset, comment); this->core->setComment(offset, comment);
// Seek to new renamed function // Seek to new renamed function
if (fcn) if (fcn)
{ {
this->main->seek(fcn->addr); core->seek(fcn->addr);
} }
// TODO: Refresh functions tree widget // TODO: Refresh functions tree widget
} }
this->main->refreshComments(); // this->main->refreshComments();
} }
@ -1229,16 +1229,17 @@ void MemoryWidget::on_actionAddFlag_triggered()
{ {
RVA offset = readCurrentDisassemblyOffset(); RVA offset = readCurrentDisassemblyOffset();
FlagDialog *dialog = new FlagDialog(main->core, offset, this); FlagDialog *dialog = new FlagDialog(core, offset, this);
if (dialog->exec()) if (dialog->exec())
{ {
//QString comment = dialog->getFlagName(); //QString comment = dialog->getFlagName();
// Rename function in r2 core // Rename function in r2 core
//this->main->core->setComment(offset, comment); //this->core->setComment(offset, comment);
} }
this->main->refreshComments(); // FIXME?
// this->main->refreshComments();
} }
void MemoryWidget::on_actionFunctionsRename_triggered() void MemoryWidget::on_actionFunctionsRename_triggered()
@ -1251,7 +1252,7 @@ void MemoryWidget::on_actionFunctionsRename_triggered()
if (ele.contains("0x")) if (ele.contains("0x"))
{ {
// Get function for clicked offset // Get function for clicked offset
RAnalFunction *fcn = this->main->core->functionAt(ele.toLongLong(0, 16)); RAnalFunction *fcn = this->core->functionAt(ele.toLongLong(0, 16));
RenameDialog *r = new RenameDialog(this); RenameDialog *r = new RenameDialog(this);
// Get function based on click position // Get function based on click position
r->setFunctionName(fcn->name); r->setFunctionName(fcn->name);
@ -1260,66 +1261,67 @@ void MemoryWidget::on_actionFunctionsRename_triggered()
// Get new function name // Get new function name
QString new_name = r->getFunctionName(); QString new_name = r->getFunctionName();
// Rename function in r2 core // Rename function in r2 core
this->main->core->renameFunction(fcn->name, new_name); this->core->renameFunction(fcn->name, new_name);
// Seek to new renamed function // Seek to new renamed function
this->main->seek(fcn->addr); this->core->seek(fcn->addr);
} }
} }
this->main->refreshFunctions(); // FIXME?
// this->main->refreshFunctions();
} }
void MemoryWidget::on_action8columns_triggered() void MemoryWidget::on_action8columns_triggered()
{ {
this->main->core->setConfig("hex.cols", 8); this->core->setConfig("hex.cols", 8);
this->refreshHexdump(); this->refreshHexdump();
} }
void MemoryWidget::on_action16columns_triggered() void MemoryWidget::on_action16columns_triggered()
{ {
this->main->core->setConfig("hex.cols", 16); this->core->setConfig("hex.cols", 16);
this->refreshHexdump(); this->refreshHexdump();
} }
void MemoryWidget::on_action4columns_triggered() void MemoryWidget::on_action4columns_triggered()
{ {
this->main->core->setConfig("hex.cols", 4); this->core->setConfig("hex.cols", 4);
this->refreshHexdump(); this->refreshHexdump();
} }
void MemoryWidget::on_action32columns_triggered() void MemoryWidget::on_action32columns_triggered()
{ {
this->main->core->setConfig("hex.cols", 32); this->core->setConfig("hex.cols", 32);
this->refreshHexdump(); this->refreshHexdump();
} }
void MemoryWidget::on_action64columns_triggered() void MemoryWidget::on_action64columns_triggered()
{ {
this->main->core->setConfig("hex.cols", 64); this->core->setConfig("hex.cols", 64);
this->refreshHexdump(); this->refreshHexdump();
} }
void MemoryWidget::on_action2columns_triggered() void MemoryWidget::on_action2columns_triggered()
{ {
this->main->core->setConfig("hex.cols", 2); this->core->setConfig("hex.cols", 2);
this->refreshHexdump(); this->refreshHexdump();
} }
void MemoryWidget::on_action1column_triggered() void MemoryWidget::on_action1column_triggered()
{ {
this->main->core->setConfig("hex.cols", 1); this->core->setConfig("hex.cols", 1);
this->refreshHexdump(); this->refreshHexdump();
} }
void MemoryWidget::on_xreFromTreeWidget_2_itemDoubleClicked(QTreeWidgetItem *item, int /*column*/) void MemoryWidget::on_xreFromTreeWidget_2_itemDoubleClicked(QTreeWidgetItem *item, int /*column*/)
{ {
XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>(); XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>();
this->main->seek(xref.to); this->core->seek(xref.to);
} }
void MemoryWidget::on_xrefToTreeWidget_2_itemDoubleClicked(QTreeWidgetItem *item, int /*column*/) void MemoryWidget::on_xrefToTreeWidget_2_itemDoubleClicked(QTreeWidgetItem *item, int /*column*/)
{ {
XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>(); XrefDescription xref = item->data(0, Qt::UserRole).value<XrefDescription>();
this->main->seek(xref.from); this->core->seek(xref.from);
} }
void MemoryWidget::on_xrefFromToolButton_2_clicked() void MemoryWidget::on_xrefFromToolButton_2_clicked()
@ -1367,10 +1369,10 @@ void MemoryWidget::on_codeCombo_2_currentTextChanged(const QString &arg1)
void MemoryWidget::get_refs_data(RVA addr) void MemoryWidget::get_refs_data(RVA addr)
{ {
// refs = calls q hace esa funcion // refs = calls q hace esa funcion
QList<XrefDescription> refs = main->core->getXRefs(addr, false, false); QList<XrefDescription> refs = core->getXRefs(addr, false, false);
// xrefs = calls a esa funcion // xrefs = calls a esa funcion
QList<XrefDescription> xrefs = main->core->getXRefs(addr, true, false); QList<XrefDescription> xrefs = core->getXRefs(addr, true, false);
// Data for the disasm side graph // Data for the disasm side graph
QList<int> data; QList<int> data;
@ -1378,13 +1380,13 @@ void MemoryWidget::get_refs_data(RVA addr)
data << refs.size(); data << refs.size();
//qDebug() << "XRefs:" << xrefs.size(); //qDebug() << "XRefs:" << xrefs.size();
data << xrefs.size(); data << xrefs.size();
//qDebug() << "CC: " << this->main->core->fcnCyclomaticComplexity(offset.toLong(&ok, 16)); //qDebug() << "CC: " << this->core->fcnCyclomaticComplexity(offset.toLong(&ok, 16));
//data << this->main->core->fcnCyclomaticComplexity(offset.toLong(&ok, 16)); //data << this->core->fcnCyclomaticComplexity(offset.toLong(&ok, 16));
data << this->main->core->getCycloComplex(addr); data << this->core->getCycloComplex(addr);
//qDebug() << "BB: " << this->main->core->fcnBasicBlockCount(offset.toLong(&ok, 16)); //qDebug() << "BB: " << this->core->fcnBasicBlockCount(offset.toLong(&ok, 16));
data << this->main->core->fcnBasicBlockCount(addr); data << this->core->fcnBasicBlockCount(addr);
data << this->main->core->fcnEndBbs(addr); data << this->core->fcnEndBbs(addr);
//qDebug() << "MEOW: " + this->main->core->fcnEndBbs(offset); //qDebug() << "MEOW: " + this->core->fcnEndBbs(offset);
// Update disasm side bar // Update disasm side bar
this->fill_refs(refs, xrefs, data); this->fill_refs(refs, xrefs, data);
@ -1398,9 +1400,9 @@ void MemoryWidget::fill_refs(QList<XrefDescription> refs, QList<XrefDescription>
XrefDescription xref = refs[i]; XrefDescription xref = refs[i];
QTreeWidgetItem *tempItem = new QTreeWidgetItem(); QTreeWidgetItem *tempItem = new QTreeWidgetItem();
tempItem->setText(0, RAddressString(xref.to)); tempItem->setText(0, RAddressString(xref.to));
tempItem->setText(1, main->core->disassembleSingleInstruction(xref.from)); tempItem->setText(1, core->disassembleSingleInstruction(xref.from));
tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref)); tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref));
QString tooltip = this->main->core->cmd("pdi 10 @ " + QString::number(xref.to)).trimmed(); QString tooltip = this->core->cmd("pdi 10 @ " + QString::number(xref.to)).trimmed();
tempItem->setToolTip(0, tooltip); tempItem->setToolTip(0, tooltip);
tempItem->setToolTip(1, tooltip); tempItem->setToolTip(1, tooltip);
this->xreFromTreeWidget_2->insertTopLevelItem(0, tempItem); this->xreFromTreeWidget_2->insertTopLevelItem(0, tempItem);
@ -1419,11 +1421,11 @@ void MemoryWidget::fill_refs(QList<XrefDescription> refs, QList<XrefDescription>
QTreeWidgetItem *tempItem = new QTreeWidgetItem(); QTreeWidgetItem *tempItem = new QTreeWidgetItem();
tempItem->setText(0, RAddressString(xref.from)); tempItem->setText(0, RAddressString(xref.from));
tempItem->setText(1, main->core->disassembleSingleInstruction(xref.from)); tempItem->setText(1, core->disassembleSingleInstruction(xref.from));
tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref)); tempItem->setData(0, Qt::UserRole, QVariant::fromValue(xref));
QString tooltip = this->main->core->cmd("pdi 10 @ " + QString::number(xref.from)).trimmed(); QString tooltip = this->core->cmd("pdi 10 @ " + QString::number(xref.from)).trimmed();
tempItem->setToolTip(0, this->main->core->cmd("pdi 10 @ " + tooltip).trimmed()); tempItem->setToolTip(0, this->core->cmd("pdi 10 @ " + tooltip).trimmed());
tempItem->setToolTip(1, this->main->core->cmd("pdi 10 @ " + tooltip).trimmed()); tempItem->setToolTip(1, this->core->cmd("pdi 10 @ " + tooltip).trimmed());
this->xrefToTreeWidget_2->insertTopLevelItem(0, tempItem); this->xrefToTreeWidget_2->insertTopLevelItem(0, tempItem);
} }
// Adjust columns to content // Adjust columns to content
@ -1463,7 +1465,7 @@ void MemoryWidget::fill_refs(QList<XrefDescription> refs, QList<XrefDescription>
void MemoryWidget::fillOffsetInfo(QString off) void MemoryWidget::fillOffsetInfo(QString off)
{ {
ui->offsetTreeWidget->clear(); ui->offsetTreeWidget->clear();
QString raw = this->main->core->getOffsetInfo(off); QString raw = this->core->getOffsetInfo(off);
QList<QString> lines = raw.split("\n", QString::SkipEmptyParts); QList<QString> lines = raw.split("\n", QString::SkipEmptyParts);
foreach (QString line, lines) foreach (QString line, lines)
{ {
@ -1482,7 +1484,7 @@ void MemoryWidget::fillOffsetInfo(QString off)
} }
// Add opcode description // Add opcode description
QStringList description = this->main->core->cmd("?d. @ " + off).split(": "); QStringList description = this->core->cmd("?d. @ " + off).split(": ");
if (description.length() >= 2) if (description.length() >= 2)
{ {
ui->opcodeDescText->setPlainText("# " + description[0] + ":\n" + description[1]); ui->opcodeDescText->setPlainText("# " + description[0] + ":\n" + description[1]);
@ -1491,7 +1493,7 @@ void MemoryWidget::fillOffsetInfo(QString off)
QString MemoryWidget::normalize_addr(QString addr) QString MemoryWidget::normalize_addr(QString addr)
{ {
QString base = this->main->core->cmd("s").split("0x")[1].trimmed(); QString base = this->core->cmd("s").split("0x")[1].trimmed();
int len = base.length(); int len = base.length();
if (len < 8) if (len < 8)
{ {
@ -1512,15 +1514,15 @@ void MemoryWidget::setFcnName(RVA addr)
RAnalFunction *fcn; RAnalFunction *fcn;
QString addr_string; QString addr_string;
fcn = this->main->core->functionAt(addr); fcn = this->core->functionAt(addr);
if (fcn) if (fcn)
{ {
QString segment = this->main->core->cmd("S. @ " + QString::number(addr)).split(" ").last(); QString segment = this->core->cmd("S. @ " + QString::number(addr)).split(" ").last();
addr_string = segment.trimmed() + ":" + fcn->name; addr_string = segment.trimmed() + ":" + fcn->name;
} }
else else
{ {
addr_string = main->core->cmdFunctionAt(addr); addr_string = core->cmdFunctionAt(addr);
} }
ui->fcnNameEdit->setText(addr_string); ui->fcnNameEdit->setText(addr_string);
@ -1541,12 +1543,13 @@ void MemoryWidget::on_disasTextEdit_2_cursorPositionChanged()
if (ele.contains("0x")) if (ele.contains("0x"))
{ {
this->fillOffsetInfo(ele); this->fillOffsetInfo(ele);
QString at = this->main->core->cmdFunctionAt(ele); QString at = this->core->cmdFunctionAt(ele);
QString deco = this->main->core->getDecompiledCode(at); QString deco = this->core->getDecompiledCode(at);
RVA addr = ele.midRef(2).toULongLong(0, 16); RVA addr = ele.midRef(2).toULongLong(0, 16);
this->main->setCursorAddress(addr); // FIXME per widget CursorAddress no?
// this->main->setCursorAddress(addr);
if (deco != "") if (deco != "")
{ {
@ -1557,11 +1560,11 @@ void MemoryWidget::on_disasTextEdit_2_cursorPositionChanged()
ui->decoTextEdit->setPlainText(""); ui->decoTextEdit->setPlainText("");
} }
// Get jump information to fill the preview // Get jump information to fill the preview
QString jump = this->main->core->getOffsetJump(ele); QString jump = this->core->getOffsetJump(ele);
if (!jump.isEmpty()) if (!jump.isEmpty())
{ {
// Fill the preview // Fill the preview
QString jump_code = this->main->core->cmd("pdf @ " + jump); QString jump_code = this->core->cmd("pdf @ " + jump);
ui->previewTextEdit->setPlainText(jump_code.trimmed()); ui->previewTextEdit->setPlainText(jump_code.trimmed());
ui->previewTextEdit->moveCursor(QTextCursor::End); ui->previewTextEdit->moveCursor(QTextCursor::End);
ui->previewTextEdit->find(jump.trimmed(), QTextDocument::FindBackward); ui->previewTextEdit->find(jump.trimmed(), QTextDocument::FindBackward);
@ -1578,7 +1581,8 @@ void MemoryWidget::on_disasTextEdit_2_cursorPositionChanged()
//this->main->add_debug_output("New Fcn: '" + this->last_fcn + "'"); //this->main->add_debug_output("New Fcn: '" + this->last_fcn + "'");
// Refresh function information at sidebar // Refresh function information at sidebar
ui->fcnNameEdit->setText(at); ui->fcnNameEdit->setText(at);
this->main->memoryDock->setWindowTitle(at); // FIXME TITLE?
// this->main->memoryDock->setWindowTitle(at);
//this->main->memoryDock->create_graph(ele); //this->main->memoryDock->create_graph(ele);
this->setMiniGraph(at); this->setMiniGraph(at);
} }
@ -1605,8 +1609,8 @@ QString MemoryWidget::normalizeAddr(QString addr)
void MemoryWidget::setMiniGraph(QString at) void MemoryWidget::setMiniGraph(QString at)
{ {
QString dot = this->main->core->getSimpleGraph(at); QString dot = this->core->getSimpleGraph(at);
//QString dot = this->main->core->cmd("agc " + at); //QString dot = this->core->cmd("agc " + at);
// Add data to HTML Polar functions graph // Add data to HTML Polar functions graph
QFile html(":/html/graph.html"); QFile html(":/html/graph.html");
if (!html.open(QIODevice::ReadOnly)) if (!html.open(QIODevice::ReadOnly))
@ -1698,6 +1702,8 @@ void MemoryWidget::on_previewToolButton_2_clicked()
void MemoryWidget::resizeEvent(QResizeEvent *event) void MemoryWidget::resizeEvent(QResizeEvent *event)
{ {
// FIXME
/*
if (main->responsive && isVisible()) if (main->responsive && isVisible())
{ {
if (event->size().width() <= 1150) if (event->size().width() <= 1150)
@ -1725,6 +1731,7 @@ void MemoryWidget::resizeEvent(QResizeEvent *event)
ui->previewToolButton_2->setChecked(true); ui->previewToolButton_2->setChecked(true);
} }
} }
*/
QDockWidget::resizeEvent(event); QDockWidget::resizeEvent(event);
} }
@ -1741,22 +1748,22 @@ bool MemoryWidget::eventFilter(QObject *obj, QEvent *event)
QString ele = eles.isEmpty() ? "" : eles[0]; QString ele = eles.isEmpty() ? "" : eles[0];
if (ele.contains("0x")) if (ele.contains("0x"))
{ {
QString jump = this->main->core->getOffsetJump(ele); QString jump = this->core->getOffsetJump(ele);
if (!jump.isEmpty()) if (!jump.isEmpty())
{ {
if (jump.contains("0x")) if (jump.contains("0x"))
{ {
QString fcn = this->main->core->cmdFunctionAt(jump); QString fcn = this->core->cmdFunctionAt(jump);
if (!fcn.isEmpty()) if (!fcn.isEmpty())
{ {
RVA addr = jump.trimmed().toULongLong(0, 16); RVA addr = jump.trimmed().toULongLong(0, 16);
this->main->seek(addr); this->core->seek(addr);
} }
} }
else else
{ {
RVA addr = this->main->core->cmd("?v " + jump).toULongLong(0, 16); RVA addr = this->core->cmd("?v " + jump).toULongLong(0, 16);
this->main->seek(addr); this->core->seek(addr);
} }
} }
} }
@ -1781,7 +1788,8 @@ void MemoryWidget::on_copyMD5_clicked()
QString md5 = ui->bytesMD5->text(); QString md5 = ui->bytesMD5->text();
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(md5); clipboard->setText(md5);
this->main->addOutput("MD5 copied to clipboard: " + md5); // FIXME
// this->main->addOutput("MD5 copied to clipboard: " + md5);
} }
void MemoryWidget::on_copySHA1_clicked() void MemoryWidget::on_copySHA1_clicked()
@ -1789,7 +1797,8 @@ void MemoryWidget::on_copySHA1_clicked()
QString sha1 = ui->bytesSHA1->text(); QString sha1 = ui->bytesSHA1->text();
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(sha1); clipboard->setText(sha1);
this->main->addOutput("SHA1 copied to clipboard: " + sha1); // FIXME
// this->main->addOutput("SHA1 copied to clipboard: " + sha1);
} }
void MemoryWidget::switchTheme(bool dark) void MemoryWidget::switchTheme(bool dark)
@ -1807,8 +1816,8 @@ void MemoryWidget::switchTheme(bool dark)
void MemoryWidget::selectHexPreview() void MemoryWidget::selectHexPreview()
{ {
// Pre-select arch and bits in the hexdump sidebar // Pre-select arch and bits in the hexdump sidebar
QString arch = this->main->core->cmd("e asm.arch").trimmed(); QString arch = this->core->cmd("e asm.arch").trimmed();
QString bits = this->main->core->cmd("e asm.bits").trimmed(); QString bits = this->core->cmd("e asm.bits").trimmed();
//int arch_index = ui->hexArchComboBox_2->findText(arch); //int arch_index = ui->hexArchComboBox_2->findText(arch);
if (ui->hexArchComboBox_2->findText(arch) != -1) if (ui->hexArchComboBox_2->findText(arch) != -1)
@ -1826,7 +1835,8 @@ void MemoryWidget::selectHexPreview()
void MemoryWidget::seek_back() void MemoryWidget::seek_back()
{ {
//this->main->add_debug_output("Back!"); //this->main->add_debug_output("Back!");
this->main->backButton_clicked(); // FIXME
// this->main->backButton_clicked();
} }
void MemoryWidget::on_memTabWidget_currentChanged(int /*index*/) void MemoryWidget::on_memTabWidget_currentChanged(int /*index*/)
@ -1844,9 +1854,12 @@ void MemoryWidget::updateViews(RVA offset)
int index = ui->memTabWidget->tabBar()->currentIndex(); int index = ui->memTabWidget->tabBar()->currentIndex();
RVA cursor_addr = main->getCursorAddress(); // Anyway updateViews will die after break this widget.
// FIXME? One cursor per widget ? (if not synced)
QString cursor_addr_string = RAddressString(cursor_addr); // RVA cursor_addr = main->getCursorAddress();
// QString cursor_addr_string = RAddressString(cursor_addr);
QString cursor_addr_string = core->cmd("s");
RVA cursor_addr = cursor_addr_string.toULongLong();
if (offset != RVA_INVALID) if (offset != RVA_INVALID)
next_disasm_top_offset = offset; next_disasm_top_offset = offset;
@ -1873,11 +1886,11 @@ void MemoryWidget::showOffsets(bool show)
if (show) if (show)
{ {
this->hexOffsetText->show(); this->hexOffsetText->show();
main->core->setConfig("asm.offset", 1); core->setConfig("asm.offset", 1);
} }
else else
{ {
this->hexOffsetText->hide(); this->hexOffsetText->hide();
main->core->setConfig("asm.offset", 0); core->setConfig("asm.offset", 0);
} }
} }

View File

@ -18,7 +18,6 @@
#include "Dashboard.h" #include "Dashboard.h"
#include "widgets/DisassemblerGraphView.h" #include "widgets/DisassemblerGraphView.h"
class MainWindow;
namespace Ui namespace Ui
{ {
@ -30,14 +29,13 @@ class MemoryWidget : public DockWidget
Q_OBJECT Q_OBJECT
public: public:
explicit MemoryWidget(MainWindow *main); explicit MemoryWidget();
~MemoryWidget(); ~MemoryWidget();
void setup() override; void setup() override;
void refresh() override; void refresh() override;
MainWindow *main;
QPlainTextEdit *disasTextEdit; QPlainTextEdit *disasTextEdit;
QTextEdit *hexOffsetText; QTextEdit *hexOffsetText;
QPlainTextEdit *hexDisasTextEdit; QPlainTextEdit *hexDisasTextEdit;
@ -96,6 +94,7 @@ protected:
private: private:
std::unique_ptr<Ui::MemoryWidget> ui; std::unique_ptr<Ui::MemoryWidget> ui;
CutterCore *core;
ut64 hexdumpTopOffset; ut64 hexdumpTopOffset;
ut64 hexdumpBottomOffset; ut64 hexdumpBottomOffset;

View File

@ -180,7 +180,7 @@ void Notepad::on_redoButton_clicked()
void Notepad::highlightPreview() void Notepad::highlightPreview()
{ {
disasm_highlighter = new Highlighter(this->main, ui->previewTextEdit->document()); disasm_highlighter = new Highlighter(ui->previewTextEdit->document());
} }
void Notepad::on_searchEdit_returnPressed() void Notepad::on_searchEdit_returnPressed()
@ -337,25 +337,25 @@ void Notepad::showNotepadContextMenu(const QPoint &pt)
void Notepad::on_actionDisassmble_bytes_triggered() void Notepad::on_actionDisassmble_bytes_triggered()
{ {
ui->previewTextEdit->setPlainText(this->main->core->cmd("pd 100 @ " + this->addr)); ui->previewTextEdit->setPlainText(CutterCore::getInstance()->cmd("pd 100 @ " + this->addr));
} }
void Notepad::on_actionDisassmble_function_triggered() void Notepad::on_actionDisassmble_function_triggered()
{ {
ui->previewTextEdit->setPlainText(this->main->core->cmd("pdf @ " + this->addr)); ui->previewTextEdit->setPlainText(CutterCore::getInstance()->cmd("pdf @ " + this->addr));
} }
void Notepad::on_actionHexdump_bytes_triggered() void Notepad::on_actionHexdump_bytes_triggered()
{ {
ui->previewTextEdit->setPlainText(this->main->core->cmd("px 1024 @ " + this->addr)); ui->previewTextEdit->setPlainText(CutterCore::getInstance()->cmd("px 1024 @ " + this->addr));
} }
void Notepad::on_actionCompact_Hexdump_triggered() void Notepad::on_actionCompact_Hexdump_triggered()
{ {
ui->previewTextEdit->setPlainText(this->main->core->cmd("pxi 1024 @ " + this->addr)); ui->previewTextEdit->setPlainText(CutterCore::getInstance()->cmd("pxi 1024 @ " + this->addr));
} }
void Notepad::on_actionHexdump_function_triggered() void Notepad::on_actionHexdump_function_triggered()
{ {
ui->previewTextEdit->setPlainText(this->main->core->cmd("pxf @ " + this->addr)); ui->previewTextEdit->setPlainText(CutterCore::getInstance()->cmd("pxf @ " + this->addr));
} }

View File

@ -174,9 +174,9 @@ void Omnibar::on_gotoEntry_returnPressed()
} }
else else
{ {
//this->main->seek(this->main->core->cmd("?v " + this->text()), this->text()); //CutterCore::getInstance()->seek(CutterCore::getInstance()->cmd("?v " + this->text()), this->text());
QString off = this->main->core->cmd("afo " + this->text()); QString off = CutterCore::getInstance()->cmd("afo " + this->text());
this->main->seek(off.trimmed().toInt()); CutterCore::getInstance()->seek(off.trimmed().toInt());
} }
} }

View File

@ -37,14 +37,14 @@ void RelocsWidget::on_relocsTreeWidget_itemDoubleClicked(QTreeWidgetItem *item,
// Get offset and name of item double clicked // Get offset and name of item double clicked
RelocDescription reloc = item->data(0, Qt::UserRole).value<RelocDescription>(); RelocDescription reloc = item->data(0, Qt::UserRole).value<RelocDescription>();
main->seek(reloc.vaddr); CutterCore::getInstance()->seek(reloc.vaddr);
} }
void RelocsWidget::fillTreeWidget() void RelocsWidget::fillTreeWidget()
{ {
ui->relocsTreeWidget->clear(); ui->relocsTreeWidget->clear();
for (auto i : main->core->getAllRelocs()) for (auto i : CutterCore::getInstance()->getAllRelocs())
{ {
QTreeWidgetItem *item = qhelpers::appendRow(ui->relocsTreeWidget, RAddressString(i.vaddr), i.type, i.name); QTreeWidgetItem *item = qhelpers::appendRow(ui->relocsTreeWidget, RAddressString(i.vaddr), i.type, i.name);
item->setData(0, Qt::UserRole, QVariant::fromValue(i)); item->setData(0, Qt::UserRole, QVariant::fromValue(i));

View File

@ -27,19 +27,19 @@ void SdbDock::reload(QString path)
ui->treeWidget->clear(); ui->treeWidget->clear();
QList<QString> keys; QList<QString> keys;
/* key-values */ /* key-values */
keys = main->core->sdbListKeys(path); keys = CutterCore::getInstance()->sdbListKeys(path);
foreach (QString key, keys) foreach (QString key, keys)
{ {
QTreeWidgetItem *tempItem = new QTreeWidgetItem(); QTreeWidgetItem *tempItem = new QTreeWidgetItem();
tempItem->setText(0, key); tempItem->setText(0, key);
tempItem->setText(1, main->core->sdbGet(path, key)); tempItem->setText(1, CutterCore::getInstance()->sdbGet(path, key));
tempItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable); tempItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable);
ui->treeWidget->insertTopLevelItem(0, tempItem); ui->treeWidget->insertTopLevelItem(0, tempItem);
} }
ui->treeWidget->resizeColumnToContents(0); ui->treeWidget->resizeColumnToContents(0);
ui->treeWidget->resizeColumnToContents(1); ui->treeWidget->resizeColumnToContents(1);
/* namespaces */ /* namespaces */
keys = main->core->sdbList(path); keys = CutterCore::getInstance()->sdbList(path);
keys.append(".."); keys.append("..");
foreach (QString key, keys) foreach (QString key, keys)
{ {

View File

@ -24,7 +24,7 @@ void SectionsWidget::setup()
tree->clear(); tree->clear();
int row = 0; int row = 0;
for (auto section : main->core->getAllSections()) for (auto section : CutterCore::getInstance()->getAllSections())
{ {
if (!section.name.contains(".")) if (!section.name.contains("."))
continue; continue;

View File

@ -93,17 +93,17 @@ void SideBar::on_themesButton_clicked()
void SideBar::on_calcInput_textChanged(const QString &arg1) void SideBar::on_calcInput_textChanged(const QString &arg1)
{ {
ui->calcOutput->setText(QString::number(this->main->core->math(arg1))); ui->calcOutput->setText(QString::number(CutterCore::getInstance()->math(arg1)));
} }
void SideBar::on_asm2hex_clicked() void SideBar::on_asm2hex_clicked()
{ {
ui->hexInput->setPlainText(main->core->assemble(ui->asmInput->toPlainText())); ui->hexInput->setPlainText(CutterCore::getInstance()->assemble(ui->asmInput->toPlainText()));
} }
void SideBar::on_hex2asm_clicked() void SideBar::on_hex2asm_clicked()
{ {
ui->asmInput->setPlainText(main->core->disassemble(ui->hexInput->toPlainText())); ui->asmInput->setPlainText(CutterCore::getInstance()->disassemble(ui->hexInput->toPlainText()));
} }
void SideBar::on_respButton_toggled(bool checked) void SideBar::on_respButton_toggled(bool checked)

View File

@ -38,13 +38,13 @@ void StringsWidget::on_stringsTreeWidget_itemDoubleClicked(QTreeWidgetItem *item
// Get offset and name of item double clicked // Get offset and name of item double clicked
// TODO: use this info to change disasm contents // TODO: use this info to change disasm contents
StringDescription str = item->data(0, Qt::UserRole).value<StringDescription>(); StringDescription str = item->data(0, Qt::UserRole).value<StringDescription>();
this->main->seek(str.vaddr); CutterCore::getInstance()->seek(str.vaddr);
} }
void StringsWidget::fillTreeWidget() void StringsWidget::fillTreeWidget()
{ {
ui->stringsTreeWidget->clear(); ui->stringsTreeWidget->clear();
for (auto i : main->core->getAllStrings()) for (auto i : CutterCore::getInstance()->getAllStrings())
{ {
QTreeWidgetItem *item = qhelpers::appendRow(ui->stringsTreeWidget, RAddressString(i.vaddr), i.string); QTreeWidgetItem *item = qhelpers::appendRow(ui->stringsTreeWidget, RAddressString(i.vaddr), i.string);
item->setData(0, Qt::UserRole, QVariant::fromValue(i)); item->setData(0, Qt::UserRole, QVariant::fromValue(i));

View File

@ -7,10 +7,9 @@
#include <QTreeWidget> #include <QTreeWidget>
SymbolsWidget::SymbolsWidget(MainWindow *main, QWidget *parent) : SymbolsWidget::SymbolsWidget(QWidget *parent) :
DockWidget(parent), DockWidget(parent),
ui(new Ui::SymbolsWidget), ui(new Ui::SymbolsWidget)
main(main)
{ {
ui->setupUi(this); ui->setupUi(this);
@ -37,13 +36,13 @@ void SymbolsWidget::on_symbolsTreeWidget_itemDoubleClicked(QTreeWidgetItem *item
// Get offset and name of item double clicked // Get offset and name of item double clicked
SymbolDescription symbol = item->data(0, Qt::UserRole).value<SymbolDescription>(); SymbolDescription symbol = item->data(0, Qt::UserRole).value<SymbolDescription>();
this->main->seek(symbol.vaddr); CutterCore::getInstance()->seek(symbol.vaddr);
} }
void SymbolsWidget::fillSymbols() void SymbolsWidget::fillSymbols()
{ {
ui->symbolsTreeWidget->clear(); ui->symbolsTreeWidget->clear();
for (auto symbol : this->main->core->getAllSymbols()) for (auto symbol : CutterCore::getInstance()->getAllSymbols())
{ {
QTreeWidgetItem *item = qhelpers::appendRow(ui->symbolsTreeWidget, QTreeWidgetItem *item = qhelpers::appendRow(ui->symbolsTreeWidget,
RAddressString(symbol.vaddr), RAddressString(symbol.vaddr),

View File

@ -17,7 +17,7 @@ class SymbolsWidget : public DockWidget
Q_OBJECT Q_OBJECT
public: public:
explicit SymbolsWidget(MainWindow *main, QWidget *parent = 0); explicit SymbolsWidget(QWidget *parent = 0);
~SymbolsWidget(); ~SymbolsWidget();
void setup() override; void setup() override;
@ -29,7 +29,6 @@ private slots:
private: private:
std::unique_ptr<Ui::SymbolsWidget> ui; std::unique_ptr<Ui::SymbolsWidget> ui;
MainWindow *main;
void fillSymbols(); void fillSymbols();
void setScrollMode(); void setScrollMode();