X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;h=3d969ef211975fde131ec83514beb561f220d5af;hp=f3a99cc273c6376c0a54f6a2c46262ff0be31c1f;hb=61fee0e142cbd73869f21e1a79e4038bb5c61335;hpb=fee24ac64935da3d0a11eaee8141cb2b7ef35ed6 diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index f3a99cc..3d969ef 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -11,6 +11,12 @@ using namespace llvm; using namespace llvm::object; using std::error_code; +namespace { + class COFFT { + + }; +} + /* * */ @@ -35,6 +41,9 @@ Disassembler * createLLVMDisassembler(const std::string& filename, InformationMa if (ELF64BEObjectFile * object = dyn_cast(op)) { return new LLVMDisassembler>(filename, manager, object); } + if (COFFObjectFile * object = dyn_cast(op)) { + return new LLVMDisassembler(filename, manager, object); + } return NULL; } @@ -47,7 +56,7 @@ Disassembler * createLLVMDisassembler(const std::string& filename, InformationMa template LLVMDisassembler::LLVMDisassembler(const std::string& filename, InformationManager* manager, - ELFObjectFile* file) + ObjectFile* file) : Disassembler() , logger(log4cxx::Logger::getLogger("LLVMDisassembler")) , triple("unknown-unknown-unknown") @@ -67,7 +76,7 @@ LLVMDisassembler::LLVMDisassembler(const std::string& filename, binary.reset(result.get()); - o = dyn_cast>(binary.get()); + o = dyn_cast(binary.get()); } else { o = file; binary.reset(file); @@ -124,10 +133,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(); @@ -325,10 +334,7 @@ void LLVMDisassembler::disassemble() { } if (binary->isELF()) { - const ELFO * elffile = o->getELFFile(); - const typename ELFO::Elf_Ehdr * header = elffile->getHeader(); - - _entryAddress = header->e_entry; + uint64_t _entryAddress = entryAddress(); LOG4CXX_DEBUG(logger, "Adding entryAddress at: " << std::hex << _entryAddress); std::stringstream s; s << "<_start 0x" << std::hex << _entryAddress << ">"; @@ -344,6 +350,30 @@ void LLVMDisassembler::disassemble() { } } +template <> +uint64_t LLVMDisassembler::entryAddress() { + const auto coffobject = dyn_cast(o); + const struct pe32_header* pe32_header; + const struct pe32plus_header* pe32plus_header; + + coffobject->getPE32PlusHeader(pe32plus_header); + + if (pe32plus_header) { + return pe32plus_header->AddressOfEntryPoint; + } else { + coffobject->getPE32Header(pe32_header); + return pe32_header->AddressOfEntryPoint; + } +} + +template +uint64_t LLVMDisassembler::entryAddress() { + const auto elffile = dyn_cast>(o)->getELFFile(); + const auto * header = elffile->getHeader(); + + return header->e_entry; +} + template void LLVMDisassembler::splitBlocks(Function* function) { SectionRef text_section = sections[".text"]; @@ -395,11 +425,15 @@ void LLVMDisassembler::splitBlocks(Function* function) { } } +template<> +void LLVMDisassembler::readDynamicSymbols() { + //TODO +} + template void LLVMDisassembler::readDynamicSymbols() { - const ELFO * elffile = o->getELFFile(); - for (typename ELFO::Elf_Sym_Iter - it = elffile->begin_dynamic_symbols(), + const auto elffile = dyn_cast>(o)->getELFFile(); + for (auto it = elffile->begin_dynamic_symbols(), end = elffile->end_dynamic_symbols(); it != end; ++it) {