X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=src%2Fcore%2FInformationManager.cxx;h=5a70dee6a54041951a4461723a85f40714caf518;hb=9b99fc5856d5fe88bb1d2aad4d2ee7cd86b5be57;hp=1ea4ba0cb0357f7a12235d8af3adb17592659043;hpb=8995413dc4cdfaa8d617a8823050c32f921c6ada;p=frida%2Ffrida.git diff --git a/src/core/InformationManager.cxx b/src/core/InformationManager.cxx index 1ea4ba0..5a70dee 100644 --- a/src/core/InformationManager.cxx +++ b/src/core/InformationManager.cxx @@ -1,4 +1,5 @@ #include "InformationManager.hxx" +#include "bindings/Interpreter.hxx" #include "disassembler/llvm/LLVMDisassembler.hxx" #include "core/Function.hxx" #include "core/BasicBlock.hxx" @@ -8,9 +9,21 @@ #include #include +#include + +InformationManager* current_information_manager; + InformationManager::InformationManager() - : logger(log4cxx::Logger::getLogger("InformationManager")) -{} + : logger(log4cxx::Logger::getLogger("core.InformationManager")) +{ + current_information_manager = this; + + QPluginLoader* loader = new QPluginLoader("libguilePlugin", NULL); + if (!loader->load()) + LOG4CXX_ERROR(logger, "Loading plugin failed: " << loader->errorString().toStdString()); + interpreters["GUILE"] = qobject_cast(loader->instance()); + plugins.push_back(loader); +} InformationManager::~InformationManager() { for (auto b : blocks) @@ -18,20 +31,75 @@ InformationManager::~InformationManager() { for (auto f : functions) delete f.second; + + for (auto i : plugins) + delete i; } void InformationManager::reset(const std::string& filename) { + this->filename = filename; disassembler.reset(createLLVMDisassembler(filename, this)); if (disassembler.get() != NULL) disassembler.get()->start(); } -void InformationManager::save(const QString& filename) { - QuaZip zip(filename); +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()); @@ -54,6 +122,12 @@ void InformationManager::save(const QString& filename) { void InformationManager::signal_new_function(Function* fun) { } + + +/* ******************************* + * Accessors for the Functions map + */ + Function* InformationManager::getFunction(uint64_t address) { auto it = functions.find(address); if (it != functions.end()) @@ -62,6 +136,18 @@ Function* InformationManager::getFunction(uint64_t address) { return NULL; } +std::map::const_iterator InformationManager::beginFunctions() { + return functions.begin(); +} +std::map::const_iterator InformationManager::endFunctions() { + return functions.end(); +} + + +/* ********************************* + * Accessors for the BasicBlocks map + */ + BasicBlock* InformationManager::getBasicBlock(uint64_t address) { auto it = blocks.find(address); if (it != blocks.end()) @@ -70,6 +156,38 @@ BasicBlock* InformationManager::getBasicBlock(uint64_t address) { return NULL; } +std::map::const_iterator InformationManager::beginBasicBlocks() { + return blocks.begin(); +} +std::map::const_iterator InformationManager::endBasicBlocks() { + return blocks.end(); +} + + +/* ********************************* + * Accessors for the Interpreter map + */ + +Interpreter* InformationManager::getInterpreter(const std::string& name) { + auto it = interpreters.find(name); + if (it != interpreters.end()) + return it->second; + else + return NULL; +} + +std::map::const_iterator InformationManager::beginInterpreters() { + return interpreters.begin(); +} +std::map::const_iterator InformationManager::endInterpreters() { + return interpreters.end(); +} + + +/* ******************************** + * Factory methods for data classes + */ + Function* InformationManager::newFunction(uint64_t address) { Function* fun = new Function(address, this); functions.insert(std::make_pair(address, fun));