示例#1
0
    def __edit_text_analyse__(self, a: apk.APK, d: DalvikVMFormat,
                              dx: Analysis):

        # load keywords
        with open(
                os.path.join(os.path.dirname(__file__),
                             "assets" + os.path.sep + 'pii_keywords.txt'),
                'r') as file:
            keywords: [str] = file.read().splitlines(False)

        # parse flowdroid results
        folder = os.path.join(os.path.dirname(__file__),
                              "results" + os.path.sep + "flowdroid")

        file_name = a.get_filename().split(os.path.sep)[-1][:-4]
        fd_path = os.path.join(folder, file_name + ".xml")

        self.leak_id_names: [str] = []

        if not os.path.exists(fd_path):
            print("Flowdroid result doesn't exist")
            return

        resource_list = self.__analyse_flowdroid_result__(fd_path)

        resource_ids = []
        for s_id, s_method, s_statement, sink_method, sink_statement in resource_list:
            resource_ids.append(s_id)

        # find Resource class
        package_name = a.get_package()
        package_name = package_name.replace(".", "/")

        cls: ClassDefItem = d.get_class("L" + package_name +
                                        "/R$id;")  # find resource id
        if cls is None:
            print("This application doesn't have an R class")
            return

        fields: [EncodedField] = cls.get_fields()

        # match ids with keywords
        for field in fields:
            field: EncodedField = field
            value: EncodedValue = field.get_init_value()

            # resource id -> resource name
            the_value = str(value.get_value())
            field_name = field.get_name()
            if the_value in resource_ids and field_name in keywords:
                self.leak_id_names.append(field_name)