Iryna Pliss

40 papers C 5Misc 3Journal 2Unranked 30
YearRankTypeTitle / Venue / Authors
2025 conf
CMIS
Sergiy Popov, Iryna Pliss, Olha Chala, Olexii Holovin
2025 conf
ACIT
Yevgeniy V. Bodyanskiy, Sergiy Popov, Iryna Pliss, Olha Chala, Pavlo Mulesa
2025 conf
ProfIT AI
Sergiy Popov, Iryna Pliss, Oleh Zolotukhin, Maryna Kudryavtseva
2025 conf
ISW-CoLInS
Yevgeniy V. Bodyanskiy, Ivan Izonin, Iryna Pliss, Olha Chala, Sergiy Popov
2024 conf
ISDMCI (2)
Yevgeniy V. Bodyanskiy, Olha Chala, Iryna Pliss, Sergiy Popov
2024 conf
FNC/MobiSPC/SEIT
Ivan Izonin, Roman Tkachenko, Kyrylo Yemets, Michal Gregus, Yevhen Tomashy, Iryna Pliss
2024 C conf
IDDM
Ivan Izonin, Roman Tkachenko, Iryna Pliss, Yaroslav Tolstyak, Kyrylo Yemets, Olha Chala, Myroslav Havryliuk, Stéphane Chrétien
2024 J jnl
Comput.
Ivan Izonin, Roman Tkachenko, Pavlo Yendyk, Iryna Pliss, Yevgeniy V. Bodyanskiy, Michal Gregus
2024 conf
ProfIT AI
Sergiy Popov, Iryna Pliss, Olexii Holovin, Oleh Zolotukhin, Larysa Chala
2024 conf
ACIT
Olha Chala, Ivan Izonin, Iryna Pliss, Yevgeniy V. Bodyanskiy
2023 conf
CMIS
Alina Shafronenko, Yevgeniy V. Bodyanskiy, Iryna Pliss
2021 conf
ACIT
Alina Albasova, Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss
2021 conf
CMIS
Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss, Oleksandr Zeleniy
2021 conf
CSIT (1)
Yevgeniy V. Bodyanskiy, Olha Chala, Anastasiia O. Deineko, Iryna Pliss
2020 Misc conf
CSIT
Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss, Olha Chala
2020 conf
CSIT (1)
Yevgeniy V. Bodyanskiy, Olha Chala, Iryna Pliss, Anastasiia O. Deineko
2020 conf
ACIT
Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss, Olha Chala
2020 conf
ACIT
Alina Shafronenko, Yevgeniy V. Bodyanskiy, Iryna Pliss, Sergiy Popov
2020 conf
DSMP
Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss, Olha Chala, Anna Nortsova
2020 C conf
IDDM
Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss, Olha Chala
2019 conf
IDAACS
Yevgeniy V. Bodyanskiy, Olena O. Boiko, Iryna Pliss, Valentyna Volkova
2019 conf
DCSMart
Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss, Valeriia Slepanska
2019 conf
ACIT
Alina Shafronenko, Yevgeniy V. Bodyanskiy, Iryna Pliss, Kateryna Patlan
2019 C conf
IDDM
Yevgeniy V. Bodyanskiy, Anastasiia O. Deineko, Iryna Pliss, Olha Chala
2019 conf
IDAACS
Nonna Kulishova, Yevgeniy V. Bodyanskiy, Iryna Pliss
2018 conf
DSMP
Anastasiia O. Deineko, Polina Ye. Zhernova, Boris Gordon, Oleksandr O. Zayika, Iryna Pliss, Nelya Pabyrivska
2018 conf
DSMP
Yevgeniy V. Bodyanskiy, Iryna Pliss, Daria S. Kopaliani, Olena O. Boiko
2018 C conf
FedCSIS
Yevgeniy V. Bodyanskiy, Galina Setlak, Olena Vynokurova, Iryna Pliss, Olena O. Boiko
2018 conf
ACIT
Iryna Pliss, Olena O. Boiko, Valentyna Volkova, Yevgeniy V. Bodyanskiy
2018 conf
ACIT
Yevgeniy V. Bodyanskiy, Iryna Pliss, Olena Vynokurova
2017 conf
EUSFLAT/IWIFSGN (3)
Galina Setlak, Yevgeniy V. Bodyanskiy, Iryna Pliss, Olena Vynokurova, Dmytro Peleshko, Illya Kobylin
2017 conf
DepCoS-RELCOMEX
Yevgeniy V. Bodyanskiy, Olena Vynokurova, Iryna Pliss, Dmytro Peleshko, Yuriy Rashkevych
2017 J jnl
Autom. Control. Comput. Sci.
Iryna Pliss, Iryna Perova
2016 conf
DSMP
Yevgeniy V. Bodyanskiy, Artem Dolotov, Iryna Pliss, Mykola Malyar
2016 C conf
FedCSIS
Galina Setlak, Yevgeniy V. Bodyanskiy, Olena Vynokurova, Iryna Pliss
2016 conf
DSMP
Yevgeniy V. Bodyanskiy, Olena Vynokurova, Iryna Pliss, Galina Setlak, Pavlo Mulesa
2016 conf
DepCoS-RELCOMEX
Yevgeniy V. Bodyanskiy, Olena Vynokurova, Iryna Pliss, Dmytro Peleshko, Yuriy Rashkevych
2016 conf
DSMP
Iryna Perova, Iryna Pliss, Gennadiy Churyumov, Franklin M. Eze, Samer Mohamed Kanaan Mahmoud
2015 Misc conf
CSIT
Yevgeniy V. Bodyanskiy, Olena Vynokurova, Galina Setlak, Iryna Pliss
2015 Misc conf
CSIT
Anastasiia O. Deineko, Yana V. Kutsenko, Iryna Pliss, Maksym Shalamov
redb/extractors/apk_extractors/apk_features.py
← Index redb/extractors/apk_extractors/apk_features.py python
import inspect
import zipfile
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKFeatures


class APKFeaturesExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.apk_features = None
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_FEATURES.value

    def _extract_zip_timestamps(self):
        """Extract earliest and latest content modification from ZIP entries."""
        earliest = None
        latest = None
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        try:
                            dt = datetime(*info.date_time)
                            if earliest is None or dt < earliest:
                                earliest = dt
                            if latest is None or dt > latest:
                                latest = dt
                        except (ValueError, TypeError):
                            continue
        except Exception as e:
            self.log.warning(f"Error extracting ZIP timestamps: {e}")
        return (
            earliest.isoformat() if earliest else None,
            latest.isoformat() if latest else None,
        )

    def _extract_supported_abis(self):
        """Determine supported ABIs from lib/ directory."""
        abis = set()
        for f in self._list_files():
            if f.startswith("lib/") and f.endswith(".so"):
                parts = f.split("/")
                if len(parts) >= 3:
                    abis.add(parts[1])
        return sorted(abis)

    def _count_dex_files(self):
        """Count DEX files and compute total size."""
        dex_count = 0
        total_size = 0
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        if info.filename.endswith(".dex"):
                            dex_count += 1
                            total_size += info.file_size
        except Exception as e:
            self.log.warning(f"Error counting DEX files: {e}")
        return dex_count, total_size

    def _check_embedded_apk(self):
        """Check if the archive contains nested APK files."""
        for f in self._list_files():
            if f.lower().endswith(".apk"):
                return True
        return False

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        package_name = self._safe_extract(
            "package_name", lambda: self.apk.get_package()
        )
        app_name = self._safe_extract(
            "app_name", lambda: self.apk.get_app_name()
        )

        def _get_version_code():
            try:
                return int(self.apk.get_androidversion_code() or 0)
            except (ValueError, TypeError):
                return 0

        version_code = self._safe_extract("version_code", _get_version_code)
        version_name = self._safe_extract(
            "version_name", lambda: self.apk.get_androidversion_name()
        )

        def _get_sdk(getter):
            val = getter()
            return int(val) if val else None

        min_sdk = self._safe_extract(
            "min_sdk_version", lambda: _get_sdk(self.apk.get_min_sdk_version)
        )
        target_sdk = self._safe_extract(
            "target_sdk_version", lambda: _get_sdk(self.apk.get_target_sdk_version)
        )
        compile_sdk = self._safe_extract(
            "compile_sdk_version",
            lambda: _get_sdk(self.apk.get_effective_target_sdk_version),
        )

        main_activity = self._safe_extract(
            "main_activity", lambda: self.apk.get_main_activity()
        )

        is_debuggable = self._safe_extract(
            "is_debuggable",
            lambda: self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true",
            False,
        )
        allow_backup = self._safe_extract(
            "allow_backup",
            lambda: self.apk.get_attribute_value(
                "application", "allowBackup"
            ) != "false",
            True,
        )
        uses_cleartext = self._safe_extract(
            "uses_cleartext_traffic",
            lambda: self.apk.get_attribute_value(
                "application", "usesCleartextTraffic"
            ) == "true",
            False,
        )

        supported_abis = self._safe_extract(
            "supported_abis", self._extract_supported_abis, []
        )
        dex_count, total_dex_size = self._safe_extract(
            "dex_files", self._count_dex_files, (0, 0)
        )
        all_files = self._safe_extract("file_list", self._list_files, [])
        total_file_count = len(all_files)
        has_native_code = any(
            f.startswith("lib/") and f.endswith(".so") for f in all_files
        )
        has_assets = any(f.startswith("assets/") for f in all_files)
        contains_embedded_apk = self._safe_extract(
            "contains_embedded_apk", self._check_embedded_apk, False
        )

        uses_libraries = self._safe_extract(
            "uses_libraries",
            lambda: list(self.apk.get_libraries() or []),
            [],
        )

        earliest_mod, latest_mod = self._safe_extract(
            "zip_timestamps", self._extract_zip_timestamps, (None, None)
        )

        self.apk_features = APKFeatures(
            package_name=package_name,
            app_name=app_name,
            version_code=version_code,
            version_name=version_name,
            min_sdk_version=min_sdk,
            target_sdk_version=target_sdk,
            compile_sdk_version=compile_sdk,
            main_activity=main_activity,
            is_debuggable=is_debuggable,
            allow_backup=allow_backup,
            uses_cleartext_traffic=uses_cleartext,
            supported_abis=supported_abis,
            dex_count=dex_count,
            total_dex_size=total_dex_size,
            total_file_count=total_file_count,
            has_native_code=has_native_code,
            has_assets=has_assets,
            uses_libraries=uses_libraries,
            earliest_content_modification=earliest_mod,
            latest_content_modification=latest_mod,
            contains_embedded_apk=contains_embedded_apk,
        )
        return self.apk_features

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.apk_features:
                return None

            f = self.apk_features
            current_time = datetime.now(timezone.utc)
            data = [[
                self.sha256,
                f.package_name,
                f.app_name,
                f.version_code,
                f.version_name,
                f.min_sdk_version,
                f.target_sdk_version,
                f.compile_sdk_version,
                f.main_activity,
                int(f.is_debuggable),
                int(f.allow_backup),
                int(f.uses_cleartext_traffic),
                f.supported_abis,
                f.dex_count,
                f.total_dex_size,
                f.total_file_count,
                int(f.has_native_code),
                int(f.has_assets),
                f.uses_libraries,
                f.earliest_content_modification,
                f.latest_content_modification,
                int(f.contains_embedded_apk),
                current_time,
            ]]

            column_names = [
                "sha256",
                "package_name", "app_name", "version_code", "version_name",
                "min_sdk_version", "target_sdk_version", "compile_sdk_version",
                "main_activity",
                "is_debuggable", "allow_backup", "uses_cleartext_traffic",
                "supported_abis",
                "dex_count", "total_dex_size", "total_file_count",
                "has_native_code", "has_assets",
                "uses_libraries",
                "earliest_content_modification", "latest_content_modification",
                "contains_embedded_apk",
                "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)",
                "Nullable(String)", "Nullable(String)", "Nullable(UInt32)", "Nullable(String)",
                "Nullable(UInt16)", "Nullable(UInt16)", "Nullable(UInt16)",
                "Nullable(String)",
                "UInt8", "UInt8", "UInt8",
                "Array(String)",
                "UInt16", "UInt64", "UInt32",
                "UInt8", "UInt8",
                "Array(String)",
                "Nullable(String)", "Nullable(String)",
                "UInt8",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_apk_features"