Ikram Amous

139 papers A 1B 12C 31Misc 2Journal 48Unranked 45
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. J.
Safa Batita, Achraf Makni, Ikram Amous
2025 conf
RCIS (1)
Raouf Jmal, Mariam Masmoudi, Ikram Amous, Florence Sèdes
2025 J jnl
J. Inf. Knowl. Manag.
Imen Gabsi, Hager Kammoun, Dalila Souidi, Ikram Amous
2025 J jnl
J. Supercomput.
Abir Boujelben, Ikram Amous
2024 conf
IFIPIoT (1)
Raouf Jmal, Mariam Masmoudi, Ikram Amous, Florence Sèdes
2024 J jnl
Comput. J.
Faten Louati, Farah Barika Ktata, Ikram Amous
2024 J jnl
Clust. Comput.
Faten Louati, Farah Barika Ktata, Ikram Amous
2024 conf
ICCCI (1)
Imen Gabsi, Hager Kammoun, Asma Wederni, Ikram Amous
2024 conf
ACIIDS (2)
Imen Gabsi, Hager Kammoun, Dalila Souidi, Ikram Amous
2024 J jnl
Neural Comput. Appl.
Almustafa Abed, Belhassen Akrout, Ikram Amous
2024 J jnl
SN Comput. Sci.
Faten Louati, Farah Barika Ktata, Ikram Amous
2024 C conf
DATA
Safa Batita, Achraf Makni, Ikram Amous
2024 J jnl
Clust. Comput.
Olfa Souki, Raoudha Ben Djemaa, Ikram Amous, Florence Sèdes
2024 J jnl
Comput. Commun.
Mariam Masmoudi, Ikram Amous, Corinne Amel Zayani, Florence Sèdes
2024 J jnl
Int. J. Inf. Sec.
Mariam Masmoudi, Ikram Amous, Corinne Amel Zayani, Florence Sèdes
2023 conf
ICAART (3)
Faten Louati, Farah Barika Ktata, Ikram Amous
2023 C conf
WETICE
Olfa Souki, Raoudha Ben Djemaa, Ikram Amous, Florence Sèdes
2023 C conf
WEBIST
Raouf Jmal, Mariam Masmoudi, Ikram Amous, Corinne Amel Zayani, Florence Sèdes
2023 C conf
IDEAS
Maryam Jallouli, Sonia Lajmi, Ikram Amous
2023 J jnl
Internet Things
Hela Zorgati, Raoudha Ben Djemaa, Ikram Amous
2023 J jnl
Multim. Tools Appl.
Maryam Jallouli, Sonia Lajmi, Ikram Amous
2023 C conf
MEDI
Mariam Masmoudi, Ikram Amous, Corinne Amel Zayani, Florence Sèdes
2023 J jnl
SN Comput. Sci.
Almustafa Abed, Belhassen Akrout, Ikram Amous
2023 J jnl
Comput. J.
Wided Selmi, Hager Kammoun, Ikram Amous
2023 J jnl
BMC Medical Informatics Decis. Mak.
Abir Boujelben, Ikram Amous
2022 C conf
ISPR
Almustafa Abed, Belhassen Akrout, Ikram Amous
2022 B conf
KES
Olfa Souki, Raoudha Ben Djemaa, Ikram Amous, Florence Sèdes
2022 J jnl
J. Supercomput.
Wafa Abdelghani, Ikram Amous, Corinne Amel Zayani, Florence Sèdes, Geoffrey Roman-Jimenez
2022 J jnl
Comput. J.
Hager Kammoun, Imen Gabsi, Ikram Amous
2022 conf
ICSAI
Almustafa Abed, Belhassen Akrout, Ikram Amous
2022 J jnl
J. Univers. Comput. Sci.
Nibras Othman Abdulwahid, Sana Fakhfakh, Ikram Amous
2021 B conf
KES
Mariam Masmoudi, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2021 J jnl
Comput. J.
Abir Troudi, Leila Ghorbel, Corinne Amel Zayani, Salma Jamoussi, Ikram Amous
2021 J jnl
Inf. Syst.
Kheir Eddine Daouadi, Rim Zghal Rebaï, Ikram Amous
2021 conf
NLPIR
Wided Selmi, Hager Kammoun, Ikram Amous
2021 B conf
KES
Wiem Hachicha, Leila Ghorbel, Ronan Champagnat, Corinne Amel Zayani, Ikram Amous
2020 J jnl
Computación y Sistemas
Leila Ghorbel, Corinne Amel Zayani, Ikram Amous, Imen Boutouria
2020 J jnl
Multim. Tools Appl.
Mariam Bouchakwa, Yassine Ayadi, Ikram Amous
2020 B conf
KES
Mariam Bouchakwa, Yassine Ayadi, Ikram Amous
2020 conf
INFORSID
Wafa Abdelghani, Florence Sèdes, Corinne Amel Zayani, Ikram Amous
2020 J jnl
Prog. Artif. Intell.
Mariam Bouchakwa, Yassine Ayadi, Ikram Amous
2020 J jnl
Online Inf. Rev.
Corinne Amel Zayani, Leila Ghorbel, Ikram Amous, Manel Mezghani, André Péninou, Florence Sèdes
2020 conf
EGC
Wafa Abdelghani, Florence Sèdes, Corinne Amel Zayani, Ikram Amous
2020 J jnl
J. Univers. Comput. Sci.
Kheir Eddine Daouadi, Rim Zghal Rebaï, Ikram Amous
2020 conf
BIS
Abir Boujelben, Ikram Amous
2020 J jnl
Computación y Sistemas
Abir Boujelben, Ikram Amous
2019 J jnl
Int. J. Web Inf. Syst.
Abir Boujelben, Ikram Amous
2019 J jnl
Int. J. Multim. Intell. Secur.
Mohamed Hamroun, Sonia Lajmi, Henri Nicolas, Ikram Amous
2019 C conf
AICCSA
Mohamed Hamroun, Sonia Lajmi, Henri Nicolas, Ikram Amous
2019 conf
CSOC (2)
Kheir Eddine Daouadi, Rim Zghal Rebaï, Ikram Amous
2019 conf
ICEBE
Mariam Masmoudi, Wafa Abdelghani, Ikram Amous, Florence Sèdes
2019 J jnl
Int. J. Strateg. Inf. Technol. Appl.
Mohamed Hamroun, Sonia Lajmi, Henri Nicolas, Ikram Amous
2019 C conf
MoMM
Mohamed Hamroun, Sonia Lajmi, Henri Nicolas, Ikram Amous
2019 Misc conf
SAC
Abir Troudi, Salma Jamoussi, Corinne Amel Zayani, Ikram Amous
2019 J jnl
Computación y Sistemas
Kheir Eddine Daouadi, Rim Zghal Rebaï, Ikram Amous
2019 J jnl
Int. J. Pervasive Comput. Commun.
Sihem Cherif, Raoudha Ben Djemaa, Ikram Amous
2019 C conf
IDEAS
Mohamed Hamroun, Sonia Lajmi, Henri Nicolas, Ikram Amous
2018 C conf
MoMM
Rihab Ben Lamine, Raoudha Ben Djemaa, Ikram Amous
2018 J jnl
Int. J. Strateg. Inf. Technol. Appl.
Maryam Jallouli, Sonia Lajmi, Ikram Amous
2018 B conf
KES
Abir Boujelben, Ikram Amous
2018 C conf
AICCSA
Mohamed Hamroun, Sonia Lajmi, Henri Nicolas, Ikram Amous
2018 J jnl
Int. J. Web Serv. Res.
Emna Khanfir, Raoudha Ben Djemaa, Ikram Amous
2018 conf
ICEIS (1)
Mohamed Hamroun, Sonia Lajmi, Henri Nicolas, Ikram Amous
2018 C conf
AICCSA
Wided Selmi, Hager Kammoun, Ikram Amous
2018 J jnl
Serv. Oriented Comput. Appl.
Emna Khanfir, Raoudha Ben Djemaa, Ikram Amous
2018 conf
LPKM
Kheir Eddine Daouadi, Rim Zghal Rebaï, Ikram Amous
2018 J jnl
Future Gener. Comput. Syst.
Ahlem Kalaï, Corinne Amel Zayani, Ikram Amous, Wafa Abdelghani, Florence Sèdes
2018 conf
MLN
Kheir Eddine Daouadi, Rim Zghal Rebaï, Ikram Amous
2018 C conf
CRiSIS
Wafa Abdelghani, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2017 B conf
KES
Maryam Jallouli, Sonia Lajmi, Ikram Amous
2017 conf
EMCIS
Maryam Jallouli, Sonia Lajmi, Ikram Amous
2017 B conf
KES
Imen Gabsi, Hager Kammoun, Sarra brahmi, Ikram Amous
2017 J jnl
Data Knowl. Eng.
Manel Mezghani, André Péninou, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2017 conf
ICEBE
Emna Khanfir, Raoudha Ben Djemaa, Ikram Amous
2017 J jnl
Computación y Sistemas
Corinne Amel Zayani, Leila Ghorbel, Ikram Amous, Manel Mezghani, André Péninou, Florence Sèdes
2016 C conf
ISDA
Abir Troudi, Corinne Amel Zayani, Salma Jamoussi, Ikram Amous
2016 J jnl
Int. J. Pervasive Comput. Commun.
Sihem Cherif, Raoudha Ben Djemaa, Ikram Amous
2016 C conf
MoMM
Sihem Cherif, Raoudha Ben Djemaa, Ikram Amous
2016 conf
HPCC/SmartCity/DSS
Emna Khanfir, Raoudha Ben Djemaa, Ikram Amous
2016 A conf
ICSOC
Ahlem Kalaï, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2016 C conf
ISDA
Leila Ghorbel, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2016 C conf
PST
Ahlem Kalaï, Wafa Abdelghani, Corinne Amel Zayani, Ikram Amous
2016 C conf
INISTA
Imen Gabsi, Hager Kammoun, Hatem Bougares, Mohamed Ben Aouicha, Ikram Amous
2016 C conf
MoMM
Mariam Bouchakwa, Yassine Ayadi, Ikram Amous
2016 C conf
ISDA
Maryam Jallouli, Sonia Lajmi, Ikram Amous
2016 C conf
ISDA
Abir Boujelben, Tarak Chaari, Ikram Amous
2016 conf
I3E
Wafa Abdelghani, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2015 conf
ADBIS (Short Papers and Workshops)
Manel Mezghani, Sirinya On-At, André Péninou, Marie-Françoise Canut, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2015 C conf
ICIS
Leila Ghorbel, Corinne Amel Zayani, Ikram Amous
2015 C conf
iiWAS
Sihem Cherif, Raoudha Ben Djemaa, Ikram Amous
2015 B conf
KES
Rim Zghal Rebaï, Fatma Mnif, Corinne Amel Zayani, Ikram Amous
2015 J jnl
Ingénierie des Systèmes d Inf.
Manel Mezghani, André Péninou, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2015 conf
INFORSID
Manel Mezghani, André Péninou, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2015 B conf
KES
Leila Ghorbel, Corinne Amel Zayani, Ikram Amous
2015 B conf
SERVICES
Emna Khanfir, Raoudha Ben Djemaa, Ikram Amous
2015 C conf
ICIS
Sihem Cherif, Raoudha Ben Djemaa, Ikram Amous
2015 conf
SOCA
Ahlem Kalaï, Corinne Amel Zayani, Ikram Amous
2014 J jnl
J. Univers. Comput. Sci.
Chiraz El Hog, Raoudha Ben Djemaa, Ikram Amous
2014 conf
ICEIS (1)
Manel Mezghani, André Péninou, Corinne Amel Zayani, Ikram Amous, Florence Sèdes
2014 B conf
RCIS
Manel Mezghani, Corinne Amel Zayani, Ikram Amous, André Péninou, Florence Sèdes
2013 conf
UIC/ATC
Chiraz El Hog, Raoudha Ben Djemaa, Ikram Amous
2013 C conf
ADBIS
Rim Zghal Rebaï, Leila Ghorbel, Corinne Amel Zayani, Ikram Amous
2013 conf
COMPSAC Workshops
Chiraz El Hog, Raoudha Ben Djemaa, Ikram Amous
2013 B conf
KES
Rim Zghal Rebaï, Leila Ghorbel, Corinne Amel Zayani, Ikram Amous
2013 conf
ADBIS (2)
Sihem Cherif, Raoudha Ben Djemaa, Ikram Amous
2013 J jnl
Ingénierie des Systèmes d Inf.
Rim Zghal Rebaï, Corinne Amel Zayani, Ikram Amous
2012 conf
WWW (Companion Volume)
Manel Mezghani, Corinne Amel Zayani, Ikram Amous, Faïez Gargouri
2012 conf
ADBIS (2)
Rim Zghal Rebaï, Corinne Amel Zayani, Ikram Amous
2012 C conf
WEBIST
Manel Mezghani, Corinne Amel Zayani, Ikram Amous, Faïez Gargouri
2012 C conf
WEBIST
Rim Zghal Rebaï, Corinne Amel Zayani, Ikram Amous, Abdelmajid Ben Hamadou
2012 Misc conf
SAC
Chiraz El Hog, Raoudha Ben Djemaa, Ikram Amous
2011 C conf
iiWAS
Chiraz El Hog, Raoudha Ben Djemaa, Ikram Amous
2011 C conf
MoMM
Yassine Ayadi, Ikram Amous, Faïez Gargouri
2011 C conf
HIS
Yassine Ayadi, Mohamed Gargouri, Ikram Amous, Faïez Gargouri
2010 conf
INFORSID
Raoudha Ben Djemaa, Ikram Amous, Fatma Ben Andallah, Abdelmajid Ben Hamadou
2009 J jnl
Int. J. Inf. Technol. Web Eng.
Raoudha Ben Djemaa, Ikram Amous, Abdelmajid Ben Hamadou
2009 J jnl
Document Numérique
Corinne Amel Zayani, Ikram Amous, André Péninou, C. Marie-Françoise Canut, Florence Sèdes
2008 conf
INFORSID
Corinne Amel Zayani, Ikram Amous, André Péninou, C. Marie-Françoise Canut, Florence Sèdes
2008 J jnl
Int. J. Intell. Inf. Technol.
Raoudha Ben Djemaa, Ikram Amous, Abdelmajid Ben Hamadou
2007 J jnl
Ingénierie des Systèmes d Inf.
Corinne Amel Zayani, Ikram Amous
2007 conf
RIAO
Ikram Amous, Anis Jedidi, Faïez Gargouri, Florence Sèdes
2006 conf
SITIS
Anis Jedidi, Ikram Amous, Florence Sèdes
2006 conf
ICEIS (5)
Raoudha Ben Djemaa, Ikram Amous, Abdelmajid Ben Hamadou
2006 conf
AICT/ICIW
Raoudha Ben Djemaa, Ikram Amous, Abdelmajid Ben Hamadou
2006 conf
INFORSID
Corinne Amel Zayani, Florence Sèdes, André Péninou, C. Marie-Françoise Canut, Ikram Amous
2006 conf
ICDIM
Raoudha Ben Djemaa, Ikram Amous, Abdelmajid Ben Hamadou
2006 conf
WSE
Raoudha Ben Djemaa, Ikram Amous, Abdelmajid Ben Hamadou
2005 J jnl
Multim. Tools Appl.
Ikram Amous, Anis Jedidi, Florence Sèdes
2005 conf
SITIS
Sameh Ammar, Ikram Amous, Faïez Gargouri
2005 C conf
iiWAS
Raoudha Ben Djemaa, Ikram Amous, Abdelmajid Ben Hamadou
2004 conf
INFORSID
Ikram Amous, Anis Jedidi, Florence Sèdes
2003 J jnl
Ingénierie des Systèmes d Inf.
Ikram Amous, Anis Jedidi, Florence Sèdes
2002 conf
OOIS
Ikram Amous, Anis Jedidi, Florence Sèdes
2002 conf
ICEIS
Ikram Amous, Florence Sèdes
2002 conf
INFORSID
Ikram Amous, Anis Jedidi
2002 conf
ICEIS
Ikram Amous, Anis Jedidi, Florence Sèdes
2002 conf
EGC
Ikram Amous, Florence Sèdes
2001 J jnl
Ingénierie des Systèmes d Inf.
Ikram Amous, Claude Chrisment, Florence Sèdes
2001 conf
ICEIS (1)
Ikram Amous, Anis Jedidi
redb/extractors/apk_extractors/apk_inconsistency_tests.py
← Index redb/extractors/apk_extractors/apk_inconsistency_tests.py python
import inspect
import re
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 APKInconsistencyTests

