#include "core/BasicBlock.hxx"
#include "core/InformationManager.hxx"
#include "core/events/RenameFunctionEvent.hxx"
+
+#include "widgets/FridaDock.hxx"
+#include "widgets/LogDock.hxx"
#include "widgets/ScriptingDock.hxx"
#include "widgets/CFGScene.hxx"
#include "widgets/FunctionWidget.hxx"
#include <sstream>
-namespace {
- BasicBlockWidget *
- local__add_basic_block(BasicBlock * block,
- Mainwindow * mainwindow, InformationManager * manager,
- std::map<uint64_t, BasicBlockWidget*>& known_blocks,
- CFGScene * scene, uint64_t starty, uint64_t startx);
-}
-
Mainwindow::Mainwindow(InformationManager* mgr)
: manager(mgr)
- , logger(log4cxx::Logger::getLogger("Mainwindow")) {
+ , logger(log4cxx::Logger::getLogger("gui.Mainwindow")) {
openAction = new QAction(tr("&Open"), this);
loadAction = new QAction(tr("&Load"), this);
saveAction = new QAction(tr("&Save"), this);
fileMenu->addSeparator();
fileMenu->addAction(exitAction);
- scripting = new ScriptingDock(new GuileInterpreter, tr("Scripting"), this);
- scripting->setAllowedAreas(Qt::BottomDockWidgetArea);
- addDockWidget(Qt::BottomDockWidgetArea, scripting);
+ QMenu* interpretermenu = menuBar()->addMenu(tr("&Interpreter"));
+
+ QPluginLoader* loader = new QPluginLoader("libguilePlugin", this);
+ if (!loader->load())
+ LOG4CXX_ERROR(logger, "Loading plugin failed: " << loader->errorString().toStdString());
+ interpreter["GUILE"] = qobject_cast<Interpreter*>(loader->instance());
+ fdock = new FridaDock(tr("Frida Dock"), this);
+
+ fdock->addTab(new LogDock(fdock), "Log");
+
+ fdock->addTab(new ScriptingDock(interpreter["GUILE"], fdock), "guile");
+ fdock->setAllowedAreas(Qt::BottomDockWidgetArea);
+ addDockWidget(Qt::BottomDockWidgetArea, fdock);
+ 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);
functions.insert(std::make_pair(fun->getStartAddress(), fun));
- FunctionWidget * w = new FunctionWidget(fun);
-
- // CFG
- CFGScene * scene = new CFGScene;
-
- BasicBlock * block = manager->getBasicBlock(fun->getStartAddress());
-
- uint64_t start_address(std::numeric_limits<uint64_t>::max());
- for (auto b : fun->blocks()) {
- if (b.first < start_address)
- start_address = b.first;
- }
-
- std::map<uint64_t, BasicBlockWidget*> _blocks;
- local__add_basic_block(block, this,
- manager, _blocks, scene, start_address, 100);
-
- QGraphicsView * view = new QGraphicsView(scene);
- w->addTab(view, "CFG");
-
- // Listing
- QTableWidget * t = new QTableWidget();
- t->setColumnCount(3);
- t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
-
- w->addTab(t, "Listing");
+ FunctionWidget * w = new FunctionWidget(fun, this);
QTreeWidgetItem * item = new QTreeWidgetItem(listWidget, QStringList(fun->getName().c_str()));
stackedWidget->addWidget(w);
<< fun->getStartAddress());
objects_list_by_address.insert(std::make_pair(fun->getStartAddress(), item));
}
-
-namespace {
- BasicBlockWidget *
- local__add_basic_block(BasicBlock * block,
- Mainwindow * mainwindow, InformationManager * manager,
- std::map<uint64_t, BasicBlockWidget*>& known_blocks,
- CFGScene * scene, uint64_t starty, uint64_t startx) {
-
- decltype(known_blocks.begin()) old;
- if ((old = known_blocks.find(block->getStartAddress())) != known_blocks.end())
- return old->second;
-
- std::stringstream s;
- s << "BLOCK_" << std::hex << block->getStartAddress()
- << "_" << block->getEndAddress();
- BasicBlockWidget * widget = new BasicBlockWidget(s.str().c_str(),
- block, mainwindow);
-
- known_blocks.insert(std::make_pair(block->getStartAddress(), widget));
-
- scene->addItem(widget);
- widget->setFlag(QGraphicsItem::ItemIsMovable, true);
- widget->moveBy(100*startx, block->getStartAddress() - starty);
-
- manager->getDisassembler()
- ->printEachInstruction(block->getStartAddress(),
- block->getEndAddress(),
- [&](uint8_t* bytes,
- size_t byte_count,
- const std::string& line,
- const std::string& ref) {
- widget->addItem(bytes, byte_count,
- line.c_str() + 1, // remove \t
- ref.c_str());
- });
-
- BasicBlockWidget *tmp, *nextl(NULL), *nextr(NULL);
- BasicBlock * tmpblock;
- if (block->getNextBlock(0) != 0) {
- int xshift = 0;
- if (block->getNextBlock(1) != 0)
- xshift = 1;
- tmpblock = manager->getBasicBlock(block->getNextBlock(0));
- tmp = local__add_basic_block(tmpblock, mainwindow, manager,
- known_blocks,
- scene, starty, startx+xshift);
- nextl = tmp;
- tmp->addPrevious(widget);
- }
- if (block->getNextBlock(1) != 0) {
- tmpblock = manager->getBasicBlock(block->getNextBlock(1));
- tmp = local__add_basic_block(tmpblock, mainwindow, manager,
- known_blocks,
- scene, starty, startx-1);
- nextr = tmp;
- tmp->addPrevious(widget);
- }
- widget->addNext(nextl, nextr);
- return widget;
- }
-}