]> git.siccegge.de Git - frida/frida.git/commitdiff
Re-add support for PE binaries
authorChristoph Egger <Christoph.Egger@fau.de>
Tue, 10 Mar 2015 11:27:24 +0000 (12:27 +0100)
committerChristoph Egger <Christoph.Egger@fau.de>
Tue, 10 Mar 2015 11:27:24 +0000 (12:27 +0100)
src/disassembler/llvm/LLVMDisassembler.cxx
src/disassembler/llvm/LLVMDisassembler.hxx
src/disassembler/llvm/include_llvm.hxx

index f3a99cc273c6376c0a54f6a2c46262ff0be31c1f..cdcd3cb2cd516883400d08a9b47bef5c94a0341d 100644 (file)
@@ -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<ELF64BEObjectFile>(op)) {
                return new LLVMDisassembler<ELFType<support::big, 2, true>>(filename, manager, object);
        }
+       if (COFFObjectFile * object = dyn_cast<COFFObjectFile>(op)) {
+               return new LLVMDisassembler<COFFT>(filename, manager, object);
+       }
 
        return NULL;
 }
@@ -47,7 +56,7 @@ Disassembler * createLLVMDisassembler(const std::string& filename, InformationMa
 template <typename ELFT>
 LLVMDisassembler<ELFT>::LLVMDisassembler(const std::string& filename,
                                          InformationManager* manager,
-                                         ELFObjectFile<ELFT>* file)
+                                         ObjectFile* file)
        : Disassembler()
        , logger(log4cxx::Logger::getLogger("LLVMDisassembler"))
        , triple("unknown-unknown-unknown")
@@ -67,7 +76,7 @@ LLVMDisassembler<ELFT>::LLVMDisassembler(const std::string& filename,
 
                binary.reset(result.get());
 
-               o = dyn_cast<ELFObjectFile<ELFT>>(binary.get());
+               o = dyn_cast<ObjectFile>(binary.get());
        } else {
                o = file;
                binary.reset(file);
@@ -325,10 +334,7 @@ void LLVMDisassembler<ELFT>::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<ELFT>::disassemble() {
        }
 }
 
+template <>
+uint64_t LLVMDisassembler<COFFT>::entryAddress() {
+       const auto coffobject = dyn_cast<COFFObjectFile>(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 <typename ELFT>
+uint64_t LLVMDisassembler<ELFT>::entryAddress() {
+       const auto elffile = dyn_cast<ELFObjectFile<ELFT>>(o)->getELFFile();
+       const auto * header = elffile->getHeader();
+
+       return header->e_entry;
+}
+
 template <typename ELFT>
 void LLVMDisassembler<ELFT>::splitBlocks(Function* function) {
        SectionRef text_section = sections[".text"];
@@ -395,11 +425,15 @@ void LLVMDisassembler<ELFT>::splitBlocks(Function* function) {
        }
 }
 
+template<>
+void LLVMDisassembler<COFFT>::readDynamicSymbols() {
+       //TODO
+}
+
 template <typename ELFT>
 void LLVMDisassembler<ELFT>::readDynamicSymbols() {
-       const ELFO * elffile = o->getELFFile();
-       for (typename ELFO::Elf_Sym_Iter
-                    it = elffile->begin_dynamic_symbols(),
+       const auto elffile = dyn_cast<ELFObjectFile<ELFT>>(o)->getELFFile();
+       for (auto it = elffile->begin_dynamic_symbols(),
                     end = elffile->end_dynamic_symbols();
             it != end;
             ++it) {
index 6c55b44d5d855e2ee8ea19ace28940c9da7a4629..d4b13a20e92ce2a12fb0127d5a4de7518743d861 100644 (file)
@@ -14,17 +14,17 @@ class BasicBlock;
 
 Disassembler * createLLVMDisassembler(const std::string& filename, InformationManager* manager);
 
-template <typename ELFT>
+template <typename ObjectType>
 class LLVMDisassembler
        : public Disassembler {
 public:
        LLVMDisassembler(const std::string& filename, InformationManager* manager,
-                        llvm::object::ELFObjectFile<ELFT>* file = NULL);
+                        llvm::object::ObjectFile* file = NULL);
        virtual ~LLVMDisassembler();
 
        void start();
        void getSymbols() {}
-       uint64_t entryAddress() {return _entryAddress;}
+       uint64_t entryAddress();
 
        void printEachInstruction(uint64_t start, uint64_t end,
                                  std::function<void (uint8_t*, size_t, const std::string&,
@@ -33,8 +33,6 @@ public:
        Function * disassembleFunctionAt(uint64_t address, const std::string& name = "");
 
 private:
-       typedef llvm::object::ELFFile<ELFT> ELFO;
-
        // http://llvm.org/docs/doxygen/html/MCObjectDisassembler_8cpp_source.html +197
        void disassembleFunction(Function* function);
        void splitBlocks(Function* fun);
@@ -50,7 +48,7 @@ private:
        std::shared_ptr<llvm::object::Binary> binary;
 
        const llvm::Target * target;
-       llvm::object::ELFObjectFile<ELFT> * o;
+       llvm::object::ObjectFile * o;
 
        std::unique_ptr<const llvm::MCRegisterInfo> MRI;
        std::unique_ptr<const llvm::MCAsmInfo> AsmInfo;
index 8e5babdb2ee923776e2541f945ac8dd26bcf9a7c..c6dba985ed2697e4005b1825c45d0b283720ef50 100644 (file)
@@ -8,6 +8,7 @@
 #include <llvm/ADT/StringExtras.h>
 #include <llvm/MC/MCAsmInfo.h>
 #include <llvm/Object/ELFObjectFile.h>
+#include <llvm/Object/COFF.h>
 #include <llvm/Object/ObjectFile.h>
 #include <llvm/Object/Archive.h>
 #include <llvm/MC/MCAsmInfo.h>