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 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 add(self, name, value): """ Property for adding a new member to this enum. :param str name: The name of the new member to add. :param int value: The value of the new member to add. :raise RuntimeError: If it was not possible to add the new member. """ if ida_enum.add_enum_member(self._eid, name, value, ida_enum.DEFMASK) != 0: raise RuntimeError( "Unable to add new member {} ({}) to enum {}".format( name, value, self.name))
def __call__(self): enum = ida_enum.get_enum(Event.encode(self.ename)) ida_enum.add_enum_member(enum, Event.encode(self.name), self.value, self.bmask)
def __call__(self): enum = ida_enum.get_enum(self.ename) ida_enum.add_enum_member(enum, self.name, self.value, self.bmask)
def implement(self): id_of_enum = ida_enum.get_enum(str(self._id)) ida_enum.add_enum_member(id_of_enum, self._name, long(self._value))
def implement(self): ida_enum.add_enum_member(self._id, self._name, self._value)