# Emulator detection indicator strings
EMULATOR_INDICATORS = {
    "generic", "sdk", "google_sdk", "Emulator",
    "goldfish", "ranchu", "Andy", "Genymotion",
    "BlueStacks", "nox", "ttVM_Hdragon",
}

# Root detection indicator strings
ROOT_INDICATORS = {
    "/system/app/Superuser.apk",
    "/system/xbin/su",
    "/system/bin/su",
    "com.noshufou.android.su",
    "com.thirdparty.superuser",
    "eu.chainfire.supersu",
    "com.koushikdutta.superuser",
    "com.topjohnwu.magisk",
}

# Standard DEX filename pattern
STANDARD_DEX_PATTERN = re.compile(r"^classes\d*\.dex$")


class APKInconsistencyTestsExtractor(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.test_results = None
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _test_zip_bomb(self):
        """Check if any ZIP entry has compression ratio > 100:1."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            with zf:
                for info in zf.infolist():
                    if info.compress_size > 0:
                        ratio = info.file_size / info.compress_size
                        if ratio > 100:
                            return True
            return False
        except Exception as e:
            self.log.warning(f"Error in zip bomb test: {e}")
            return None

    def _test_zip_duplicate_entries(self):
        """Check for duplicate filenames in ZIP directory."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            with zf:
                names = [info.filename for info in zf.infolist()]
                return len(names) != len(set(names))
        except Exception as e:
            self.log.warning(f"Error in duplicate entries test: {e}")
            return None

    def _test_zip_path_traversal(self):
        """Check for path traversal (../) in ZIP entry names."""
        try:
            for f in self._list_files():
                if ".." in f or f.startswith("/"):
                    return True
            return False
        except Exception as e:
            self.log.warning(f"Error in path traversal test: {e}")
            return None

    def _test_zip_suspicious_timestamps(self):
        """Check for timestamps at epoch (1980) or in the future."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            now = datetime.now()
            with zf:
                for info in zf.infolist():
                    try:
                        dt = datetime(*info.date_time)
                        if dt.year <= 1980 or dt > now:
                            return True
                    except (ValueError, TypeError):
                        continue
            return False
        except Exception as e:
            self.log.warning(f"Error in suspicious timestamps test: {e}")
            return None

    def _test_hidden_dex_files(self):
        """Check for DEX files not matching classes*.dex pattern."""
        try:
            for f in self._list_files():
                if f.endswith(".dex"):
                    basename = f.split("/")[-1]
                    if not STANDARD_DEX_PATTERN.match(basename):
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in hidden DEX files test: {e}")
            return None

    def _test_manifest_component_mismatch(self):
        """Check for declared components that don't exist in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            # Get all class names from DEX
            dex_classes = set()
            try:
                from androguard.core.dex import DEX
                for dex_data in (self.apk.get_all_dex() or []):
                    try:
                        d = DEX(dex_data)
                        for cls in d.get_classes():
                            name = cls.get_name()
                            if name:
                                # Convert "Lcom/example/Foo;" to "com.example.Foo"
                                dex_classes.add(
                                    name[1:-1].replace("/", ".") if name.startswith("L") else name
                                )
                    except Exception:
                        continue
            except Exception:
                return None

            if not dex_classes:
                return None

            # Check manifest components against DEX classes
            components = []
            try:
                components.extend(self.apk.get_activities() or [])
                components.extend(self.apk.get_services() or [])
                components.extend(self.apk.get_receivers() or [])
                components.extend(self.apk.get_providers() or [])
            except Exception:
                return None

            for comp in components:
                if comp and comp not in dex_classes:
                    # Component might use a shorthand; check with package prefix
                    package = self.apk.get_package() or ""
                    full_name = package + comp if comp.startswith(".") else comp
                    if full_name not in dex_classes:
                        return True

            return False
        except Exception as e:
            self.log.warning(f"Error in manifest component mismatch test: {e}")
            return None

    def _test_debuggable_release(self):
        """Check android:debuggable=true combined with a release signature."""
        try:
            if not self._is_valid_apk():
                return None

            is_debuggable = self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true"

            if not is_debuggable:
                return False

            # Check if it has a signing certificate (release builds have certs)
            try:
                certs = self.apk.get_certificates()
                if certs and len(certs) > 0:
                    return True
            except Exception:
                pass

            return False
        except Exception as e:
            self.log.warning(f"Error in debuggable release test: {e}")
            return None

    def _get_dex_strings(self):
        """Get all string constants from DEX files."""
        all_strings = set()
        try:
            from androguard.core.dex import DEX
            for dex_data in (self.apk.get_all_dex() or []):
                try:
                    d = DEX(dex_data)
                    for s in d.get_strings():
                        if s:
                            all_strings.add(s)
                except Exception:
                    continue
        except Exception:
            pass
        return all_strings

    def _test_emulator_detection_strings(self):
        """Check for emulator detection patterns in DEX strings."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            for indicator in EMULATOR_INDICATORS:
                for s in dex_strings:
                    if indicator in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in emulator detection test: {e}")
            return None

    def _test_debugger_detection(self):
        """Check for debugger detection API calls in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            debugger_patterns = {
                "isDebuggerConnected",
                "waitingForDebugger",
                "Debug.isDebuggerConnected",
            }
            for pattern in debugger_patterns:
                for s in dex_strings:
                    if pattern in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in debugger detection test: {e}")
            return None

    def _test_root_detection(self):
        """Check for root detection patterns in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            for indicator in ROOT_INDICATORS:
                for s in dex_strings:
                    if indicator in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in root detection test: {e}")
            return None

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

        self.test_results = APKInconsistencyTests(
            test_zip_bomb=self._test_zip_bomb(),
            test_zip_duplicate_entries=self._test_zip_duplicate_entries(),
            test_zip_path_traversal=self._test_zip_path_traversal(),
            test_zip_suspicious_timestamps=self._test_zip_suspicious_timestamps(),
            test_hidden_dex_files=self._test_hidden_dex_files(),
            test_manifest_component_mismatch=self._test_manifest_component_mismatch(),
            test_debuggable_release=self._test_debuggable_release(),
            test_emulator_detection_strings=self._test_emulator_detection_strings(),
            test_debugger_detection=self._test_debugger_detection(),
            test_root_detection=self._test_root_detection(),
        )
        return self.test_results

    def _bool_to_nullable(self, val):
        """Convert bool/None to ClickHouse Nullable(UInt8)."""
        if val is None:
            return None
        return int(val)

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

            current_time = datetime.now(timezone.utc)
            t = self.test_results

            data = [[
                self.sha256,
                self._bool_to_nullable(t.test_zip_bomb),
                self._bool_to_nullable(t.test_zip_duplicate_entries),
                self._bool_to_nullable(t.test_zip_path_traversal),
                self._bool_to_nullable(t.test_zip_suspicious_timestamps),
                self._bool_to_nullable(t.test_hidden_dex_files),
                self._bool_to_nullable(t.test_manifest_component_mismatch),
                self._bool_to_nullable(t.test_debuggable_release),
                self._bool_to_nullable(t.test_emulator_detection_strings),
                self._bool_to_nullable(t.test_debugger_detection),
                self._bool_to_nullable(t.test_root_detection),
                current_time,
            ]]

            column_names = [
                'sha256',
                'test_zip_bomb', 'test_zip_duplicate_entries',
                'test_zip_path_traversal', 'test_zip_suspicious_timestamps',
                'test_hidden_dex_files', 'test_manifest_component_mismatch',
                'test_debuggable_release', 'test_emulator_detection_strings',
                'test_debugger_detection', 'test_root_detection',
                'analysis_date',
            ]

            column_type_names = [
                'FixedString(64)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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