Esempio n. 1
0
def read_case(settings, interps, heaps, pointer, stack, scrutinee):
    try:
        if settings.opts.verbose:
            print("Found case inspection!")

        info_name = show.get_name_for_address(settings, pointer.value)
        if settings.opts.verbose:
            print("    Name:", show.demangle(info_name))

        arms, tags, stacks, registers = gather_case_arms(settings, heaps, pointer.value, 1, settings.rt.word.size - 1, stack, {
            settings.rt.main_register: ptrutil.make_tagged(settings, Offset(base = CasePointer(inspection = pointer, matched_tag = DefaultTag()), index = 0)),
            settings.rt.stack_register: ptrutil.make_tagged(settings, Offset(base = StackPointer(), index = -len(stack)))
        }, stack, pointer, [])

        interp_arms = []
        for arm, tag, stack, regs in zip(arms, tags, stacks, registers):
            if settings.opts.verbose:
                print()
                print("Found case arm:")
                print("    From case:", info_name)
                print("    Pattern:", tag)
            interp_arms.append(read_code(settings, interps, heaps, arm, stack, regs))

        return Case(scrutinee = scrutinee, bound_ptr = pointer, arms = interp_arms, tags = tags)
    except:
        e_type, e_obj, e_tb = sys.exc_info()
        print("Error in processing case at", show.show_pretty_pointer(settings, pointer))
        print("    Error:", e_obj)
        print("    Error Location:", e_tb.tb_lineno)
        print("    Disassembly:")
        for insn in disasm.disasm_from(settings, pointer.value):
            print("        " + show.show_instruction(insn))
        print()
Esempio n. 2
0
def read_case(settings, worklist, heaps, pointer, stack, scrutinee):
    try:
        if settings.opts.verbose:
            print("Found case inspection!")

        info_name = show.get_name_for_address(settings, pointer.value)
        if settings.opts.verbose:
            print("    Name:", show.demangle(info_name))

        arms, tags, stacks, registers = gather_case_arms(settings, heaps, pointer.value, 1, settings.rt.word.size - 1, stack, {
            settings.rt.main_register: ptrutil.make_tagged(settings, Offset(base = CasePointer(inspection = pointer, matched_tag = DefaultTag()), index = 0)),
            settings.rt.stack_register: ptrutil.make_tagged(settings, Offset(base = StackPointer(), index = -len(stack)))
        }, stack, pointer, [])

        interp_arms = []
        for arm, tag, stack, regs in zip(arms, tags, stacks, registers):
            if settings.opts.verbose:
                print()
                print("Found case arm:")
                print("    From case:", info_name)
                print("    Pattern:", tag)
            interp_arms.append(read_code(settings, worklist, heaps, arm, stack, regs))

        return Case(scrutinee = scrutinee, bound_ptr = pointer, arms = interp_arms, tags = tags)
    except:
        e_type, e_obj, e_tb = sys.exc_info()
        print("Error in processing case at", show.show_pretty_pointer(settings, pointer))
        print("    Error:", e_obj)
        print("    Error Location:", e_tb.tb_lineno)
        print("    Disassembly:")
        for insn in disasm.disasm_from(settings, pointer.value):
            print("        " + show.show_instruction(insn))
        print()
        return UnknownInterpretation()
