Beispiel #1
0
def GetNameFlags(name, ea):
    flags = 0
    # we don't know what name_value is...
    name_value, _name_value = idaapi.get_name_value(ea, name)

    # 	if(addr != ea):
    # 		if(addr == (ea | 0x100000000) or addr == (ea & 0xFFFFFFFF)):
    # 			logger.warn("(IDA bug) get_name_value returned bad address : 0x%016X (instead of 0x%016X)" % (addr, ea))
    # 		else:
    # 			logger.warn("get_name_value returned bad address : "\
    # "0x%016X (instead of 0x%016X), using idc.SN_CHECK" % (addr, ea))
    # return default value used by MakeName
    # 			return idc.SN_CHECK

    if name_value == idaapi.NT_LOCAL:
        # see name.hpp : LOCAL names can not be public nor weak, and are not listed
        flags |= idaapi.SN_LOCAL | idaapi.SN_NON_PUBLIC | idaapi.SN_NON_WEAK | idaapi.SN_NOLIST
    else:
        if idaapi.is_public_name(ea):
            flags |= idaapi.SN_PUBLIC
        else:
            flags |= idaapi.SN_NON_PUBLIC

        if idaapi.is_weak_name(ea):
            flags |= idaapi.SN_WEAK
        else:
            flags |= idaapi.SN_NON_WEAK

        if idaapi.is_in_nlist(ea) is False:
            flags |= idaapi.SN_NOLIST

    ida_flags = idc.GetFlags(ea)

    if idaapi.has_user_name(ida_flags) or idc.hasUserName(ida_flags):
        flags |= idc.SN_NON_AUTO
    elif idaapi.has_auto_name(ida_flags):
        flags |= idc.SN_AUTO
    elif idaapi.has_dummy_name(ida_flags):
        # names like "dword_XXXX"
        flags |= idc.SN_AUTO
    else:
        logger.debug("name is not user nor auto?? at 0x%016X : 0x%08X" % (ea, ida_flags))

    return flags
Beispiel #2
0
 def contains(cls, ea):
     '''Return whether the address `ea` is referenced in the names list.'''
     return idaapi.is_in_nlist(ea)
Beispiel #3
0
 def contains(cls, ea):
     return idaapi.is_in_nlist(ea)
Beispiel #4
0
 def contains(cls, ea):
     '''Return whether the address `ea` is referenced in the names list.'''
     return idaapi.is_in_nlist(ea)
Beispiel #5
0
def name(ea=None, *args, **kwds):
    """name(ea), name(ea, string)
    First syntax returns the name at the given address.
    Second syntax changes the name at the given address.
    """
    if len(args) > 1:
        raise TypeError, "{:s}() takes exactly {!r} arguments ({:d} given)".format(
            'name', (1, 2),
            len(args) + 1 + len(kwds))
    if kwds and tuple(kwds.keys()) != ('string', ):
        raise TypeError, "{:s}() got an unexpected keyword argument '{:s}'".format(
            'name',
            filter(lambda n: n != 'string', kwds.keys())[0])

    ea = ui.current.address() if ea is None else ea
    if len(args) == 1 or kwds.has_key('string'):
        string = kwds.get('string', args[0])
        assert idaapi.SN_NOCHECK == 0, '%s.name : idaapi.SN_NOCHECK != 0' % __name__
        SN_NOLIST = idaapi.SN_NOLIST
        SN_LOCAL = idaapi.SN_LOCAL
        SN_NON_PUBLIC = idaapi.SN_NON_PUBLIC

        if idaapi.has_any_name(idaapi.getFlags(ea)):
            pass

        flags = idaapi.SN_NON_AUTO
        flags |= 0 if idaapi.is_in_nlist(ea) else idaapi.SN_NOLIST
        flags |= idaapi.SN_WEAK if idaapi.is_weak_name(
            ea) else idaapi.SN_NON_WEAK
        flags |= idaapi.SN_PUBLIC if idaapi.is_public_name(
            ea) else idaapi.SN_NON_PUBLIC

        try:
            function.top(ea)
            flags |= idaapi.SN_LOCAL
        except Exception:
            flags &= ~idaapi.SN_LOCAL

        try:
            # check if we're a label of some kind
            f = idaapi.getFlags(ea)
            if idaapi.has_dummy_name(f) or idaapi.has_user_name(f):
                # that is referenced by an array with a correctly sized pointer inside it
                (r, sidata), = ((r, type.array(r)) for r in xref.data_up(ea))
                if config.bits() == sidata.itemsize * 8 and ea in sidata:
                    # which we check to see if it's a switch_info_t
                    si, = (idaapi.get_switch_info_ex(r)
                           for r in xref.data_up(r))
                    if si is not None:
                        # because it's name has it's local flag cleared
                        flags ^= idaapi.SN_LOCAL
        except:
            pass

        res, ok = name(ea), idaapi.set_name(ea, string or "", flags)
        tag(ea, 'name', string)
        assert ok, '%s.name : unable to call idaapi.set_name(%x, %r, %x)' % (
            __name__, ea, string, flags)
        return res

    try:
        return tag(ea, 'name')
    except KeyError:
        pass
    return None
Beispiel #6
0
 def hasListedName(ea=None):
     ea = ui.current.address() if ea is None else ea
     return idaapi.is_in_nlist(ea)