]> git.siccegge.de Git - frida/frida.git/blobdiff - src/gui/Mainwindow.cxx
PoC: Add menu item to load script
[frida/frida.git] / src / gui / Mainwindow.cxx
index 3b805d50a68db966cd4a3d7e922a562f2a9c8bc5..9d8e45f66e5f69749e06223d96e620e6be761bec 100644 (file)
@@ -1,9 +1,11 @@
 #include "Mainwindow.hxx"
 #include "qt.hxx"
+#include "bindings/Guile.hxx"
 #include "disassembler/llvm/LLVMDisassembler.hxx"
 #include "core/Function.hxx"
 #include "core/BasicBlock.hxx"
 #include "core/InformationManager.hxx"
+#include "core/events/RenameFunctionEvent.hxx"
 #include "widgets/ScriptingDock.hxx"
 #include "widgets/CFGScene.hxx"
 #include "widgets/FunctionWidget.hxx"
@@ -24,28 +26,47 @@ Mainwindow::Mainwindow(InformationManager* mgr)
        : manager(mgr)
        , logger(log4cxx::Logger::getLogger("Mainwindow")) {
        openAction = new QAction(tr("&Open"), this);
+       loadAction = new QAction(tr("&Load"), this);
        saveAction = new QAction(tr("&Save"), this);
        exitAction = new QAction(tr("E&xit"), this);
 
-       connect(openAction, SIGNAL(triggered()),
-               this, SLOT(open()));
-       connect(saveAction, SIGNAL(triggered()),
-               this, SLOT(save()));
-       connect(exitAction, SIGNAL(triggered()),
-               qApp, SLOT(quit()));
+       connect(openAction, &QAction::triggered,
+               this, &Mainwindow::open);
+       connect(loadAction, &QAction::triggered,
+               this, &Mainwindow::load);
+       connect(saveAction, &QAction::triggered,
+               this, &Mainwindow::save);
+       connect(exitAction, &QAction::triggered,
+               qApp, &QApplication::quit);
 
        fileMenu = menuBar()->addMenu(tr("&File"));
        fileMenu->addAction(openAction);
+       fileMenu->addAction(loadAction);
        fileMenu->addAction(saveAction);
        fileMenu->addSeparator();
        fileMenu->addAction(exitAction);
 
-       scripting = new ScriptingDock(tr("Scripting"), this);
+       QMenu* interpretermenu = menuBar()->addMenu(tr("&Interpreter"));
+
+       interpreter["GUILE"] = new GuileInterpreter;
+       scripting = new ScriptingDock(interpreter["GUILE"], tr("Scripting"), this);
        scripting->setAllowedAreas(Qt::BottomDockWidgetArea);
        addDockWidget(Qt::BottomDockWidgetArea, scripting);
+       QAction* guileLoad = new QAction(tr("&GUILE"), this);
+       interpretermenu->addAction(guileLoad);
+       connect(guileLoad, &QAction::triggered,
+               [&]() {
+                       QString fileName = QFileDialog::getOpenFileName(this, tr("Open Script"), "",
+                                                                       tr("Binaries") + " (*." +
+                                                                       interpreter["GUILE"]->fileExtension().c_str() + ")");
+                       std::stringstream a, b;
+                       std::string c;
+                       interpreter["GUILE"]->loadFile(fileName.toStdString(), a, b, c);
+               });
 
        listWidget = new QTreeWidget();
        listWidget->setColumnCount(1);
+       listWidget->setDragDropMode(QAbstractItemView::InternalMove);
        listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
        connect(listWidget, SIGNAL(customContextMenuRequested(const QPoint&)),
                this, SLOT(showListContextMenu(const QPoint&)));
@@ -73,6 +94,12 @@ Mainwindow::Mainwindow(InformationManager* mgr)
                        auto item = new QTreeWidgetItem(external, QStringList(name.c_str()));
                        item->setBackground(0, QBrush(QColor(0xff, 0xdd, 0xdd)));
                });
+       mgr->connect_rename_function_signal([&](RenameFunctionEvent* event) {
+                       if (objects_list_by_address.find(event->address) == objects_list_by_address.end())
+                               return;
+                       auto item = objects_list_by_address[event->address];
+                       if (item) item->setText(0, event->new_name.c_str());
+               });
        setGlobalHotkeys();
 }
 
@@ -101,13 +128,18 @@ void Mainwindow::quit()
 void Mainwindow::open() {
        QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
                                                        tr("Binaries (*)"));
-
        manager->reset(fileName.toStdString());
 }
 
+void Mainwindow::load() {
+       QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
+                                                       tr("Frida Archives (*.frida)"));
+       manager->load(fileName.toStdString());
+}
+
 void Mainwindow::save() {
        QString filename = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("Frida Archives (*.frida)"));
-       manager->save(filename);
+       manager->save(filename.toStdString());
 }
 
 void Mainwindow::switchMainPlaneToAddress(uint64_t address) {
@@ -198,7 +230,6 @@ void Mainwindow::renameFunction(Function* function) {
                LOG4CXX_DEBUG(logger, "renaming Function " << function->getName()
                              << " to " << dialog.result().toStdString());
                function->setName(dialog.result().toStdString());
-               objects_list_by_address[function->getStartAddress()]->setText(0, dialog.result());
        } else {
                LOG4CXX_DEBUG(logger, "renameFunction aborted");
        }
@@ -235,8 +266,9 @@ void Mainwindow::addFunction(Function* fun) {
                        start_address = b.first;
        }
 
+       std::map<uint64_t, BasicBlockWidget*> _blocks;
        local__add_basic_block(block, this,
-                              manager, blocks, scene, start_address, 100);
+                              manager, _blocks, scene, start_address, 100);
 
        QGraphicsView * view = new QGraphicsView(scene);
        w->addTab(view, "CFG");