def build_function(self, line): name = self.clean_name(line.get("name")) parameter = line.get("parameter") functionType = line.get("functionType") if functionType != None: returntype = functionType.get("returnType") parametertypes = functionType.get("parameter") function_signature = self.get_type_string( returntype) + " " + name + "(" if len(parameter) > len(parametertypes): parameter_count = len(parameter) else: parameter_count = len(parametertypes) for parameter_index in range(parameter_count): if parameter_index != 0: function_signature = function_signature + " ," try: parameter_indentifier = str( parameter[parameter_index][1].get("name")) except (IndexError, TypeError): parameter_indentifier = "UNKNOWN" if parameter_indentifier == " " or parameter_indentifier == "" or parameter_indentifier == None: parameter_indentifier = "UNKNOWN" try: parameter_type = self.get_type_string( parametertypes[parameter_index][1]) if parameter_type == "" or parameter_type == " " or parameter_type == None: parameter_type = "_UNKNOWN" current_type = parametertypes[parameter_index][1] if current_type: if current_type.get("table") == "ArrayType": size = current_type.get("size") function_signature = function_signature + parameter_type + " " + parameter_indentifier + " [" + str( size) + "]" else: function_signature = function_signature + parameter_type + " " + parameter_indentifier except (IndexError): parameter_type = "_UNKNOWN" function_signature = function_signature + parameter_type + " " + parameter_indentifier function_signature = function_signature + ")" else: function_signature = "void " + name + "()" if not self.createCSV: IDAtools.set_function_type(name, function_signature) else: self.csvLines.append([name, function_signature])
def import_database(gui_Object, referenceFilePath, additionalPathList): csvFiles = [] #save produced csv files referencePDOM = referenceFilePath.split("/")[-1] additionalPathList.append(referenceFilePath) pathMap = {} #save path of the database of each used pdom progress_counter = 1 symbol_builder = SymbolBuilder(True) #search in each database for possible signatures for database_path in additionalPathList: gui_Object.set_state("Build CSV " + str(progress_counter) + "/" + str(len(additionalPathList))) progress_counter = progress_counter + 1 currentPath = os.getcwd() try: os.mkdir(currentPath + "/comparedDatabases") except: pass csvFolder = currentPath + "/comparedDatabases/" created_csv_path = csvFolder + database_path.split( "/")[-1] + "." + str(time.time()) + ".csv" Controller = SqlController(database_path) #search for signatures and produce csv: listOfFunctioNames = IDAtools.get_names() ReadDatabase.import_symbols_from_list(Controller, gui_Object, listOfFunctioNames, symbol_builder) symbol_builder.write_csv(created_csv_path, database_path.split("/")[-1]) #clear searched symbols for next database IDAtools.clean_dict() symbol_builder.clean_csvLines() csvFiles.append(created_csv_path) pathMap[database_path.split("/")[-1]] = database_path #create final signature file finalSignaturesCSVPath = SignatureBuilder.get_final_signature_csv( csvFiles, referencePDOM, csvFolder) listImportSig = list( csv.reader(open(finalSignaturesCSVPath, 'r'), delimiter=";")) #import final signatures symbol_builder.set_writeCSV(False) controllerMap = {} progressCounter = 0 for line in listImportSig: #[symbolName, signature, databasePDOM1, databasePDOM2, ....] gui_Object.set_progress( int(progressCounter / len(listImportSig) * 100)) progressCounter = progressCounter + 1 gui_Object.set_state("Import best signatures") symbol = line[0] signature = line[1] for pdoms in line[2:]: if not pdoms in controllerMap: controllerMap[pdoms] = SqlController(pathMap[pdoms]) Controller = controllerMap[pdoms] ReadDatabase.import_symbols_from_list(Controller, gui_Object, [symbol], symbol_builder) IDAtools.set_function_type(symbol, signature, True)