Esempio n. 3
0
def run_worklist(settings, interps, worklist):
    while len(worklist) > 0:
        work = worklist.pop()
        if isinstance(work, ClosureWork):
            if settings.opts.verbose:
                print("Found closure:")
                print("    Pointer:",
                      show.show_pretty_pointer(settings, work.pointer))

            if isinstance(work.pointer, Argument) or isinstance(
                    work.pointer, CaseArgument) or isinstance(
                        work.pointer, Offset) and isinstance(
                            work.pointer.base, CasePointer):
                if settings.opts.verbose:
                    print("    Simple closure!")
                    print()
                continue

            if isinstance(work.pointer, StaticValue) and show.name_is_library(
                    show.get_name_for_address(settings, work.pointer.value)):
                if settings.opts.verbose:
                    print("    Library defined!")
                    print()
                continue

            interps[work.pointer] = parse.read_closure(settings, worklist,
                                                       work.heaps,
                                                       work.pointer)
        elif isinstance(work, FunctionThunkWork):
            if settings.opts.verbose:
                print("Found function/thunk!")
                print(
                    "    Name:",
                    show.demangle(
                        show.get_name_for_address(settings, work.address)))
                print("    Arg pattern:", work.arg_pattern)

            if StaticValue(value=work.address) in interps:
                if settings.opts.verbose:
                    print("    Seen before!")
                    print()
                continue

            if show.name_is_library(
                    show.get_name_for_address(settings, work.address)):
                if settings.opts.verbose:
                    print("    Library defined!")
                    print()
                continue

            interps[StaticValue(
                value=work.address)] = parse.read_function_thunk(
                    settings, worklist, work.heaps, work.address,
                    work.main_register, work.arg_pattern)
        else:
            assert False, "bad work in worklist"

        if settings.opts.verbose:
            print()
Esempio n. 4
0
def run_worklist(settings, interps, worklist):
    while len(worklist) > 0:
        work = worklist.pop()
        if isinstance(work, ClosureWork):
            if settings.opts.verbose:
                print("Found closure:")
                print("    Pointer:", show.show_pretty_pointer(settings, work.pointer))

            if (
                isinstance(work.pointer, Argument)
                or isinstance(work.pointer, CaseArgument)
                or isinstance(work.pointer, Offset)
                and isinstance(work.pointer.base, CasePointer)
            ):
                if settings.opts.verbose:
                    print("    Simple closure!")
                    print()
                continue

            if isinstance(work.pointer, StaticValue) and show.name_is_library(
                show.get_name_for_address(settings, work.pointer.value)
            ):
                if settings.opts.verbose:
                    print("    Library defined!")
                    print()
                continue

            interps[work.pointer] = parse.read_closure(settings, worklist, work.heaps, work.pointer)
        elif isinstance(work, FunctionThunkWork):
            if settings.opts.verbose:
                print("Found function/thunk!")
                print("    Name:", show.demangle(show.get_name_for_address(settings, work.address)))
                print("    Arg pattern:", work.arg_pattern)

            if StaticValue(value=work.address) in interps:
                if settings.opts.verbose:
                    print("    Seen before!")
                    print()
                continue

            if show.name_is_library(show.get_name_for_address(settings, work.address)):
                if settings.opts.verbose:
                    print("    Library defined!")
                    print()
                continue

            interps[StaticValue(value=work.address)] = parse.read_function_thunk(
                settings, worklist, work.heaps, work.address, work.main_register, work.arg_pattern
            )
        else:
            assert False, "bad work in worklist"

        if settings.opts.verbose:
            print()
Esempio n. 5
0
def read_function_thunk(settings, interps, heaps, address, main_register, arg_pattern):
    if settings.opts.verbose:
        print("Found function/thunk!")

    if StaticValue(value = address) in interps:
        if settings.opts.verbose:
            print("    Seen before!")
        return

    info_name = show.get_name_for_address(settings, address)
    if settings.opts.verbose:
        print("    Name:", show.demangle(info_name))
        print("    Arg pattern:", arg_pattern)

    if show.name_is_library(info_name):
        if settings.opts.verbose:
            print("    Library Defined!")
            print()
        return

    extra_stack = []
    registers = {}
    registers[settings.rt.main_register] = main_register
    for i in range(len(arg_pattern)):
        if arg_pattern[i] != 'v':
            if i < len(settings.rt.arg_registers):
                registers[settings.rt.arg_registers[i]] = ptrutil.make_tagged(settings, Argument(index = i, func = address))
            else:
                extra_stack.append(ptrutil.make_tagged(settings, Argument(index = i, func = address)))

    interps[StaticValue(value = address)] = None
    body = read_code(settings, interps, heaps, address, extra_stack, registers)
    if arg_pattern == '':
        interps[StaticValue(value = address)] = body
    else:
        interps[StaticValue(value = address)] = Lambda(func = address, arg_pattern = arg_pattern, body = body)