X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fgui%2FMainwindow.cxx;h=5fd57aa74a404157b2603b2d09ba7ba72e3a320c;hp=c00c8f83637950f55cdf8009eb4c633a460b8999;hb=9e283567ac56a6433e832d0fa38cf534a0cb8f9f;hpb=9f0c6d8fbed0f25248f28acced4c7372dd259d7a diff --git a/src/gui/Mainwindow.cxx b/src/gui/Mainwindow.cxx index c00c8f8..5fd57aa 100644 --- a/src/gui/Mainwindow.cxx +++ b/src/gui/Mainwindow.cxx @@ -2,81 +2,113 @@ #include "qt.hxx" #include "disassembler/llvm/LLVMDisassembler.hxx" +#include "widgets/CFGScene.hxx" + #include #include #include #include -Mainwindow::Mainwindow(const std::string& filename) -{ - openAction = new QAction(tr("&Open"), 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())); - - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(openAction); - // fileMenu->addAction(saveAction); - fileMenu->addSeparator(); - fileMenu->addAction(exitAction); - - scripting = new ScriptingDock(tr("Scripting"), this); - scripting->setAllowedAreas(Qt::BottomDockWidgetArea); - addDockWidget(Qt::BottomDockWidgetArea, scripting); - - listWidget = new QListWidget(); - stackedWidget = new QStackedWidget(); - dockWidget = new QDockWidget(tr("Functions"), this); - dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | - Qt::RightDockWidgetArea); - dockWidget->setWidget(listWidget); - addDockWidget(Qt::LeftDockWidgetArea, dockWidget); - setCentralWidget(stackedWidget); - - connect(listWidget, SIGNAL(currentRowChanged(int)), - stackedWidget, SLOT(setCurrentIndex(int))); - - setWindowTitle(tr("FRIDA")); - - openBinary(filename); +namespace { + BasicBlockWidget * + local__add_basic_block(BasicBlock * block, Disassembler * dis, + std::map& known_blocks, + CFGScene * scene, uint64_t starty, uint64_t startx); +} + +Mainwindow::Mainwindow(InformationManager* mgr) + : manager(mgr) { + openAction = new QAction(tr("&Open"), 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())); + + fileMenu = menuBar()->addMenu(tr("&File")); + fileMenu->addAction(openAction); + // fileMenu->addAction(saveAction); + fileMenu->addSeparator(); + fileMenu->addAction(exitAction); + + scripting = new ScriptingDock(tr("Scripting"), this); + scripting->setAllowedAreas(Qt::BottomDockWidgetArea); + addDockWidget(Qt::BottomDockWidgetArea, scripting); + + listWidget = new QListWidget(); + stackedWidget = new QStackedWidget(); + dockWidget = new QDockWidget(tr("Functions"), this); + dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | + Qt::RightDockWidgetArea); + dockWidget->setWidget(listWidget); + addDockWidget(Qt::LeftDockWidgetArea, dockWidget); + setCentralWidget(stackedWidget); + + connect(listWidget, SIGNAL(currentRowChanged(int)), + stackedWidget, SLOT(setCurrentIndex(int))); + + setWindowTitle(tr("FRIDA")); + + mgr->connect_new_function_signal([&] (Function* fun) {addFunction(fun);}); } void Mainwindow::quit() { - QMessageBox messageBox; - messageBox.setWindowTitle(tr("Notepad")); - messageBox.setText(tr("Do you really want to quit?")); - messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - messageBox.setDefaultButton(QMessageBox::No); - if (messageBox.exec() == QMessageBox::Yes) - qApp->quit(); + QMessageBox messageBox; + messageBox.setWindowTitle(tr("Notepad")); + messageBox.setText(tr("Do you really want to quit?")); + messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + messageBox.setDefaultButton(QMessageBox::No); + if (messageBox.exec() == QMessageBox::Yes) + qApp->quit(); } void Mainwindow::open() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", - tr("Binaries (*)")); + QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", + tr("Binaries (*)")); - openBinary(fileName.toStdString()); + manager->reset(fileName.toStdString()); } -void Mainwindow::openBinary(const std::string& filename) { - if (filename != "") { - disassembler.reset(new LLVMDisassembler(filename)); - disassembler->forEachFunction([&](uint64_t address, Function* fun) { - populateSymbolInformation(fun); - }); - } +void Mainwindow::addFunction(Function* fun) { + if (functions.find(fun) != functions.end()) + return; + + functions.insert(fun); + + QTabWidget * w = new QTabWidget(); + + // CFG + CFGScene * scene = new CFGScene; + + Disassembler * dis = manager->getDisassembler(); + std::cerr << dis << std::endl; + + BasicBlock * block = dis->getBasicBlock(fun->getStartAddress()); + + local__add_basic_block(block, manager->getDisassembler(), blocks, scene, block->getStartAddress(), 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"); + + listWidget->addItem(fun->getName().c_str()); + stackedWidget->addWidget(w); } namespace { BasicBlockWidget * local__add_basic_block(BasicBlock * block, Disassembler * dis, - std::map& known_blocks, - QGraphicsScene * scene, uint64_t starty, uint64_t startx) { + std::map& 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()) @@ -91,28 +123,31 @@ namespace { scene->addItem(widget); widget->setFlag(QGraphicsItem::ItemIsMovable, true); - widget->moveBy(100*startx, 10*(block->getStartAddress() - starty)); + widget->moveBy(100*startx, block->getStartAddress() - starty); dis->printEachInstruction(block->getStartAddress(), block->getEndAddress(), - [&](uint8_t* bytes, size_t byte_count, const std::string& line) { - widget->addItem(bytes, byte_count, line.c_str() + 1); - }); + [&](uint8_t* bytes, size_t byte_count, const std::string& line) { + widget->addItem(bytes, byte_count, line.c_str() + 1); + }); BasicBlockWidget *tmp, *nextl(NULL), *nextr(NULL); BasicBlock * tmpblock; if (block->getNextBlock(0) != 0) { + int xshift = 0; + if (block->getNextBlock(1) != 0) + xshift = 1; tmpblock = dis->getBasicBlock(block->getNextBlock(0)); tmp = local__add_basic_block(tmpblock, dis, - known_blocks, - scene, starty, startx+1); + known_blocks, + scene, starty, startx+xshift); nextl = tmp; tmp->addPrevious(widget); } if (block->getNextBlock(1) != 0) { tmpblock = dis->getBasicBlock(block->getNextBlock(1)); tmp = local__add_basic_block(tmpblock, dis, - known_blocks, - scene, starty, startx-1); + known_blocks, + scene, starty, startx-1); nextr = tmp; tmp->addPrevious(widget); } @@ -120,27 +155,3 @@ namespace { return widget; } } - -void Mainwindow::populateSymbolInformation(Function* fun) { - QTabWidget * w = new QTabWidget(); - - // CFG - QGraphicsScene * scene = new QGraphicsScene; - - BasicBlock * block = disassembler->getBasicBlock(fun->getStartAddress()); - - local__add_basic_block(block, disassembler.get(), blocks, scene, block->getStartAddress(), 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"); - - listWidget->addItem(fun->getName().c_str()); - stackedWidget->addWidget(w); -}