def __init__(self, filename, raw_type, raw_base, raw_big_endian, database): import capstone as CAPSTONE self.capstone_inst = {} # capstone instruction cache if database.loaded: self.mem = database.mem else: self.mem = Memory() database.mem = self.mem self.binary = Binary(self.mem, filename, raw_type, raw_base, raw_big_endian) self.binary.load_section_names() arch, mode = self.binary.get_arch() if arch is None or mode is None: raise ExcArch(self.binary.get_arch_string()) self.jmptables = database.jmptables self.user_inline_comments = database.user_inline_comments self.internal_inline_comments = database.internal_inline_comments self.user_previous_comments = database.user_previous_comments self.internal_previous_comments = database.internal_previous_comments self.functions = database.functions self.func_id = database.func_id self.end_functions = database.end_functions self.xrefs = database.xrefs # TODO: is it a global constant or $gp can change during the execution ? self.mips_gp = database.mips_gp if database.loaded: self.binary.symbols = database.symbols self.binary.reverse_symbols = database.reverse_symbols self.binary.imports = database.imports else: self.binary.load_symbols() database.symbols = self.binary.symbols database.reverse_symbols = self.binary.reverse_symbols database.imports = self.binary.imports self.capstone = CAPSTONE self.md = CAPSTONE.Cs(arch, mode) self.md.detail = True self.arch = arch self.mode = mode for s in self.binary.iter_sections(): s.big_endian = self.mode & self.capstone.CS_MODE_BIG_ENDIAN # TODO: useful ? if not database.loaded: self.mem.add(s.start, s.end, MEM_UNK)
def __load_memory(self, data): self.mem = Memory() try: if self.version == -1: self.mem.mm = data["mem_code"] for ad in self.mem.mm: self.mem.mm[ad].append(-1) return self.mem.mm = data["mem"] except: # Not available in previous versions, this try will be # removed in the future pass