def _get_user_selected_functions(self, many=False): functions = [] ea = ida_shims.get_screen_ea() try: current_function = ida_shims.get_func_attr(ea, idc.FUNCATTR_START) except: current_function = None while True: function = ida_shims.choose_func( "Select a function and click 'OK' until all functions have " "been selected. When finished, click 'Cancel' to display the " "graph.") if ida_shims.get_screen_ea() != ea: ida_shims.jumpto(ea) if not function or \ function == idc.BADADDR or function == current_function: break elif function not in functions: functions.append(function) if not many: break return functions
def FindPathsToCodeBlock(self): target = ida_shims.get_screen_ea() source = self._current_function() if source: self._find_and_plot_paths( [source], [target], klass=AlleyCatCodePaths)
def from_function_profiler(arg=None): try: chooser = IDAFunctionProfilerChooser() cur_loc = ida_shims.get_screen_ea() func = idaapi.get_func(cur_loc) if func: start_ea = ida_shims.start_ea(func) chooser.set_internal_filter(functions=set([start_ea])) else: raise Exception("Can't limit profile to just this function, " "because 0x%X is not inside a function!" % cur_loc) chooser.show() except Exception as e: print "IDAFunctionProfiler ERROR: %s" % str(e)
def _profile_function(self): current_ea = ida_shims.get_screen_ea() current_function = ida_shims.get_func_name(current_ea) current_function_ea = ida_shims.get_name_ea_simple(current_function) if current_function: self.function = current_function ea = ida_shims.get_func_attr(current_function_ea, idc.FUNCATTR_START) end_ea = ida_shims.get_func_attr(current_function_ea, idc.FUNCATTR_END) self.highlighted = ida_shims.get_highlighted_identifier() while ea < end_ea and ea != idc.BADADDR and self.highlighted: i = 0 match = False optype = self.READ insn = ida_shims.decode_insn(ea) mnem = ida_shims.print_insn_mnem(ea) if self.highlighted in mnem: match = True elif idaapi.is_call_insn(ea): for xref in idautils.XrefsFrom(ea): if xref.type != 21: name = ida_shims.get_name(xref.to) if name and self.highlighted in name: match = True break else: while True: opnd = ida_shims.print_operand(ea, i) if opnd: if self.highlighted in opnd: canon_feature = ida_shims.get_canon_feature(insn) match = True if canon_feature & self.OPND_WRITE_FLAGS[i]: optype = self.WRITE i += 1 else: break if not match: comment = idc.GetCommentEx(ea, 0) if comment and self.highlighted in comment: match = True else: comment = idc.GetCommentEx(ea, 1) if comment and self.highlighted in comment: match = True else: comment = None if match: if ea > current_ea: direction = self.DOWN elif ea < current_ea: direction = self.UP else: direction = self.THIS self.xrefs[ea] = { 'offset': ida_shims.get_func_off_str(ea), 'mnem': mnem, 'type': optype, 'direction': direction, 'text': idc.GetDisasm(ea), } ea = ida_shims.next_head(ea)
def _current_function(self): function = idaapi.get_func(ida_shims.get_screen_ea()) return ida_shims.start_ea(function)