X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fcore%2FInformationManager.cxx;h=711d47a552cb466b78b5c69a49d86e0d89ec9741;hp=f0b6e1e444c78491a0c33018fabb6c5a54c47b5b;hb=cab6494b97d1626c7b9285b69df324d9c9953614;hpb=72a9a502691a01578c06165bfe79097daafa2b05 diff --git a/src/core/InformationManager.cxx b/src/core/InformationManager.cxx index f0b6e1e..711d47a 100644 --- a/src/core/InformationManager.cxx +++ b/src/core/InformationManager.cxx @@ -1,8 +1,178 @@ #include "InformationManager.hxx" #include "disassembler/llvm/LLVMDisassembler.hxx" +#include "core/Function.hxx" +#include "core/BasicBlock.hxx" +#include "core/Comment.hxx" + +#include "gui/qt.hxx" +#include +#include + +#include + +InformationManager* current_information_manager; + +InformationManager::InformationManager() + : logger(log4cxx::Logger::getLogger("core.InformationManager")) +{ + current_information_manager = this; +} + +InformationManager::~InformationManager() { + for (auto b : blocks) + delete b.second; + + for (auto f : functions) + delete f.second; +} void InformationManager::reset(const std::string& filename) { + this->filename = filename; disassembler.reset(createLLVMDisassembler(filename, this)); if (disassembler.get() != NULL) disassembler.get()->start(); } + +void InformationManager::load(const std::string& filename) { + QuaZip zip(filename.c_str()); + QuaZipFile file(&zip); + QuaZipFileInfo info; + + zip.open(QuaZip::mdUnzip); + tmpfile.reset(new QTemporaryFile()); + + { + LOG4CXX_INFO(logger, "Loading binary from archive"); + zip.setCurrentFile("binary"); + tmpfile->open(); + file.open(QIODevice::ReadOnly); + QByteArray buffer; + while (!file.atEnd()) { + buffer = file.read(4096); + tmpfile->write(buffer); + } + tmpfile->flush(); + file.close(); + disassembler.reset(createLLVMDisassembler(tmpfile->fileName().toStdString(), this)); + } + + for (bool more = zip.goToFirstFile(); more; more = zip.goToNextFile()) { + zip.getCurrentFileInfo(&info); + file.open(QIODevice::ReadOnly); + + if(info.name != "binary") { + QXmlStreamReader reader(&file); + assert(QXmlStreamReader::StartDocument == reader.readNext()); + assert(QXmlStreamReader::StartElement == reader.readNext()); + Function * fun = Function::deserialize(reader, this); + } + file.close(); + } +} + +void InformationManager::save(const std::string& filename) { + QuaZip zip(filename.c_str()); + zip.open(QuaZip::mdCreate); + zip.setComment("FRIDA 0.0"); + QuaZipFile outZipFile(&zip); + + { + QFile binary(this->filename.c_str()); + binary.open(QIODevice::ReadOnly); + QuaZipNewInfo zipinfo("binary"); + zipinfo.setPermissions(static_cast(0x6444)); + outZipFile.open(QIODevice::WriteOnly, zipinfo); + QByteArray buffer; + while (!binary.atEnd()) { + buffer = binary.read(4096); + outZipFile.write(buffer); + } + outZipFile.close(); + } + + for (auto funpair : functions) { + Function* fun = funpair.second; + QuaZipNewInfo zipinfo(fun->getName().c_str()); + zipinfo.setPermissions(static_cast(0x6444)); + outZipFile.open(QIODevice::WriteOnly, zipinfo); + QXmlStreamWriter stream(&outZipFile); + stream.setAutoFormatting(true); + stream.setAutoFormattingIndent(-1); + stream.writeStartDocument(); + + fun->serialize(stream); + + stream.writeEndDocument(); + outZipFile.close(); + } + + zip.close(); +} + +void InformationManager::signal_new_function(Function* fun) { +} + +Function* InformationManager::getFunction(uint64_t address) { + auto it = functions.find(address); + if (it != functions.end()) + return it->second; + else + return NULL; +} + +BasicBlock* InformationManager::getBasicBlock(uint64_t address) { + auto it = blocks.find(address); + if (it != blocks.end()) + return it->second; + else + return NULL; +} + +Function* InformationManager::newFunction(uint64_t address) { + Function* fun = new Function(address, this); + functions.insert(std::make_pair(address, fun)); + return fun; +} + +BasicBlock* InformationManager::newBasicBlock(uint64_t address) { + BasicBlock* block = new BasicBlock(address, this); + blocks.insert(std::make_pair(address, block)); + return block; +} + +Comment* InformationManager::newGlobalComment(uint64_t address) { + return NULL; +} + +Comment* InformationManager::newLocalComment(uint64_t address, Function* f) { + return NULL; +} + +void InformationManager::finishFunction(Function* fun) { + LOG4CXX_DEBUG(logger, "Finishing function " << fun->getName()); + for (auto b : fun->blocks()) { + BasicBlock* bl = b.second; + blocks.insert(std::make_pair(bl->getStartAddress(), bl)); + } + new_function_signal(fun); +} + +void InformationManager::finishBasicBlock(BasicBlock* b) { +} + +void InformationManager::finnishComment(Comment* c) { +} + +void InformationManager::deleteFunction(Function* f) { + functions.erase(f->getStartAddress()); + delete f; +} + +void InformationManager::deleteBasicBlock(BasicBlock* b) { + blocks.erase(b->getStartAddress()); + delete b; +} + +void InformationManager::deleteComment(Comment* c) { + delete c; +}