Пример #1
0
    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])
Пример #2
0
    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)