Katarzyna Budzynska

60 papers A* 1B 3C 17Journal 22Unranked 17
YearRankTypeTitle / Venue / Authors
2026 conf
ICAART (1)
Stephanie Anneris Malvicini, Ewelina Gajewska, Arda Derbent, Katarzyna Budzynska, Jaroslaw A. Chudziak, Maria Vanina Martinez
2026 J jnl
CoRR
Stephanie Anneris Malvicini, Ewelina Gajewska, Arda Derbent, Katarzyna Budzynska, Jaroslaw A. Chudziak, Maria Vanina Martinez
2026 conf
HICSS
Ewelina Gajewska, Arda Derbent, Jaroslaw A. Chudziak, Katarzyna Budzynska
2026 conf
ICAART (1)
Ewelina Gajewska, Katarzyna Budzynska, Jaroslaw A. Chudziak
2026 J jnl
CoRR
Ewelina Gajewska, Katarzyna Budzynska, Jaroslaw A. Chudziak
2025 J jnl
CoRR
Ewelina Gajewska, Arda Derbent, Jaroslaw A. Chudziak, Katarzyna Budzynska
2025 J jnl
CoRR
Qurat-ul-ain Shaheen, Katarzyna Budzynska, Carles Sierra
2025 J jnl
CoRR
Ewelina Gajewska, Michal Wawer, Katarzyna Budzynska, Jaroslaw A. Chudziak
2025 conf
AIED (5)
Ewelina Gajewska, Michal Wawer, Katarzyna Budzynska, Jaroslaw A. Chudziak
2024 J jnl
Argument Comput.
Qurat-ul-ain Shaheen, Katarzyna Budzynska, Carles Sierra
2024 conf
CMNA@COMMA
Katarzyna Budzynska, Marcin Koszowy, Patrick Saint-Dizier, Maciej Uberna
2024 C conf
COMMA
Maciej Uberna, Katarzyna Budzynska, Marcin Koszowy, Patrick Saint-Dizier
2024 C conf
COMMA
Ewelina Gajewska, Katarzyna Budzynska, Barbara Konat
2024 J jnl
CoRR
Ewelina Gajewska, Katarzyna Budzynska, Barbara Konat, Marcin Koszowy, Konrad Kiljan, Maciej Uberna, He Zhang
2024 J jnl
Argument Comput.
Ilia Stepin, Katarzyna Budzynska, Alejandro Catalá, Martin Pereira-Fariña, Jose Maria Alonso-Moral
2024 J jnl
CoRR
Katarzyna Budzynska, Ewelina Gajewska
2023 conf
VALE
He Zhang, Alina Landowska, Katarzyna Budzynska
2022 J jnl
Dagstuhl Reports
Katarzyna Budzynska, Chris Reed, Manfred Stede, Benno Stein, Zhang He
2020 conf
NL4XAI@INGL
Martijn Demollin, Qurat-ul-ain Shaheen, Katarzyna Budzynska, Carles Sierra
2020 J jnl
Lang. Resour. Evaluation
Jacky Visser, Barbara Konat, Rory Duthie, Marcin Koszowy, Katarzyna Budzynska, Chris Reed
2020 conf
TAILOR
José Maria Alonso, Senén Barro, Alberto Bugarín, Kees van Deemter, Claire Gardent, Albert Gatt, Ehud Reiter, Carles Sierra, Mariët Theune, Nava Tintarev, Hitoshi Yano, Katarzyna Budzynska
2019 conf
ACL (4)
Katarzyna Budzynska, Chris Reed
2018 A* conf
IJCAI
Rory Duthie, Katarzyna Budzynska
2018 C conf
COMMA
Brian Plüss, Mennatallah El-Assady, Fabian Sperrle, Valentin Gold, Katarzyna Budzynska, Annette Hautli-Janisz, Chris Reed
2018 C conf
COMMA
Rory Duthie, Katarzyna Budzynska
2018 C ed.
COMMA
Sanjay Modgil, Katarzyna Budzynska, John Lawrence
2017 J jnl
ACM Trans. Internet Techn.
John Lawrence, Mark Snaith, Barbara Konat, Katarzyna Budzynska, Chris Reed
2017 J jnl
Artif. Intell.
Alison Pease, John Lawrence, Katarzyna Budzynska, Joseph Corneli, Chris Reed
2017 J jnl
ACM Trans. Internet Techn.
John Lawrence, Joonsuk Park, Katarzyna Budzynska, Claire Cardie, Barbara Konat, Chris Reed
2016 B conf
LREC
Barbara Konat, John Lawrence, Joonsuk Park, Katarzyna Budzynska, Chris Reed
2016 C conf
COMMA
Mathilde Janier, Mark Snaith, Katarzyna Budzynska, John Lawrence, Chris Reed
2016 C conf
COMMA
John Lawrence, Rory Duthie, Katarzyna Budzynska, Chris Reed
2016 J jnl
IEEE Intell. Informatics Bull.
Katarzyna Budzynska, Serena Villata
2016 C conf
COMMA
Rory Duthie, Katarzyna Budzynska, Chris Reed
2016 conf
ArgMining@ACL
Rory Duthie, John Lawrence, Katarzyna Budzynska, Chris Reed
2016 J jnl
Argument Comput.
Katarzyna Budzynska, Mathilde Janier, Chris Reed, Patrick Saint-Dizier
2014 B conf
LREC
Katarzyna Budzynska, Mathilde Janier, Chris Reed, Patrick Saint-Dizier, Manfred Stede, Olena Yaskorska
2014 C conf
COMMA
Katarzyna Budzynska, Andrea Rocci, Olena Yaskorska
2014 C conf
COMMA
Alison Pease, Katarzyna Budzynska, John Lawrence, Chris Reed
2014 C conf
COMMA
Magdalena Kacprzak, Marcin Dziubinski, Katarzyna Budzynska
2014 C conf
COMMA
Katarzyna Budzynska, Mathilde Janier, Juyeon Kang, Chris Reed, Patrick Saint-Dizier, Manfred Stede, Olena Yaskorska
2014 conf
CS&P
Magdalena Kacprzak, Anna Sawicka, Katarzyna Budzynska, Marcin Dziubinski
2013 J jnl
Synth.
Katarzyna Budzynska
2013 J jnl
Fundam. Informaticae
Olena Yaskorska, Katarzyna Budzynska, Magdalena Kacprzak
2012 B conf
KES
Magdalena Kacprzak, Katarzyna Budzynska, Olena Yaskorska
2012 conf
KES (Selected Papers)
Magdalena Kacprzak, Katarzyna Budzynska
2012 conf
CS&P
Olena Yaskorska, Magdalena Kacprzak, Katarzyna Budzynska
2012 C conf
COMMA
Katarzyna Budzynska, Chris Reed
2011 conf
TICTTL
Katarzyna Budzynska
2011 conf
Computational Models of Natural Argument
Katarzyna Budzynska, Chris Reed
2011 conf
TICTTL
Chris Reed, Simon Wells, Mark Snaith, Katarzyna Budzynska, John Lawrence
2011 J jnl
Trans. Comput. Collect. Intell.
Magdalena Kacprzak, Piotr Kulicki, Robert Trypuz, Katarzyna Budzynska, Pawel Garbacz, Marek Lechniak, Pawel Rembelski
2010 C conf
COMMA
Katarzyna Budzynska
2010 C conf
COMMA
Chris Reed, Simon Wells, Katarzyna Budzynska, Joseph Devereux
2010 J jnl
Fundam. Informaticae
Katarzyna Budzynska, Magdalena Kacprzak, Pawel Rembelski
2010 conf
KES-AMSTA (1)
Magdalena Kacprzak, Piotr Kulicki, Robert Trypuz, Katarzyna Budzynska, Pawel Garbacz, Marek Lechniak, Pawel Rembelski
2009 C conf
ISMIS
Katarzyna Budzynska, Magdalena Kacprzak, Pawel Rembelski
2009 J jnl
Fundam. Informaticae
Katarzyna Budzynska, Magdalena Kacprzak, Pawel Rembelski
2008 J jnl
Fundam. Informaticae
Katarzyna Budzynska, Magdalena Kacprzak
2008 C conf
COMMA
Katarzyna Budzynska, Magdalena Kacprzak, Pawel Rembelski
redb/extractors/apk_extractors/apk_manifest.py
← Index redb/extractors/apk_extractors/apk_manifest.py python
import inspect
import json
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 APKManifest, APKManifestComponent


