X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;h=21766bb344cb708a473188f577659d03723bd1c5;hp=cdcd3cb2cd516883400d08a9b47bef5c94a0341d;hb=099f1e8222109bf7397eff6da0c511a07906c9cd;hpb=4b2336f2066f76d2be017ad9731865ac6743abcb diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index cdcd3cb..21766bb 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -15,6 +15,10 @@ namespace { class COFFT { }; + + class MACHOT { + + }; } /* @@ -44,6 +48,9 @@ Disassembler * createLLVMDisassembler(const std::string& filename, InformationMa if (COFFObjectFile * object = dyn_cast(op)) { return new LLVMDisassembler(filename, manager, object); } + if (MachOObjectFile * object = dyn_cast(op)) { + return new LLVMDisassembler(filename, manager, object); + } return NULL; } @@ -58,7 +65,7 @@ LLVMDisassembler::LLVMDisassembler(const std::string& filename, InformationManager* manager, ObjectFile* file) : Disassembler() - , logger(log4cxx::Logger::getLogger("LLVMDisassembler")) + , logger(log4cxx::Logger::getLogger("disassembler.LLVMDisassembler")) , triple("unknown-unknown-unknown") , manager(manager) { @@ -133,10 +140,10 @@ LLVMDisassembler::LLVMDisassembler(const std::string& filename, RelInfo.reset( target->createMCRelocationInfo(tripleName, Ctx)); if (RelInfo) { - Symzer.reset( - MCObjectSymbolizer::createObjectSymbolizer(Ctx, std::move(RelInfo), o)); - if (Symzer) - DisAsm->setSymbolizer(std::move(Symzer)); + // Symzer.reset( + // MCObjectSymbolizer::createObjectSymbolizer(Ctx, std::move(RelInfo), o)); + // if (Symzer) + // DisAsm->setSymbolizer(std::move(Symzer)); } RelInfo.release(); Symzer.release(); @@ -177,7 +184,7 @@ LLVMDisassembler::~LLVMDisassembler() {} template Function* LLVMDisassembler::disassembleFunctionAt(uint64_t address, const std::string& name) { Function * function; - SectionRef text_section = sections[".text"]; + SectionRef text_section = getTextSection(); uint64_t base_address, size; text_section.getAddress(base_address); text_section.getSize(size); @@ -199,7 +206,6 @@ Function* LLVMDisassembler::disassembleFunctionAt(uint64_t address, const function->setName(name); } disassembleFunction(function); - manager->finishFunction(function); } return function; @@ -207,13 +213,14 @@ Function* LLVMDisassembler::disassembleFunctionAt(uint64_t address, const template void LLVMDisassembler::disassembleFunction(Function* function) { + std::vector called_functions; std::stack remaining_blocks; /* TODO: * Do all blocks get added properly? We should take care to remove * the other ones at the end of the function! */ std::map new_blocks; - SectionRef text_section = sections[".text"]; + SectionRef text_section = getTextSection(); StringRef bytes; text_section.getContents(bytes); StringRefMemoryObject ref(bytes); @@ -225,6 +232,11 @@ void LLVMDisassembler::disassembleFunction(Function* function) { new_blocks.insert(std::make_pair(block->getStartAddress(), block)); function->addBasicBlock(block); + uint64_t base_address, size; + text_section.getAddress(base_address); + text_section.getSize(size); + LOG4CXX_DEBUG(logger, "Text section at " << std::hex << base_address << " with size " << size); + while (remaining_blocks.size()) { BasicBlock * current_block = remaining_blocks.top(); remaining_blocks.pop(); @@ -233,8 +245,6 @@ void LLVMDisassembler::disassembleFunction(Function* function) { << current_block->getStartAddress()); uint64_t inst_size; - uint64_t base_address; - text_section.getAddress(base_address); uint64_t current_address = current_block->getStartAddress() - base_address; while(true) { MCInst inst; @@ -250,7 +260,7 @@ void LLVMDisassembler::disassembleFunction(Function* function) { if (!MIA->isIndirectBranch(inst)) { if (MIA->isCall(inst)) { if (NULL == manager->getFunction(jmptarget)) - disassembleFunctionAt(jmptarget); + called_functions.push_back(jmptarget); } else { current_block->setNextBlock(0, jmptarget); if (new_blocks.find(jmptarget) == new_blocks.end()) { @@ -298,12 +308,14 @@ void LLVMDisassembler::disassembleFunction(Function* function) { } splitBlocks(function); LOG4CXX_DEBUG(logger, "Finished function " << function->getName()); - manager->signal_new_function(function); + manager->finishFunction(function); + for (uint64_t address : called_functions) + disassembleFunctionAt(address); } template void LLVMDisassembler::disassemble() { - SectionRef text_section = sections[".text"]; + SectionRef text_section = getTextSection(); std::vector remaining_functions; // Assume all function symbols actually start a real function @@ -322,9 +334,14 @@ void LLVMDisassembler::disassemble() { if (!x->second.getAddress(result)) { Function * fun = manager->newFunction(result); - fun->setName(x->first); - remaining_functions.push_back(fun); - LOG4CXX_DEBUG(logger, "Disasembling " << x->first); + if (fun) { + fun->setName(x->first); + remaining_functions.push_back(fun); + LOG4CXX_DEBUG(logger, "Disasembling " << x->first); + } else { + LOG4CXX_DEBUG(logger, "Function at " << std::hex << result + << " already disassembled as " << manager->getFunction(result)->getName()); + } } } @@ -366,6 +383,12 @@ uint64_t LLVMDisassembler::entryAddress() { } } +template<> +uint64_t LLVMDisassembler::entryAddress() { + // TODO + return 0; +} + template uint64_t LLVMDisassembler::entryAddress() { const auto elffile = dyn_cast>(o)->getELFFile(); @@ -376,16 +399,21 @@ uint64_t LLVMDisassembler::entryAddress() { template void LLVMDisassembler::splitBlocks(Function* function) { - SectionRef text_section = sections[".text"]; + SectionRef text_section = getTextSection(); StringRef bytes; text_section.getContents(bytes); StringRefMemoryObject ref(bytes); + LOG4CXX_DEBUG(logger, "Splitting Blocks in Function " << function->getName()); // Split blocks where jumps are going inside the block for (auto it = function->blocks().begin(); it != function->blocks().end(); ++it) { BasicBlock * current_block = it->second; + if (current_block->getEndAddress() == 0) { + LOG4CXX_ERROR(logger, "UNFINISHED BLOCK " << std::hex << current_block->getStartAddress()); + break; + } uint64_t inst_size; uint64_t base_address; text_section.getAddress(base_address); @@ -430,6 +458,11 @@ void LLVMDisassembler::readDynamicSymbols() { //TODO } +template<> +void LLVMDisassembler::readDynamicSymbols() { + //TODO +} + template void LLVMDisassembler::readDynamicSymbols() { const auto elffile = dyn_cast>(o)->getELFFile(); @@ -492,7 +525,7 @@ void LLVMDisassembler::printEachInstruction(uint64_t start, uint64_t end, std::function fun) { - SectionRef text_section = sections[".text"]; + SectionRef text_section = getTextSection(); uint64_t base_address; text_section.getAddress(base_address); uint64_t current_address = start - base_address; @@ -538,3 +571,13 @@ void LLVMDisassembler::printEachInstruction(uint64_t start, uint64_t end, current_address += inst_size; } } + +template +SectionRef LLVMDisassembler::getTextSection() { + return sections[".text"]; +} + +template <> +SectionRef LLVMDisassembler::getTextSection() { + return sections["__text"]; +}