def __init__(self, prop=None, offset=None): """ Constructor """ self.fields = [] if not self.format: try: if prop.arch == ARCH_32: self.format = self.format_32 elif prop.arch == ARCH_64: self.format = self.format_64 else: self.format = [] except AttributeError: self.format = [] if not self.descriptions: try: if prop.arch == ARCH_32: self.descriptions = self.descriptions_32 elif prop.arch == ARCH_64: self.descriptions = self.descriptions_64 else: self.descriptions = [] except AttributeError: self.descriptions = [] if not self.cf_descriptions: try: if prop.arch == ARCH_32: self.cf_descriptions = self.cf_descriptions_32 elif prop.arch == ARCH_64: self.cf_descriptions = self.cf_descriptions_64 except AttributeError: pass if not self.cf_format: try: if prop.arch == ARCH_32: self.cf_format = self.cf_format_32 elif prop.arch == ARCH_64: self.cf_format = self.cf_format_64 except AttributeError: pass if not self.hr_values: try: if prop.arch == ARCH_32: self.hr_values = self.hr_values_32 elif prop.arch == ARCH_64: self.hr_values = self.hr_values_64 else: self.hr_values = {} except AttributeError: self.hr_values = {} Chunk.__init__(self, prop, True, offset, calcsize(''.join(self.format)))
def load_binary(self, filename=None, offset=None, filemap=None): """ Loads the ELF file into a memory mapped file """ if filename == None: filename = self.prop.filename self.prop.file_src = open(filename, 'r+') self.prop.map_src = mmap(self.prop.file_src.fileno(), 0, access=self.prop.mode) Chunk.load(self, offset, filemap)
def finalize(self): """ Close map before deleting the object """ if self.prop.map_dst != None: self.prop.map_dst.close() self.prop.file_dst.close() self.prop.map_src.close() self.prop.file_src.close() Chunk.finalize(self)
def __setattr__(self, name, value): """ Attribute setter rewrite """ if self.descriptions != None and name in self.descriptions: self.modified = True self.fields[self.descriptions.index(name)] = value elif self.cf_descriptions != None and name in self.cf_descriptions: getattr(self, "set_"+name)(value) else: Chunk.__setattr__(self, name, value)
def __setattr__(self, name, value): """ Attribute setter rewrite """ if self.descriptions != None and name in self.descriptions: self.modified = True self.fields[self.descriptions.index(name)] = value elif self.cf_descriptions != None and name in self.cf_descriptions: getattr(self, "set_" + name)(value) else: Chunk.__setattr__(self, name, value)
def remove(self, force=False, forward=True): """ Remove the page and its header according to forward """ if forward == True: ret = self.header.remove(force) return Chunk.remove(self, force)
def remove(self, force = False, forward = True): """ Remove the page and its header according to forward """ if forward == True: ret = self.header.remove(force) return Chunk.remove(self, force)
def __getattr__(self, name): """ Attribute getter rewrite """ if self.descriptions != None and name in self.descriptions: return self.fields[self.descriptions.index(name)] if self.cf_descriptions != None and name in self.cf_descriptions: return getattr(self, "get_" + name)() return Chunk.__getattr__(self, name)
def load(self, offset=None, filemap=None): """ Loads header fields according to descriptions/format """ Chunk.load(self, offset, filemap) fields = list(unpack_from(''.join([self.prop.endian]+self.format), self.data)) idx = 0 for fmt in self.format: if fmt[len(fmt)-1] not in [ 's', 'p' ] and ( fmt[:len(fmt)-1].isdigit() == True): v = idx self.fields += [()] for n in range (0, int(fmt[:len(fmt)-1])): self.fields[v] += (fields[idx],) idx += 1 else: self.fields += [fields[idx]] idx += 1
def __getattr__(self, name): """ Attribute getter rewrite """ if self.descriptions != None and name in self.descriptions: return self.fields[self.descriptions.index(name)] if self.cf_descriptions != None and name in self.cf_descriptions: return getattr(self, "get_"+name)() return Chunk.__getattr__(self, name)
def load(self, offset=None, filemap=None): """ Loads header fields according to descriptions/format """ Chunk.load(self, offset, filemap) fields = list( unpack_from(''.join([self.prop.endian] + self.format), self.data)) idx = 0 for fmt in self.format: if fmt[len(fmt) - 1] not in [ 's', 'p' ] and (fmt[:len(fmt) - 1].isdigit() == True): v = idx self.fields += [()] for n in range(0, int(fmt[:len(fmt) - 1])): self.fields[v] += (fields[idx], ) idx += 1 else: self.fields += [fields[idx]] idx += 1
def __init__(self, filename, access='r', load=True, backup=False): """ Constructor """ self.access = access if self.access == 'w': mode = ACCESS_WRITE elif self.access == 'r': mode = ACCESS_READ else: mode = None size = getsize(filename) self.prop = Property(mode, backup, filename, size_src=size) self.header = None self.sections = [] self.programs = [] Chunk.__init__(self, prop=self.prop, load=load, offset=0, size=size)
def write(self): """ Writes the current ELF map into a file """ filename = self.prop.filename if self.prop.backup: filename = self.prop.filename+'_mod' f_dst = open(filename, 'wb') f_dst.write('\0'*PAGESIZE) f_dst.close() self.prop.file_dst = open(filename, 'r+') self.prop.map_dst = mmap(self.prop.file_dst.fileno(), 0, access=self.prop.mode) self.prop.map_dst.resize(self.size) ret_size = Chunk.write(self, self.prop.map_dst) self.prop.map_dst.close() self.prop.map_dst = None self.prop.file_dst.close() self.prop.file_dst = None return ret_size
def write(self): """ Writes the current ELF map into a file """ filename = self.prop.filename if self.prop.backup: filename = self.prop.filename + '_mod' f_dst = open(filename, 'wb') f_dst.write('\0' * PAGESIZE) f_dst.close() self.prop.file_dst = open(filename, 'r+') self.prop.map_dst = mmap(self.prop.file_dst.fileno(), 0, access=self.prop.mode) self.prop.map_dst.resize(self.size) ret_size = Chunk.write(self, self.prop.map_dst) self.prop.map_dst.close() self.prop.map_dst = None self.prop.file_dst.close() self.prop.file_dst = None return ret_size
def __init__(self, header, offset, size): """ Constructor """ self.header = header Chunk.__init__(self, self.header.prop, True, offset, size, header)
def write(self, filemap=None): """ Writes header fields """ self.data = self.todata() return Chunk.write(self, filemap)