コード例 #1
0
ファイル: __init__.py プロジェクト: shiloong/drgn
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
コード例 #2
0
ファイル: test_program.py プロジェクト: nathandialpad/drgn
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