def ordinal(self): """ Property which return the ordinal of this function. :return int: The number corresponding to the ordinal of this function. """ return idaapi.get_func_num(self.ea)
def resolve(self, address, nids, symbol): # Resolve the NID... idc.set_cmt(self.VALUE, 'NID: ' + symbol, False) function = nids.get(symbol[:11], symbol) #print('Function: %s | number: %s' % (function, idaapi.get_func_num(self.VALUE))) if idaapi.get_func_num(self.VALUE) > 0: idc.del_func(self.VALUE) if self.VALUE > 0: idc.add_func(self.VALUE) idc.add_entry(self.VALUE, self.VALUE, function, True) idc.set_name(self.VALUE, function, SN_NOCHECK | SN_NOWARN) idc.set_cmt(address, '%s | %s' % (function, self.info()), False)
def _priority_paint_functions(self, target_address): """ Paint functions in the immediate vicinity of the given address. This will paint both the instructions & graph nodes of defined functions. """ database_coverage = self._director.coverage # the number of functions before and after the cursor to paint FUNCTION_BUFFER = 1 # determine range of functions to repaint func_num = idaapi.get_func_num(target_address) func_num_start = func_num - FUNCTION_BUFFER func_num_end = func_num + FUNCTION_BUFFER + 1 # we will save the instruction addresses painted by our function paints function_instructions = set() # repaint the specified range of functions for num in xrange(func_num_start, func_num_end): function = idaapi.getn_func(num) if not function: continue # repaint the function self.paint_function(function) # NOTE/COMPAT: if using_ida7api: start_ea = function.start_ea else: start_ea = function.startEA # get the function coverage data for the target address function_coverage = database_coverage.functions.get(start_ea, None) if not function_coverage: continue # extract the painted instructions in this function function_instructions |= function_coverage.instructions # return the instruction addresses painted return function_instructions
def _addRefs(self, startea) -> bool: self.__plugin.log('Adding references', LogOptions.LOG_DEBUG) if idaapi.get_func_num(startea) != -1: sig = SigCreateStruct() sig.dwStartAddress = startea sig.dwCurrentAddress = startea sig.eType = PatternType.PT_DIRECT self.Sigs.append(sig) self.__plugin.log('Added direct reference 0x%X' % startea, LogOptions.LOG_DEBUG) eaCurrent = idaapi.get_first_cref_to(startea) while eaCurrent != BADADDR: if eaCurrent != startea: sig = SigCreateStruct() sig.dwStartAddress = eaCurrent sig.dwCurrentAddress = eaCurrent sig.eType = PatternType.PT_REFERENCE self.Sigs.append(sig) self.__plugin.log('Added reference 0x%X' % eaCurrent, LogOptions.LOG_DEBUG) if self.__plugin.Settings.maxRefs > 0 and len( self.Sigs) >= self.__plugin.Settings.maxRefs: break eaCurrent = idaapi.get_next_cref_to(startea, eaCurrent) if len(self.Sigs) < 5: self.__plugin.log( 'Not enough references were found (%i so far), trying the function.' % len(self.Sigs), LogOptions.LOG_DEBUG) func = idaapi.get_func(startea) if not func or func.start_ea == BADADDR: self.__plugin.log('Selected address not in a valid function.', LogOptions.LOG_ERROR) return False if func.start_ea != startea: eaCurrent = idaapi.get_first_cref_to(func.start_ea) while eaCurrent != BADADDR: if eaCurrent != startea: sig = SigCreateStruct() sig.dwStartAddress = func.start_ea sig.dwCurrentAddress = eaCurrent sig.eType = PatternType.PT_FUNCTION self.Sigs.append(sig) self.__plugin.log('Added function 0x%X' % eaCurrent, LogOptions.LOG_DEBUG) if self.__plugin.Settings.maxRefs > 0 and len( self.Sigs) >= self.__plugin.Settings.maxRefs: break eaCurrent = idaapi.get_next_cref_to( func.start_ea, eaCurrent) if not len(self.Sigs): self.__plugin.log( 'Automated signature generation failed, no references found.', LogOptions.LOG_ERROR) return False self.__plugin.log('Added %i references.' % len(self.Sigs), LogOptions.LOG_DEBUG) return True