def replace_sym_const(ea, api): for arg_n in api_list[api].keys(): # Calling Convention: cdecl, stdcall push_cnt = 0 ea_search = ea while push_cnt < arg_n: ea_search = idc.prev_head(ea_search) op = idc.print_insn_mnem(ea_search) if op == "push": push_cnt += 1 operand = idc.print_operand(ea_search, 0) if operand.isdigit(): operand = int(idc.print_operand(ea_search, 0)) else: continue enum_name = api + "_" + str(arg_n) const = api_list[api][arg_n][operand] enum_id = ida_enum.get_enum(enum_name) if enum_id == BADADDR: # add new enum enum_qty = ida_enum.get_enum_qty() enum_id = ida_enum.add_enum(enum_qty, enum_name, 0) symbolic_id = ida_enum.get_enum_member_by_name(const) if symbolic_id == BADADDR: # add new enum member ida_enum.add_enum_member(enum_id, const, operand, 0xffffffff) ida_bytes.op_enum(ea_search, 0, enum_id, 0)
def update_idb(self): id = ida_enum.get_enum(self._name) if idc.BADADDR == id: id = ida_enum.add_enum(idc.BADADDR, self._name, idaapi.decflag()) keys = self._values.keys() keys.sort() for k in keys: ida_enum.add_enum_member(id, self._values[k], k)
def set_enum(bs_enum: Enum): _enum = ida_enum.get_enum(bs_enum.name) if not _enum: return False ida_enum.del_enum(_enum) enum_id = ida_enum.add_enum(ida_enum.get_enum_qty(), bs_enum.name, 0) if enum_id is None: l.warning(f"IDA failed to create a new enum with {bs_enum.name}") return False for member_name, value in bs_enum.members.items(): ida_enum.add_enum_member(enum_id, member_name, value) return True
def create(cls, name): """ Class method allowing to create a new empty enum. :param str name: The name of the enum to create. If this is ``None`` a default name ``enum_INT`` will be created by IDA. :raise ValueError: If the enum ``name`` already exist. :raise RuntimeError: If it was not possible to create the enum. :return: A :class:`BipEnum` object corresponding to the newly created enum. """ eid = ida_enum.get_enum(name) if eid != idc.BADADDR: raise ValueError("Enum {} already exist".format(name)) eid = ida_enum.add_enum(idc.BADADDR, name, 0) if eid == idc.BADADDR: raise RuntimeError("Unable to create enum {}".format(name)) return cls(eid)
def load(infos): for info in infos: enum_id = ida_enum.get_enum(info['name']) if enum_id == BADADDR: print('[IDA-Sync] Creating new enum %s.' % info['name']) enum_id = ida_enum.add_enum( info['idx'], info['name'], info['flag'], ) else: ida_enum.set_enum_idx(enum_id, info['idx']) ida_enum.set_enum_flag(enum_id, info['flag']) ida_enum.set_enum_width(enum_id, info['width']) for member in info['members']: ida_enum.add_enum_member( enum_id, member['name'], member['value'])
def __call__(self): ida_enum.add_enum(self.enum, Event.encode(self.name), 0)
def __call__(self): ida_enum.add_enum(self.enum, self.name, 0)
def implement(self): ida_enum.add_enum(int(self._id), self._name, 0)