def mock_program(platform=MOCK_PLATFORM, *, segments=None, types=None, objects=None): def mock_find_type(kind, name, filename): if filename: return None for type in types: if type.kind == kind: try: type_name = type.name except AttributeError: try: type_name = type.tag except AttributeError: continue if type_name == name: return type return None def mock_object_find(prog, name, flags, filename): if filename: return None for obj in objects: if obj.name == name: if obj.value is not None: if flags & FindObjectFlags.CONSTANT: break elif obj.type.kind == TypeKind.FUNCTION: if flags & FindObjectFlags.FUNCTION: break elif flags & FindObjectFlags.VARIABLE: break else: return None return Object(prog, obj.type, address=obj.address, value=obj.value) prog = Program(platform) if segments is not None: for segment in segments: if segment.virt_addr is not None: prog.add_memory_segment( segment.virt_addr, len(segment.buf), functools.partial(mock_memory_read, segment.buf), ) if segment.phys_addr is not None: prog.add_memory_segment( segment.phys_addr, len(segment.buf), functools.partial(mock_memory_read, segment.buf), True, ) if types is not None: prog.add_type_finder(mock_find_type) if objects is not None: prog.add_object_finder(mock_object_find) return prog
def mock_program(arch=MOCK_ARCH, *, segments=None, types=None, symbols=None): def mock_find_type(kind, name, filename): if filename: return None for type in types: if type.kind == kind: try: type_name = type.name except AttributeError: try: type_name = type.tag except AttributeError: continue if type_name == name: return type return None def mock_symbol_find(name, flags, filename): if filename: return None for sym_name, sym in symbols: if sym_name == name: if sym.value is not None or sym.is_enumerator: if flags & FindObjectFlags.CONSTANT: break elif sym.type.kind == TypeKind.FUNCTION: if flags & FindObjectFlags.FUNCTION: break elif flags & FindObjectFlags.VARIABLE: break else: return None return sym prog = Program(arch) if segments is not None: for segment in segments: if segment.virt_addr is not None: prog.add_memory_segment( segment.virt_addr, len(segment.buf), functools.partial(mock_memory_read, segment.buf)) if segment.phys_addr is not None: prog.add_memory_segment( segment.phys_addr, len(segment.buf), functools.partial(mock_memory_read, segment.buf), True) if types is not None: prog.add_type_finder(mock_find_type) if symbols is not None: prog.add_symbol_finder(mock_symbol_find) return prog