def extract_arch(reader): arch_str = reader['e_machine'] if arch_str == 'ARM': if reader.header.e_flags & 0x200: return archinfo.ArchARMEL('Iend_LE' if reader.little_endian else 'Iend_BE') elif reader.header.e_flags & 0x400: return archinfo.ArchARMHF('Iend_LE' if reader.little_endian else 'Iend_BE') return archinfo.arch_from_id(arch_str, 'le' if reader.little_endian else 'be', reader.elfclass)
def __init__(self, binary, **kwargs): super(ELF, self).__init__(binary, **kwargs) self.reader = elffile.ELFFile(open(self.binary, 'rb')) # Get an appropriate archinfo.Arch for this binary, unless the user specified one if self.arch is None: if self.reader.header.e_machine == 'EM_ARM' and \ self.reader.header.e_flags & 0x200: self.set_arch(archinfo.ArchARMEL('Iend_LE' if 'LSB' in self.reader.header.e_ident.EI_DATA else 'Iend_BE')) elif self.reader.header.e_machine == 'EM_ARM' and \ self.reader.header.e_flags & 0x400: self.set_arch(archinfo.ArchARMHF('Iend_LE' if 'LSB' in self.reader.header.e_ident.EI_DATA else 'Iend_BE')) else: self.set_arch(archinfo.arch_from_id(self.reader.header.e_machine, self.reader.header.e_ident.EI_DATA, self.reader.header.e_ident.EI_CLASS)) self.strtab = None self.dynsym = None self.hashtable = None self._dynamic = {} self.deps = [] self.rela_type = None self._inits_extracted = False self._preinit_arr = [] self._init_func = None self._init_arr = [] self._fini_func = None self._fini_arr = [] self._symbol_cache = {} self.symbols_by_addr = {} self.imports = {} self.resolved_imports = [] self.relocs = [] self.jmprel = {} self._entry = self.reader.header.e_entry self.pic = self.reader.header.e_type == 'ET_DYN' self.tls_used = False self.tls_module_id = None self.tls_block_offset = None self.tls_block_size = None self.tls_tdata_start = None self.tls_tdata_size = None self.__register_segments() self.__register_sections() # call the methods defined by MetaELF self._ppc64_abiv1_entry_fix() self._load_plt()
def extract_arch(reader): arch_str = reader['e_machine'] if 'ARM' in arch_str: # Check the ARM attributes, if they exist arm_attrs = ELF._extract_arm_attrs(reader) if arm_attrs and 'TAG_CPU_NAME' in arm_attrs: if arm_attrs['TAG_CPU_NAME'].endswith("-M") \ or 'Cortex-M' in arm_attrs['TAG_CPU_NAME']: return archinfo.ArchARMCortexM('Iend_LE') if reader.header.e_flags & 0x200: return archinfo.ArchARMEL( 'Iend_LE' if reader.little_endian else 'Iend_BE') elif reader.header.e_flags & 0x400: return archinfo.ArchARMHF( 'Iend_LE' if reader.little_endian else 'Iend_BE') return archinfo.arch_from_id(arch_str, 'le' if reader.little_endian else 'be', reader.elfclass)
def __init__(self, binary, **kwargs): super(ELF, self).__init__(binary, **kwargs) try: self.reader = elffile.ELFFile(self.binary_stream) except ELFError: raise CLECompatibilityError # Get an appropriate archinfo.Arch for this binary, unless the user specified one if self.arch is None: arch_str = self.reader['e_machine'] if arch_str == 'ARM': if self.reader.header.e_flags & 0x200: self.set_arch( archinfo.ArchARMEL('Iend_LE' if self.reader. little_endian else 'Iend_BE')) elif self.reader.header.e_flags & 0x400: self.set_arch( archinfo.ArchARMHF('Iend_LE' if self.reader. little_endian else 'Iend_BE')) else: self.set_arch( archinfo.arch_from_id( arch_str, 'le' if self.reader.little_endian else 'be', self.reader.elfclass)) self.strtab = None self.dynsym = None self.hashtable = None self._dynamic = {} self.deps = [] self.rela_type = None self._inits_extracted = False self._preinit_arr = [] self._init_func = None self._init_arr = [] self._fini_func = None self._fini_arr = [] self._nullsymbol = Symbol(self, '', 0, 0, None, 'STT_NOTYPE', 0) self._symbol_cache = {} self.symbols_by_addr = {} self.demangled_names = {} self.imports = {} self.resolved_imports = [] self.relocs = [] self.jmprel = {} self._entry = self.reader.header.e_entry self.pic = self.reader.header.e_type == 'ET_DYN' self.tls_used = False self.tls_module_id = None self.tls_block_offset = None self.tls_block_size = None self.tls_tdata_start = None self.tls_tdata_size = None self.__parsed_reloc_tables = set() self.__register_segments() self.__register_sections() # call the methods defined by MetaELF self._ppc64_abiv1_entry_fix() self._load_plt() self._populate_demangled_names()
def __init__(self, binary, **kwargs): super(ELF, self).__init__(binary, **kwargs) patch_undo = None try: self.reader = elffile.ELFFile(self.binary_stream) except ELFError: self.binary_stream.seek(5) ty = self.binary_stream.read(1) if ty not in ('\1', '\2'): raise CLECompatibilityError patch_data = (0x20, '\0\0\0\0') if ty == '\1' else (0x28, '\0\0\0\0\0\0\0\0') self.binary_stream.seek(patch_data[0]) patch_undo = (patch_data[0], self.binary_stream.read(len(patch_data[1]))) self.binary_stream = PatchedStream(self.binary_stream, [patch_data]) l.error("PyReadELF couldn't load this file. Trying again without section headers...") try: self.reader = elffile.ELFFile(self.binary_stream) except ELFError: raise CLECompatibilityError # Get an appropriate archinfo.Arch for this binary, unless the user specified one if self.arch is None: arch_str = self.reader['e_machine'] if arch_str == 'ARM': if self.reader.header.e_flags & 0x200: self.set_arch(archinfo.ArchARMEL('Iend_LE' if self.reader.little_endian else 'Iend_BE')) elif self.reader.header.e_flags & 0x400: self.set_arch(archinfo.ArchARMHF('Iend_LE' if self.reader.little_endian else 'Iend_BE')) else: self.set_arch(archinfo.arch_from_id(arch_str, 'le' if self.reader.little_endian else 'be', self.reader.elfclass)) self.strtab = None self.dynsym = None self.hashtable = None self._dynamic = {} self.deps = [] self.rela_type = None self._inits_extracted = False self._preinit_arr = [] self._init_func = None self._init_arr = [] self._fini_func = None self._fini_arr = [] self._nullsymbol = Symbol(self, '', 0, 0, None, 'STT_NOTYPE', 0) self._symbol_cache = {} self.symbols_by_addr = {} self.demangled_names = {} self.imports = {} self.resolved_imports = [] self.relocs = [] self.jmprel = {} self._entry = self.reader.header.e_entry self.pic = self.reader.header.e_type == 'ET_DYN' self.tls_used = False self.tls_module_id = None self.tls_block_offset = None self.tls_block_size = None self.tls_tdata_start = None self.tls_tdata_size = None self.__parsed_reloc_tables = set() self.__register_segments() self.__register_sections() # call the methods defined by MetaELF self._ppc64_abiv1_entry_fix() self._load_plt() self._populate_demangled_names() if patch_undo is not None: self.memory.write_bytes(self.get_min_addr() + patch_undo[0], patch_undo[1])