Catarina Ferreira Da Silva

47 papers B 1C 4Journal 21Unranked 20
YearRankTypeTitle / Venue / Authors
2024 conf
WISE (3)
João Paulo Moleiro Domingues, Catarina Ferreira Da Silva
2023 J jnl
Sensors
Rodrigo Sarroeira, João Henriques, Ana M. Sousa, Catarina Ferreira Da Silva, Nuno Nunes, Sérgio Moro, Maria do Carmo Botelho
2023 J jnl
Knowl. Inf. Syst.
Mouna Labiadh, Christian Obrecht, Catarina Ferreira Da Silva, Parisa Ghodous, Khalid Benabdeslem
2022 J jnl
IEEE Access
Léo Besançon, Catarina Ferreira Da Silva, Parisa Ghodous, Jean-Patrick Gelas
2022 J jnl
Telematics Informatics
Filipe Pinto, Catarina Ferreira Da Silva, Sérgio Moro
2021 J jnl
CoRR
Mouna Labiadh, Christian Obrecht, Catarina Ferreira Da Silva, Parisa Ghodous
2021 J jnl
Serv. Oriented Comput. Appl.
Mouna Labiadh, Christian Obrecht, Catarina Ferreira Da Silva, Parisa Ghodous
2021 J jnl
Telematics Informatics
Catarina Ferreira Da Silva, Sérgio Moro
2020 conf
IoTSMS
Achraf Rahmouni, Catarina Ferreira Da Silva, Parisa Ghodous
2019 B conf
EDBT
Genoveva Vargas-Solar, Gavin Kemp, Irving Hernandez Gallegos, Javier-Alfonso Espinosa-Oviedo, Catarina Ferreira Da Silva, Parisa Ghodous
2019 J jnl
Data Knowl. Eng.
Cheikh Kacfah Emani, Catarina Ferreira Da Silva, Bruno Fiés, Parisa Ghodous
2019 conf
HPCS
Mouna Labiadh, Christian Obrecht, Catarina Ferreira Da Silva, Parisa Ghodous
2019 conf
IEEE ICBC
Léo Besançon, Catarina Ferreira Da Silva, Parisa Ghodous
2018 conf
IEEE CLOUD
Hayri Acar, Hind Benfenatki, Jean-Patrick Gelas, Catarina Ferreira Da Silva, Gülfem Isiklar Alptekin, Aïcha-Nabila Benharkat, Parisa Ghodous
2017 J jnl
Serv. Oriented Comput. Appl.
Paulo E. Melo, Paulo Rupino da Cunha, Catarina Ferreira Da Silva, André Macedo
2017 J jnl
Int. J. Syst. Serv. Oriented Eng.
Hind Benfenatki, Catarina Ferreira Da Silva, Aïcha-Nabila Benharkat, Parisa Ghodous, Zakaria Maamar
2017 J jnl
Serv. Oriented Comput. Appl.
Hind Benfenatki, Catarina Ferreira Da Silva, Gavin Kemp, Aïcha-Nabila Benharkat, Parisa Ghodous, Zakaria Maamar
2016 J jnl
J. Intell. Manuf.
Malik Khalfallah, Nicolas Figay, Catarina Ferreira Da Silva, Parisa Ghodous
2016 conf
TE
Vitor Rozsa, Marta Denisczwicz, Moisés Lima Dutra, Parisa Ghodous, Catarina Ferreira Da Silva, Nader Moayeri, Frédérique Biennier, Nicolas Figay
2016 J jnl
Int. J. Electron. Bus. Manag.
Gavin Kemp, Pedropablo Lopez Amaya, Catarina Ferreira Da Silva, Genoveva Vargas-Solar, Parisa Ghodous, Christine Collet
2016 J jnl
Trans. Comput. Collect. Intell.
Cheikh Kacfah Emani, Catarina Ferreira Da Silva, Bruno Fiés, Parisa Ghodous
2016 J jnl
J. Intell. Manuf.
Carlos Coutinho, Adina Cretan, Catarina Ferreira Da Silva, Parisa Ghodous, Ricardo Jardim-Gonçalves
2015 C conf
VEHITS
Gavin Kemp, Genoveva Vargas-Solar, Catarina Ferreira Da Silva, Parisa Ghodous, Christine Collet
2015 J jnl
Open J. Semantic Web
Cheikh Kacfah Emani, Catarina Ferreira Da Silva, Bruno Fiés, Parisa Ghodous
2015 C conf
CLOSER
Wendpanga Francis Ouedraogo, Frédérique Biennier, Catarina Ferreira Da Silva, Parisa Ghodous
2015 conf
SMARTGREENS/VEHITS (Selected Papers)
Gavin Kemp, Genoveva Vargas-Solar, Catarina Ferreira Da Silva, Parisa Ghodous, Christine Collet
2015 conf
CE
Gavin Kemp, Genoveva Vargas-Solar, Catarina Ferreira Da Silva, Parisa Ghodous, Christine Collet, Pedropablo Lopez Amaya
2014 C conf
CLOSER
Hind Benfenatki, Catarina Ferreira Da Silva, Aïcha-Nabila Benharkat, Parisa Ghodous
2014 conf
WI-IAT (2)
Hind Benfenatki, Catarina Ferreira Da Silva, Aïcha-Nabila Benharkat, Parisa Ghodous
2014 C conf
WETICE
Hind Benfenatki, Catarina Ferreira Da Silva, Aïcha-Nabila Benharkat, Parisa Ghodous
2014 J jnl
Comput. Ind.
Ricardo Jardim-Gonçalves, Carlos Coutinho, Adina Cretan, Catarina Ferreira Da Silva, Parisa Ghodous
2014 conf
SDSW@ISWC
Cheikh Kacfah Emani, Catarina Ferreira Da Silva, Bruno Fiés, Parisa Ghodous
2014 conf
IEEE CLOUD
Hind Benfenatki, Catarina Ferreira Da Silva, Aïcha-Nabila Benharkat, Parisa Ghodous, Frédérique Biennier
2014 conf
CE
Hind Benfenatki, Gavin Kemp, Catarina Ferreira Da Silva, Aïcha-Nabila Benharkat, Parisa Ghodous
2013 conf
IEEE CLOUD
Paulo Rupino da Cunha, Paulo E. Melo, Catarina Ferreira Da Silva
2013 conf
IWEI
Malik Khalfallah, Nicolas Figay, Parisa Ghodous, Catarina Ferreira Da Silva
2013 J jnl
Int. J. Electron. Bus. Manag.
Adina Cretan, Catarina Ferreira Da Silva, Carlos Coutinho, Ricardo Jardim-Gonçalves, Parisa Ghodous
2013 J jnl
Int. J. Comput. Their Appl.
Genoveva Vargas-Solar, Catarina Ferreira Da Silva, Parisa Ghodous, José-Luis Zechinelli-Martini
2013 conf
IEEE SCC
Malik Khalfallah, Nicolas Figay, Mahmoud Barhamgi, Catarina Ferreira Da Silva, Parisa Ghodous
2013 J jnl
Int. J. Strateg. Inf. Technol. Appl.
Catarina Ferreira Da Silva, Paulo E. Melo, Paulo Rupino da Cunha, Pedro Milheiro, Parisa Ghodous
2012 conf
CE
Catarina Ferreira Da Silva, Levi Baptista, Paulo Rupino da Cunha, Paulo E. Melo
2011 J jnl
Int. J. Electron. Bus. Manag.
Catarina Ferreira Da Silva, Patrick Hoffmann, Parisa Ghodous
2010 conf
AMCIS
Catarina Ferreira Da Silva, Paulo Rupino da Cunha, Paulo E. Melo, Marinos Themistocleous
2007
Catarina Ferreira Da Silva
2006 conf
EG-ICE
Celson Lima, Catarina Ferreira Da Silva, João Paulo Pimentão
2006 conf
CE
Catarina Ferreira Da Silva, Lionel Médini, Celson Lima, Parisa Ghodous
2005 conf
InterDB@COORDINATION
Catarina Ferreira Da Silva, Lionel Médini, Samer Abdul Ghafour, Patrick Hoffmann, Parisa Ghodous, Celson Lima
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"