Rafael Z. Frantz

62 papers C 2Misc 2Journal 33Unranked 25
YearRankTypeTitle / Venue / Authors
2025 J jnl
Rev. Iberoam. de Tecnol. del Aprendiz.
Patricia Mariotto Mozzaquatro Chicon, Leo Natan Paschoal, Sandro Sawicki, Fabricia Roos-Frantz, Rafael Z. Frantz
2025 conf
CIbSE
Regis Schuch, Rafael Z. Frantz, Antonia M. Reina Quintero, José Bocanegra, Sandro Sawicki, Fabricia Roos-Frantz, Carlos Molina-Jiménez
2025 conf
CIbSE
Sandro Sawicki, Rafael Z. Frantz, Gerson Battisti, Fabricia Roos-Frantz, Luiz Antonio Rasia, Odaylson Eder, Carlos Molina-Jiménez, Jon Crowcroft
2025 conf
CIbSE
Arturo Dina Valente, Luciana M. Cardoso, Mateus D. Kuhn, Misael Lorenzo, Higinio Torres Lucena, Sandro Sawicki, Fabricia Roos-Frantz, Rafael Z. Frantz, Carlos Molina-Jiménez
2025 conf
CIbSE
Mailson Borges Teles, Eldair F. Dornelles, Fabricia Roos-Frantz, Antonia M. Reina Quintero, Sandro Sawicki, José Bocanegra, Rafael Z. Frantz
2024 conf
CIbSE
Regis Schuch, Rafael Z. Frantz, José Bocanegra, Fabricia Roos-Frantz, Sandro Sawicki, Carlos Molina-Jiménez
2024 C conf
MODELSWARD
Mailson Borges Teles, José Bocanegra, Eldair F. Dornelles, Sandro Sawicki, Antonia M. Reina Quintero, Carlos Molina-Jiménez, Fabricia Roos-Frantz, Rafael Z. Frantz
2024 J jnl
Int. J. Comput. Appl. Technol.
Laize D. L. Trindade, Diovana G. de Batista, Maira S. Brigo, Matias N. Frizzo, Rafael Z. Frantz, Fabricia Roos-Frantz, Thiago Heck, Sandro Sawicki
2024 J jnl
CoRR
Valdemar Vicente Graciano Neto, Diana Lorena Santos, Andrey Gonçalves França, Rafael Z. Frantz, Edson de Oliveira Jr., Ahmad Mohsin, Mohamad Kassab
2023 J jnl
Int. J. Comput. Appl. Technol.
Maira S. Brigo, Fernando Parahyba, Rafael Z. Frantz, Sandro Sawicki, Fabricia Roos-Frantz
2023 J jnl
Int. J. Comput. Appl. Technol.
Laize D. L. Trindade, Fernando Parahyba, Rafael Z. Frantz, Fabricia Roos-Frantz, Sandro Sawicki
2023 Misc conf
SAC
Fábio Basso, Bruno Marcelo Soares Ferreira, Rafael Torres, Rafael Z. Frantz, Diego Kreutz, Maicon Bernardino, Elder de Macedo Rodrigues
2023 conf
ICEIS (1)
Eduardo C. Oliveira, Rafael Z. Frantz, Carlos Molina-Jiménez, Thiago Heck, Sandro Sawicki, Fabricia Roos-Frantz
2023 J jnl
J. Supercomput.
Angela Mazzonetto, Rafael Z. Frantz, Sandro Sawicki, Fabricia Roos-Frantz, Gerson Battisti
2022 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Angela Mazzonetto, Rafael Z. Frantz, Fabricia Roos-Frantz, Carlos Molina-Jiménez, Sandro Sawicki
2022 J jnl
Int. J. Comput. Appl. Technol.
Sandra Neuckamp, Rafael Z. Frantz, Fabricia Roos-Frantz, Sandro Sawicki
2022 conf
CIBSE
Eldair F. Dornelles, Fernando Parahyba, Rafael Z. Frantz, Fabricia Roos-Frantz, Antonia M. Reina Quintero, Carlos Molina-Jiménez, José Bocanegra, Sandro Sawicki
2022 J jnl
Softw. Pract. Exp.
José Bocanegra, Rafael Z. Frantz, Fabricia Roos-Frantz, Fábio Paulo Basso
2022 J jnl
J. Simulation
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz, Vitor Basto-Fernandes
2022 J jnl
Int. J. Comput. Appl. Technol.
Alexsandro Q. Lencina, Fabricia Roos-Frantz, Rafael Z. Frantz, Sandro Sawicki
2022 J jnl
Int. J. Bus. Process. Integr. Manag.
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz, Vitor Basto-Fernandes
2022 conf
CIBSE
Fernando Parahyba, Eldair F. Dornelles, Fabricia Roos-Frantz, Rafael Z. Frantz, Carlos Molina-Jiménez, Antonia M. Reina Quintero, José Bocanegra, Sandro Sawicki
2022 J jnl
Softw. Pract. Exp.
Rafael Z. Frantz, Sandro Sawicki, Fabricia Roos-Frantz, Fábio Paulo Basso, Benjamim Zucoloto, Raquel M. Pillat
2022 J jnl
Int. J. Comput. Appl. Technol.
Fábio Paulo Basso, Diego Kreutz, Carlos Molina-Jiménez, Rafael Z. Frantz
2022 J jnl
J. Supercomput.
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz, Vitor Basto-Fernandes
2022 J jnl
J. Supercomput.
Cássio L. M. Belusso, Sandro Sawicki, Vitor Basto-Fernandes, Rafael Z. Frantz, Fabricia Roos-Frantz
2022 J jnl
J. Supercomput.
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz, Vitor Basto-Fernandes
2021 J jnl
Softw. Pract. Exp.
Rafael Z. Frantz, Rafael Corchuelo, Vitor Basto-Fernandes, Fernando Rosa-Sequeira, Fabricia Roos-Frantz, José Luis Arjona
2021 J jnl
Int. J. Comput. Appl. Technol.
Fernando Parahyba, Rafael Z. Frantz, Fabricia Roos-Frantz
2021 J jnl
Int. J. Bus. Process. Integr. Manag.
Daniela L. Freire, Angela Mazzonetto, Rafael Z. Frantz, Fabricia Roos-Frantz, Sandro Sawicki, Vitor Basto-Fernandes
2020 J jnl
Int. J. Comput. Appl. Technol.
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz
2019 J jnl
Enterp. Inf. Syst.
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz, Sandro Sawicki
2019 J jnl
Softw. Pract. Exp.
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz
2019 J jnl
Softw. Pract. Exp.
Rafael Z. Frantz, Matheus H. Rehbein, Rodolfo Berlezi, Fabricia Roos-Frantz
2019 J jnl
Softw. Pract. Exp.
Daniela L. Freire, Rafael Z. Frantz, Fabricia Roos-Frantz, Sandro Sawicki
2019 J jnl
Int. J. Web Eng. Technol.
Francine Freddo, Sandro Sawicki, Rafael Z. Frantz, Fabricia Roos-Frantz
2017 conf
ICEIS (1)
Cássio L. M. Belusso, Sandro Sawicki, Vitor Basto-Fernandes, Rafael Z. Frantz, Fabricia Roos-Frantz
2017 conf
SBES
Daniela F. Sellaro, Rafael Z. Frantz, Inma Hernández, Fabricia Roos-Frantz, Sandro Sawicki
2016 conf
CENTERIS/ProjMAN/HCist
Cássio L. M. Belusso, Sandro Sawicki, Fabricia Roos-Frantz, Rafael Z. Frantz
2016 conf
CENTERIS/ProjMAN/HCist
Fábio Paulo Basso, Toacy C. Oliveira, Cláudia Maria Lima Werner, Rafael Z. Frantz
2016 J jnl
J. Syst. Softw.
Fábio Paulo Basso, Raquel Mainardi Pillat, Toacy Cavalcante de Oliveira, Fabricia Roos-Frantz, Rafael Z. Frantz
2016 conf
CENTERIS/ProjMAN/HCist
Adriana R. Kraisig, Franciéli C. Welter, Igor G. Haugg, Roberto Cargnin, Fabricia Roos-Frantz, Sandro Sawicki, Rafael Z. Frantz
2016 J jnl
J. Syst. Softw.
Rafael Z. Frantz, Rafael Corchuelo, Fabricia Roos-Frantz
2015 J jnl
Int. J. Web Eng. Technol.
Rafael Z. Frantz, Rafael Corchuelo, Fabricia Roos-Frantz
2015 conf
CENTERIS/ProjMAN/HCist
Fernando Rosa-Sequeira, Rafael Z. Frantz, Iryna Yevseyeva, Michael T. M. Emmerich, Vitor Basto-Fernandes
2015 conf
CENTERIS/ProjMAN/HCist
Inma Hernández, Sandro Sawicki, Fabricia Roos-Frantz, Rafael Z. Frantz
2015 J jnl
Int. J. Web Eng. Technol.
Fábio Paulo Basso, Raquel Mainardi Pillat, Fabricia Roos-Frantz, Rafael Z. Frantz
2015 conf
ICEIS (2)
Rafael Z. Frantz, Sandro Sawicki, Fabricia Roos-Frantz, Iryna Yevseyeva, Michael T. M. Emmerich
2015 conf
ICEIS (1)
Fabricia Roos-Frantz, Manuel O. Binelo, Rafael Z. Frantz, Sandro Sawicki, Vitor Basto-Fernandes
2014 conf
ICEIS (2)
Fábio Paulo Basso, Raquel M. Pillat, Rafael Z. Frantz, Fabricia Roos-Frantz
2014 conf
ICEIS (1)
Mauri J. Klein, Sandro Sawicki, Fabricia Roos-Frantz, Rafael Z. Frantz
2014 conf
ICEIS (2)
Fábio Paulo Basso, Raquel M. Pillat, Fabricia Roos-Frantz, Rafael Z. Frantz
2012 J jnl
J. Syst. Softw.
Rafael Z. Frantz, Rafael Corchuelo, Carlos Molina-Jiménez
2012 Misc conf
SAC
Rafael Z. Frantz, Rafael Corchuelo
2011 J jnl
Int. J. Cooperative Inf. Syst.
Rafael Z. Frantz, Antonia M. Reina Quintero, Rafael Corchuelo
2011 C conf
CloudCom
Rafael Z. Frantz, Rafael Corchuelo, José Luis Arjona
2011 conf
CENTERIS (2)
Rafael Z. Frantz, Rafael Corchuelo, Carlos Molina-Jiménez
2010 conf
MoSE@TOOLS
Rafael Z. Frantz, Carlos Molina-Jiménez, Rafael Corchuelo
2009 conf
JISBD
Hassan A. Sleiman, Abdul W. Sultán, Rafael Z. Frantz, Rafael Corchuelo
2009 conf
OTM Workshops
Rafael Z. Frantz, Rafael Corchuelo, Carlos Molina-Jiménez
2008 J jnl
Int. J. Comput. Appl. Technol.
Rafael Z. Frantz
2008 conf
JISBD
Rafael Corchuelo, Rafael Z. Frantz, Jesús González
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"