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()
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_, }))
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
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