示例#1
0
def _erase_reg_in_range(s_ea, e_ea, reg):
    pfn = ida_funcs.get_func(s_ea)

    ea = s_ea
    prev_ranges = []

    #if there was a rename range with this reg containing the start of the range (s_ea) - remember it
    prev_range_s = ida_frame.find_regvar(pfn, s_ea, reg)
    if (prev_range_s is not None) and (prev_range_s.start_ea < s_ea):
        prev_ranges += [(prev_range_s.start_ea, s_ea, prev_range_s.user)]

    #if there was a rename range with this reg containing the end of the range (e_ea) - remember it
    prev_range_s = ida_frame.find_regvar(pfn, e_ea, reg)
    if (prev_range_s is not None) and (prev_range_s.start_ea <
                                       e_ea) and (prev_range_s.end_ea > e_ea):
        prev_ranges += [(e_ea, prev_range_s.end_ea, prev_range_s.user)]

    debug('Delete range %x : %x - %s' % (s_ea, e_ea, reg))
    #deletion seems to require actual existing range - so we'll change the name to orig, and then delete it
    idc.MakeLocal(s_ea, e_ea, reg, reg)
    idc.Refresh()
    ida_frame.del_regvar(pfn, s_ea, e_ea, reg)
    idc.Refresh()

    #restore ranges
    for s_ea, e_ea, reg_new_name in prev_ranges:
        debug('Restore range %x : %x - %s->%s' %
              (s_ea, e_ea, reg, reg_new_name))
        idc.MakeLocal(s_ea, e_ea, reg, reg_new_name)
        idc.Refresh()
示例#2
0
def main():
    is_selected, sel_start, sel_end = ida_kernwin.read_selection()
    if not is_selected:
        logger.error('range must be selected')
        return -1

    sel_end = ida_bytes.next_head(sel_end)

    buf = ida_bytes.get_bytes(sel_start, sel_end - sel_start)
    if buf is None:
        logger.error('failed to fetch instruction bytes')
        return -1

    f = ida_funcs.get_func(sel_start)
    if f != ida_funcs.get_func(sel_end):
        logger.error('range must be within a single function')
        return -1

    # find mappings from "$localN" to "custom_name"
    regvars = {}
    for i in range(0x1000):
        regvar = ida_frame.find_regvar(f, sel_start, '$local%d' % i)
        if regvar is None:
            continue
        regvars[regvar.canon] = regvar.user

        if len(regvars) >= f.regvarqty:
            break

    globals_ = {}
    for i, offset in netnode.Netnode('$ wasm.offsets').get('globals',
                                                           {}).items():
        globals_['$global' + i] = ida_name.get_name(offset)

    frame = {}
    if f.frame != ida_idaapi.BADADDR:
        names = set([])
        for i in range(ida_struct.get_struc_size(f.frame)):
            s = ida_struct.get_struc(f.frame)
            if not s:
                continue
            m = ida_struct.get_member(s, i)
            if not m:
                continue
            name = ida_struct.get_member_name(m.id)
            if name in names:
                continue
            frame[i] = name
            names.add(name)

    emu = Emulator(buf)
    emu.run()
    print(
        emu.render(ctx={
            'regvars': regvars,
            'frame': frame,
            'globals': globals_,
        }))
示例#3
0
def get_reg_canon_to_user(ea):
    from idautils import GetRegisterList
    from ida_frame import find_regvar
    from ida_funcs import get_func

    d = {}

    for canon in GetRegisterList():
        regvar = find_regvar(get_func(ea), ea, canon)
        if regvar:
            d[canon] = regvar.user

    return d
示例#4
0
def get_reg_user_to_canon(ea=None):
    from idautils import GetRegisterList
    from ida_frame import find_regvar
    from ida_funcs import get_func

    if ea is None:
        ea = idc.get_screen_ea()

    d = {}

    for canon in GetRegisterList():
        regvar = find_regvar(get_func(ea), ea, canon)
        if regvar:
            #d[canon] = regvar.user
            d[regvar.user] = canon

    return d