class APKManifestExtractor(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.manifest = None
        self.components = []
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _is_component_exported(self, component_type, component_name):
        """Determine if a component is exported.

        Pre-API 31: exported is implicitly True if intent filters exist.
        API 31+: android:exported must be explicit; default is False.
        """
        try:
            exported_attr = None
            # Try to get the exported attribute directly from the XML
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                for node in axml.getElementsByTagName(component_type):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    if name == component_name:
                        exported_attr = node.getAttributeNS(
                            "http://schemas.android.com/apk/res/android", "exported"
                        )
                        break
        except Exception:
            exported_attr = None

        if exported_attr == "true":
            return True
        if exported_attr == "false":
            return False

        # If not explicitly set, check for intent filters (pre-API 31 behavior)
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                if actions:
                    return True
        except Exception:
            pass

        return False

    def _get_intent_filters_for_component(self, component_type, component_name):
        """Get intent filters for a specific component."""
        actions = []
        categories = []
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                categories = intent_filters.get("category", [])
        except Exception:
            pass
        return actions, categories

    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 manifest 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

        activities = self._safe_extract(
            "activities", lambda: list(self.apk.get_activities() or []), []
        )
        services = self._safe_extract(
            "services", lambda: list(self.apk.get_services() or []), []
        )
        receivers = self._safe_extract(
            "receivers", lambda: list(self.apk.get_receivers() or []), []
        )
        providers = self._safe_extract(
            "providers", lambda: list(self.apk.get_providers() or []), []
        )

        # Build component list with intent filter info
        self.components = []
        all_actions = set()
        all_categories = set()
        exported_components = []

        component_map = [
            ("activity", activities),
            ("service", services),
            ("receiver", receivers),
            ("provider", providers),
        ]

        for comp_type, comp_list in component_map:
            for comp_name in comp_list:
                try:
                    is_exported = self._is_component_exported(comp_type, comp_name)
                    actions, categories = self._get_intent_filters_for_component(
                        comp_type, comp_name
                    )
                    all_actions.update(actions)
                    all_categories.update(categories)
                    if is_exported:
                        exported_components.append(comp_name)

                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=is_exported,
                        intent_actions=list(actions),
                        intent_categories=list(categories),
                    ))
                except Exception as e:
                    self.log.warning(
                        f"Error processing component '{comp_name}' for "
                        f"{self.hash.sha256}: {e}"
                    )
                    # Still add the component with minimal info
                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=False,
                        intent_actions=[],
                        intent_categories=[],
                    ))

        # Uses-feature
        uses_features = []
        try:
            uses_features = list(self.apk.get_features() or [])
        except Exception:
            pass

        # Meta-data
        meta_data = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                md = {}
                for node in axml.getElementsByTagName("meta-data"):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    value = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "value"
                    )
                    resource = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "resource"
                    )
                    if name:
                        md[name] = value or resource or ""
                if md:
                    meta_data = md
        except Exception:
            pass

        # Full manifest XML
        manifest_xml = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                manifest_xml = axml.toxml()
        except Exception:
            try:
                manifest_xml = self.apk.get_android_manifest_axml().get_xml()
                if isinstance(manifest_xml, bytes):
                    manifest_xml = manifest_xml.decode("utf-8", errors="replace")
            except Exception:
                pass

        self.manifest = APKManifest(
            activity_count=len(activities),
            service_count=len(services),
            receiver_count=len(receivers),
            provider_count=len(providers),
            activities=activities,
            services=services,
            receivers=receivers,
            providers=providers,
            exported_components=exported_components,
            intent_filters_by_action=sorted(all_actions),
            intent_filters_by_category=sorted(all_categories),
            uses_features=uses_features,
            meta_data=meta_data,
            manifest_xml=manifest_xml,
        )
        return self.manifest

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

            current_time = datetime.now(timezone.utc)
            m = self.manifest

            # Components table (one row per component)
            components_data = []
            for comp in self.components:
                components_data.append([
                    self.sha256,
                    comp.component_type,
                    comp.class_name,
                    int(comp.is_exported),
                    comp.intent_actions,
                    comp.intent_categories,
                    current_time,
                ])

            # Manifest summary table (one row per APK)
            manifest_data = [[
                self.sha256,
                m.activity_count,
                m.service_count,
                m.receiver_count,
                m.provider_count,
                m.intent_filters_by_action,
                m.intent_filters_by_category,
                m.uses_features,
                m.manifest_xml,
                current_time,
            ]]

            return {
                'multi_table': True,
                'manifest': {
                    'table': 'redb_apk_manifest',
                    'data': manifest_data,
                    'column_names': [
                        'sha256',
                        'activity_count', 'service_count', 'receiver_count', 'provider_count',
                        'intent_filters_by_action', 'intent_filters_by_category',
                        'uses_features', 'manifest_xml', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)',
                        'UInt16', 'UInt16', 'UInt16', 'UInt16',
                        'Array(String)', 'Array(String)',
                        'Array(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'components': {
                    'table': 'redb_apk_components',
                    'data': components_data,
                    'column_names': [
                        'sha256', 'component_type', 'class_name', 'is_exported',
                        'intent_actions', 'intent_categories', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt8',
                        'Array(String)', 'Array(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

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