Walid Mahdi

76 papers A 1B 8C 9Misc 2Journal 30Unranked 26
YearRankTypeTitle / Venue / Authors
2026 conf
ICAART (2)
Basma Jalloul, Bassem Bouaziz, Siwar Chaabene, Walid Mahdi
2026 J jnl
Appl. Soft Comput.
Basma Jalloul, Bassem Bouaziz, Walid Mahdi
2025 J jnl
SN Comput. Sci.
Basma Jalloul, Siwar Chaabene, Bassem Bouaziz, Walid Mahdi
2025 J jnl
SN Comput. Sci.
Bassem Bouaziz, Siwar Chaabene, Walid Mahdi
2025 conf
ICONIP (2)
Basma Jalloul, Bassem Bouaziz, Walid Mahdi, Achraf Ammar, Wolfgang Immanuel Schöllhorn
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Belhassen Akrout, Walid Mahdi
2023 J jnl
Neural Comput. Appl.
Hasna Njah, Salma Jamoussi, Walid Mahdi
2022 J jnl
Ecol. Informatics
Abdelaziz Triki, Bassem Bouaziz, Walid Mahdi
2022 J jnl
Multim. Tools Appl.
Abdelaziz Triki, Bassem Bouaziz, Walid Mahdi, Hamdi Hamed, Jitendra Gaikwad
2021 conf
TACC
Abdelaziz Triki, Bassem Bouaziz, Jitendra Gaikwad, Walid Mahdi
2021 J jnl
Ann. Math. Artif. Intell.
Hasna Njah, Salma Jamoussi, Walid Mahdi
2021 J jnl
Pattern Recognit. Lett.
Abdelaziz Triki, Bassem Bouaziz, Jitendra Gaikwad, Walid Mahdi
2021 conf
ICONIP (1)
Abdelaziz Triki, Bassem Bouaziz, Jitendra Gaikwad, Walid Mahdi
2020 J jnl
Computación y Sistemas
Mohammed Ouali, Walid Mahdi, Radhwane Gharbaoui, Seyyid Ahmed Medjahed
2020 conf
VISIGRAPP (4: VISAPP)
Abdelaziz Triki, Bassem Bouaziz, Walid Mahdi, Jitendra Gaikwad
2019 J jnl
Computación y Sistemas
Walid Mahdi, Belhassen Akrout, Roobaea Alroobaea, Abdulmajeed Alsufyani
2019 J jnl
Concurr. Comput. Pract. Exp.
Hasna Njah, Salma Jamoussi, Walid Mahdi
2019 J jnl
Multim. Tools Appl.
Ilyes Rebai, Yassine Ben Ayed, Walid Mahdi
2018 B conf
KES
Ilyes Rebai, Yassine Ben Ayed, Walid Mahdi
2017 C conf
AICCSA
Bassem Bouaziz, Jihen Amara, Walid Mahdi
2017 C conf
AICCSA
Ilyes Rebai, Yassine Ben Ayed, Walid Mahdi
2017 B conf
KES
Ilyes Rebai, Yassine Benayed, Walid Mahdi, Jean-Pierre Lorré
2017 J jnl
Computación y Sistemas
Walid Mahdi, Seyyid Ahmed Medjahed, Mohammed Ouali
2016 C conf
CIBCB
Hasna Njah, Salma Jamoussi, Walid Mahdi, Mohamed Elati
2016 J jnl
Computación y Sistemas
Ahmed Ben Jmaa, Walid Mahdi, Yousra Ben Jemaa, Abdelmajid Ben Hamadou
2016 J jnl
Multim. Tools Appl.
Ahmed Rekik, Achraf Ben-Hamadou, Walid Mahdi
2016 J jnl
Multim. Tools Appl.
Tarek Zlitni, Bassem Bouaziz, Walid Mahdi
2016 B conf
IJCNN
Ilyes Rebai, Yassine Ben Ayed, Walid Mahdi
2016 J jnl
Neural Comput. Appl.
Ilyes Rebai, Yassine Ben Ayed, Walid Mahdi
2016 J jnl
Int. J. Knowl. Soc. Res.
Walid Mahdi, Tarek Zlitni
2016 B conf
IJCNN
Hasna Njah, Salma Jamoussi, Walid Mahdi
2016 C conf
IPAS
Belhassen Akrout, Walid Mahdi
2015 B conf
ICTAI
Hasna Njah, Salma Jamoussi, Walid Mahdi, Afif Masmoudi
2015 J jnl
Res. Comput. Sci.
Sana Fakhfakh, Mohamed Tmar, Walid Mahdi
2015 C conf
AICCSA
Ilyes Rebai, Yassine Ben Ayed, Walid Mahdi
2015 B conf
ACIVS
Ahmed Rekik, Achraf Ben-Hamadou, Walid Mahdi
2015 C conf
SEKE
Sana Fakhfakh, Mohamed Tmar, Walid Mahdi
2015 J jnl
Mach. Vis. Appl.
Belhassen Akrout, Walid Mahdi
2015 B conf
ACIVS
Ahmed Rekik, Achraf Ben-Hamadou, Walid Mahdi
2014 conf
ICIAR (2)
Ahmed Rekik, Achraf Ben-Hamadou, Walid Mahdi
2014 conf
CLEF (Working Notes)
Sana Fakhfakh, Belhassen Akrout, Mohamed Tmar, Walid Mahdi
2014 J jnl
CoRR
Walid Mahdi, Liming Chen, Mohsen Ardabilian
2014 conf
KES-AMSTA
Sana Fakhfakh, Mohamed Tmar, Walid Mahdi
2014 conf
VISAPP (3)
Ahmed Rekik, Achraf Ben-Hamadou, Walid Mahdi
2014 Misc conf
ATSIP
Belhassen Akrout, Walid Mahdi
2014 conf
SIGMAP
Islem Jarraya, Salah Werda, Walid Mahdi
2014 conf
WEBIST (1)
Sana Fakhfakh, Mohamed Tmar, Walid Mahdi
2013 conf
VISAPP (2)
Ahmed Rekik, Achraf Ben-Hamadou, Walid Mahdi
2013 conf
CORES
Belhassen Akrout, Walid Mahdi
2013 conf
ICEIS (2)
Sana Fakhfakh, Mohamed Tmar, Walid Mahdi
2013 conf
VISAPP (1)
Tarek Zlitni, Walid Mahdi
2013 J jnl
CoRR
Tarek Zlitni, Walid Mahdi
2013 B conf
Intelligent Vehicles Symposium
Belhassen Akrout, Walid Mahdi
2013 J jnl
CoRR
Bassem Bouaziz, Tarek Zlitni, Walid Mahdi
2013 J jnl
CoRR
Bassem Bouaziz, Walid Mahdi, Tarek Zlitni, Abdelmajid Ben Hamadou
2013 conf
VISAPP (1)
Belhassen Akrout, Walid Mahdi, Abdelmajid Ben Hamadou
2013 J jnl
Int. J. Recent Contributions Eng. Sci. IT
Walid Mahdi, Faïez Gargouri
2013 J jnl
Int. J. Recent Contributions Eng. Sci. IT
Belhassen Akrout, Walid Mahdi
2013 J jnl
CoRR
Salah Werda, Walid Mahdi, Abdelmajid Ben Hamadou
2013 conf
MUE
Belhassen Akrout, Walid Mahdi
2011 conf
ICIAP (2)
Tarek Zlitni, Walid Mahdi, Hanêne Ben-Abdallah
2009 conf
ICTA
Mohamed Heni Frikha, Mohamed Jmaiel, Walid Mahdi
2009 C conf
MoMM
Tarek Zlitni, Walid Mahdi, Hanêne Ben-Abdallah
2009 J jnl
CoRR
Ahmed Ben Jmaa, Walid Mahdi, Yousra Ben Jemaa, Abdelmajid Ben Hamadou
2009 C conf
MoMM
Bassem Bouaziz, Walid Mahdi, Tarek Zlitni, Abdelmajid Ben Hamadou
2009 C conf
IDEAL
Ahmed Ben Jmaa, Walid Mahdi, Yousra Ben Jemaa, Abdelmajid Ben Hamadou
2008 J jnl
Integr. Comput. Aided Eng.
Walid Mahdi, Salah Werda, Abdelmajid Ben Hamadou
2007 conf
ICEIS (5)
Salah Werda, Walid Mahdi, Abdelmajid Ben Hamadou
2007 conf
VISAPP (2)
Salah Werda, Walid Mahdi, Abdelmajid Ben Hamadou
2007 Misc conf
ICIAP
Salah Werda, Walid Mahdi, Abdelmajid Ben Hamadou
2006 A conf
ICME
Bassem Bouaziz, Walid Mahdi, Mohsen Ardabilian, Abdelmajid Ben Hamadou
2006 conf
ICIAR (1)
Bassem Bouaziz, Walid Mahdi, Abdelmajid Ben Hamadou
2005 conf
SITIS
Bassem Bouaziz, Walid Mahdi, Abdelmajid Ben Hamadou
2001 conf
EGC
Nadia Bouassida, Hanêne Ben-Abdallah, Walid Mahdi, Liming Chen
2000 conf
VISUAL
Mohsen Ardabilian, Walid Mahdi, Liming Chen
1998 conf
ECDL
Walid Mahdi, Liming Chen, Dominique Fontaine
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"