Exemple #1
0
    def _replace_with_check_helper(self, ctx, l): # type: (...) -> None
        type_name_ea = ctx.type_info_obj.obj_ea
        name = idaapi.demangle_name(idaapi.get_name(type_name_ea), 0)
        if not name:
            name = idaapi.get_name(type_name_ea)

        type_name = name
        var_type = None
        if "::getRuntimeTypeInfoStatic(void)::typeInfo" in name:
            type_name = name.split("::getRuntimeTypeInfoStatic(void)::typeInfo")[0]
            var_type = idaapi.tinfo_t()
            idaapi.parse_decl2(idaapi.cvar.idati, type_name + "*;", var_type, idaapi.PT_TYP)
            if not str(var_type):
                var_type = None

        call_expr = make_helper_call("void*", "dynamic_cast<" + type_name + ">", ["void*"])
        call_expr.a.push_back(make_carg_t(ctx.original_var))

        asg_expr = hr.cexpr_t()
        asg_expr.op = hr.cot_asg
        asg_expr.x = hr.cexpr_t()
        asg_expr.x.assign(ctx.dynamic_cast_var)
        asg_expr.y = call_expr
        asg_expr.type = var_type if var_type else idaapi.tinfo_t(idaapi.BT_VOID)

        if var_type:
            self._types_to_set.append((ctx.dynamic_cast_var.v.idx, var_type))

        replace_expr_with(l[0].cexpr, asg_expr)
        for item in l[1:]:
            item.cleanup()
Exemple #2
0
def make_asgn_expr(left, right):
    expr = ida_hexrays.cexpr_t()
    expr.op = ida_hexrays.cot_asg
    expr.x = left
    expr.y = right
    expr.type = left.type
    return expr
Exemple #3
0
def make_number_expr(val):
    expr = ida_hexrays.cexpr_t()
    expr.op = ida_hexrays.cot_num
    expr.n = ida_hexrays.cnumber_t()
    expr.n._value = val
    expr.type = ida_hexrays.dummy_ptrtype(4, False)
    return expr
Exemple #4
0
def make_memref_expr(vexpr, offset):
    expr = ida_hexrays.cexpr_t()
    expr.op = ida_hexrays.cot_memref
    expr.x = vexpr
    expr.m = offset
    expr.type =  ida_hexrays.dummy_ptrtype(4, False)
    return expr
Exemple #5
0
def make_helper_expr(name, typ=False):
    obj = ida_hexrays.cexpr_t()
    obj.op = ida_hexrays.cot_helper
    obj.exflags |= ida_hexrays.EXFL_ALONE
    obj.helper = name
    if typ is not False:
        obj.type = typ
    return obj
Exemple #6
0
def make_var_expr(number, type, m, arg=False):
    if arg is False:
        expr = ida_hexrays.cexpr_t()
    else:
        expr = ida_hexrays.carg_t()
    expr.op = ida_hexrays.cot_var
    expr.v = ida_hexrays.var_ref_t()
    expr.v.idx = number
    expr.type = type
    expr.v.mba = m
    return expr
Exemple #7
0
def make_obj_expr(ea, type=None, arg=False):
    if arg is False:
        expr = ida_hexrays.cexpr_t()
    else:
        expr = ida_hexrays.carg_t()
    expr.op = ida_hexrays.cot_obj
    expr.obj_ea = ea
    if type is None:
        expr.type = ida_hexrays.dummy_ptrtype(4, False)
    else:
        expr.type = type
    return expr
Exemple #8
0
def make_helper_call(ret_type, name, arg_types): # type: (str, str, typing.List[str]) -> hr.cexpr_t
    """Make a call expression to a helper function (non-existing function with arbitrary name)."""

    helper_expr = hr.cexpr_t()
    helper_expr.ea = idaapi.BADADDR
    helper_expr.op = hr.cot_helper
    helper_expr.helper = name

    call_expr = hr.cexpr_t()
    call_expr.op = hr.cot_call
    call_expr.x = helper_expr
    call_expr.a = hr.carglist_t()

    # EXTREMELY IMPORTANT: set the expression types. Without this, Hex-Rays will crash
    # in mysterious ways.
    t = idaapi.tinfo_t()
    idaapi.parse_decl2(idaapi.cvar.idati, "%s (__cdecl *)(%s);" % (ret_type, ','.join(arg_types)),
                       t, idaapi.PT_TYP)
    helper_expr.type = t
    call_expr.a.functype = t
    call_expr.type = t.get_rettype()

    return call_expr
Exemple #9
0
    def invert_if(self, insn):

        if insn.opname != 'if':
            return False

        cif = insn.details

        if not cif.ithen or not cif.ielse:
            return False

        ida_hexrays.qswap(cif.ithen, cif.ielse)
        # Make a copy of 'cif.expr': 'lnot' might destroy its toplevel
        # cexpr_t and return a pointer to its direct child (but we'll want to
        # 'swap' it later, the 'cif.expr' cexpr_t object must remain valid.)
        cond = ida_hexrays.cexpr_t(cif.expr)
        notcond = ida_hexrays.lnot(cond)

        cif.expr.swap(notcond)

        return True
Exemple #10
0
def make_call_expr(fcnexpr, args):
    expr = ida_hexrays.cexpr_t()
    expr.op = ida_hexrays.cot_call
    expr.x = fcnexpr
    expr.a = ida_hexrays.carglist_t()
    return expr
Exemple #11
0
def is_expr(node):
    return type(node) == type(ida_hexrays.cexpr_t())