def activate(self, ctx): cur_ea = ida_kernwin.get_screen_ea() pfn = ida_funcs.get_func(cur_ea) if pfn: v = ida_kernwin.get_current_viewer() result = ida_kernwin.get_highlight(v) if result: stkvar_name, _ = result frame = ida_frame.get_frame(cur_ea) sptr = ida_struct.get_struc(frame.id) mptr = ida_struct.get_member_by_name(sptr, stkvar_name) if mptr: fii = ida_funcs.func_item_iterator_t() ok = fii.set(pfn) while ok: ea = fii.current() F = ida_bytes.get_flags(ea) for n in range(ida_ida.UA_MAXOP): if not ida_bytes.is_stkvar(F, n): continue insn = ida_ua.insn_t() if not ida_ua.decode_insn(insn, ea): continue v = ida_frame.calc_stkvar_struc_offset( pfn, insn, n) if v >= mptr.soff and v < mptr.eoff: print("Found xref at 0x%08x, operand #%d" % (ea, n)) ok = fii.next_code() else: print("No stack variable named \"%s\"" % stkvar_name) else: print("Please position the cursor within a function")
def FuncItems(start): """ Get a list of function items @param start: address of the function @return: ea of each item in the function """ func = ida_funcs.get_func(start) if not func: return fii = ida_funcs.func_item_iterator_t() ok = fii.set(func) while ok: yield fii.current() ok = fii.next_code()
def __process_function_labels(self, func): labels = list() it = ida_funcs.func_item_iterator_t() if not it.set(func): return labels while it.next_code(): ea = it.current() name = ida_name.get_visible_name(ea, ida_name.GN_LOCAL) if name != '': labels.append({ 'offset' : ea - func.start_ea, 'name' : name, 'is_public' : ida_name.is_public_name(ea), 'is_autonamed' : ida_bytes.get_full_flags(ea) & ida_bytes.FF_LABL != 0 }) return labels