X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;h=cdcd3cb2cd516883400d08a9b47bef5c94a0341d;hp=f3a99cc273c6376c0a54f6a2c46262ff0be31c1f;hb=4b2336f2066f76d2be017ad9731865ac6743abcb;hpb=7d735a419a04ad3e1f3c276a3ba4c9097f5d1239 diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index f3a99cc..cdcd3cb 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); @@ -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) {