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)
Example #2
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)
Example #3
0
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
Example #4
0
    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)
Example #5
0
    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)
Example #7
0
 def __call__(self):
     ida_enum.add_enum(self.enum, self.name, 0)
Example #8
0
 def implement(self):
     ida_enum.add_enum(int(self._id), self._name, 0)