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()
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
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
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
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
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
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
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
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
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
def is_expr(node): return type(node) == type(ida_hexrays.cexpr_t())