Jaber S. Alzahrani

26 papers Journal 26
YearRankTypeTitle / Venue / Authors
2024 J jnl
Intell. Autom. Soft Comput.
Badriyya B. Al-Onazi, Jaber S. Alzahrani, Najm Alotaibi, Hussain Alshahrani, Mohamed Ahmed Elfaki, Radwa Marzouk, Heba Mohsen, Abdelwahed Motwakel
2024 J jnl
Comput. Syst. Sci. Eng.
Abdelwahed Motwakel, Badriyya B. Al-Onazi, Jaber S. Alzahrani, Ayman Yafoz, Mahmoud Othman, Abu Sarwar Zamani, Ishfaq Yaseen, Amgad Atta Abdelmageed
2023 J jnl
Comput. Syst. Sci. Eng.
Manar Ahmed Hamza, Hala J. Alshahrani, Jaber S. Alzahrani, Heba Mohsen, Mohamed I. Eldesouki, Mohammed Rizwanullah
2023 J jnl
Comput. Syst. Sci. Eng.
B. Kalpana, S. Dhanasekaran, T. Abirami, Ashit Kumar Dutta, Marwa Ismael Obayya, Jaber S. Alzahrani, Manar Ahmed Hamza
2023 J jnl
Comput. Electr. Eng.
Hadeel Alsolai, Mohammed Aljebreen, Jaber S. Alzahrani, Fahd N. Al-Wesabi, Anwer Mustafa Hilal, Abu Sarwar Zamani, Azza Elneil Osman, Amani A. Alneil
2023 J jnl
Comput. Syst. Sci. Eng.
Anwer Mustafa Hilal, Amal Al-Rasheed, Jaber S. Alzahrani, Majdy M. Eltahir, Mesfer Al Duhayyim, Nermin M. Salem, Ishfaq Yaseen, Abdelwahed Motwakel
2023 J jnl
Comput. Syst. Sci. Eng.
Abdelwahed Motwakel, Badriyya Alonazi, Jaber S. Alzahrani, Radwa Marzouk, Amira Sayed A. Aziz, Abu Sarwar Zamani, Ishfaq Yaseen, Amgad Atta Abdelmageed
2023 J jnl
Comput. Syst. Sci. Eng.
Abdelwahed Motwakel, Hala J. Alshahrani, Jaber S. Alzahrani, Ayman Yafoz, Heba Mohsen, Ishfaq Yaseen, Amgad Atta Abdelmageed, Mohamed I. Eldesouki
2023 J jnl
Comput. Syst. Sci. Eng.
Manar Ahmed Hamza, Aisha Hassan Abdalla Hashim, Dalia H. Elkamchouchi, Nadhem Nemri, Jaber S. Alzahrani, Amira Sayed A. Aziz, Mnahel Ahmed Ibrahim, Abdelwahed Motwakel
2023 J jnl
Comput. Syst. Sci. Eng.
Fatma S. Alrayes, Najm Alotaibi, Jaber S. Alzahrani, Sana Alazwari, Areej Alhogail, Ali M. Al-Sharafi, Mahmoud Othman, Manar Ahmed Hamza
2023 J jnl
Comput. Syst. Sci. Eng.
Abdelwahed Motwakel, Badriyya Alonazi, Jaber S. Alzahrani, Sana Alazwari, Mahmoud Othman, Abu Sarwar Zamani, Ishfaq Yaseen, Amgad Atta Abdelmageed
2023 J jnl
Comput. Syst. Sci. Eng.
Manar Ahmed Hamza, Saud S. Alotaibi, Sami Althahabi, Jaber S. Alzahrani, Abdullah Mohamed, Abdelwahed Motwakel, Abu Sarwar Zamani, Mohamed I. Eldesouki
2023 J jnl
Comput. Syst. Sci. Eng.
Mesfer Al Duhayyim, Jaber S. Alzahrani, Hanan Abdullah Mengash, Mrim M. Alnfiai, Radwa Marzouk, Gouse Pasha Mohammed, Mohammed Rizwanullah, Amgad Atta Abdelmageed
2023 J jnl
Comput. Syst. Sci. Eng.
Mesfer Al Duhayyim, Badriyya Alonazi, Jaber S. Alzahrani, Hussain Alshahrani, Mohamed Ahmed Elfaki, Abdullah Mohamed, Ishfaq Yaseen, Gouse Pasha Mohammed, Mohammed Rizwanullah, Abu Sarwar Zamani
2023 J jnl
Comput. Syst. Sci. Eng.
Khaled M. Alalayah, Fatma S. Alrayes, Jaber S. Alzahrani, Khadija M. Alaidarous, Ibrahim M. Alwayle, Heba Mohsen, Ibrahim Abdulrab Ahmed, Mesfer Al Duhayyim
2023 J jnl
Comput. Syst. Sci. Eng.
Anwer Mustafa Hilal, Jaber S. Alzahrani, Dalia H. Elkamchouchi, Majdy M. Eltahir, Ahmed S. Almasoud, Abdelwahed Motwakel, Abu Sarwar Zamani, Ishfaq Yaseen
2023 J jnl
Comput. Syst. Sci. Eng.
Ibrahim M. Alwayle, Badriyya Alonazi, Jaber S. Alzahrani, Khaled M. Alalayah, Khadija M. Alaidarous, Ibrahim Abdulrab Ahmed, Mahmoud Othman, Abdelwahed Motwakel
2023 J jnl
Comput. Syst. Sci. Eng.
Anwer Mustafa Hilal, Eatedal Alabdulkreem, Jaber S. Alzahrani, Majdy M. Eltahir, Mohamed I. Eldesouki, Ishfaq Yaseen, Abdelwahed Motwakel, Radwa Marzouk
2023 J jnl
Comput. Syst. Sci. Eng.
Hanan Abdullah Mengash, Jaber S. Alzahrani, Majdy M. Eltahir, Fahd N. Al-Wesabi, Abdullah Mohamed, Manar Ahmed Hamza, Radwa Marzouk
2022 J jnl
IEEE Access
Adil Aslam Mir, Fatih Vehbi Çelebi, Hadeel Alsolai, Shahzad Ahmad Qureshi, Muhammad Rafique, Jaber S. Alzahrani, Hany Mahgoub, Manar Ahmed Hamza
2022 J jnl
Sustain. Comput. Informatics Syst.
Fahd N. Al-Wesabi, Marwa Ismael Obayya, Manar Ahmed Hamza, Jaber S. Alzahrani, Deepak Gupta, Sachin Kumar
2022 J jnl
Appl. Artif. Intell.
Amani Abdulrahman Albraikan, Jaber S. Alzahrani, Noha Negm, Lal Hussain, Mesfer Al Duhayyim, Manar Ahmed Hamza, Abdelwahed Motwakel, Ishfaq Yaseen
2022 J jnl
Image Vis. Comput.
Amani Abdulrahman Albraikan, Jaber S. Alzahrani, Reem Alshahrani, Ayman Yafoz, Raed Alsini, Anwer Mustafa Hilal, Ahmed Alkhayyat, Deepak Gupta
2022 J jnl
Comput. Electr. Eng.
Fahd N. Al-Wesabi, Fadwa M. Alrowais, Jaber S. Alzahrani, Radwa Marzouk, Mesfer Al Duhayyim, Ahmed Alkhayyat, Deepak Gupta
2022 J jnl
Comput. Electr. Eng.
Areej Malibari, Jaber S. Alzahrani, Majdy M. Eltahir, Vinita Malik, Marwa Ismael Obayya, Mesfer Al Duhayyim, Aloisio Vieira Lira Neto, Victor Hugo C. de Albuquerque
2022 J jnl
Expert Syst. J. Knowl. Eng.
Radwa Marzouk, Jaber S. Alzahrani, Fadwa M. Alrowais, Fahd N. Al-Wesabi, Manar Ahmed Hamza
redb/extractors/apk_extractors/apk_features.py
← Index redb/extractors/apk_extractors/apk_features.py python
import inspect
import zipfile
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 APKFeatures


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

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

    def _extract_zip_timestamps(self):
        """Extract earliest and latest content modification from ZIP entries."""
        earliest = None
        latest = None
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        try:
                            dt = datetime(*info.date_time)
                            if earliest is None or dt < earliest:
                                earliest = dt
                            if latest is None or dt > latest:
                                latest = dt
                        except (ValueError, TypeError):
                            continue
        except Exception as e:
            self.log.warning(f"Error extracting ZIP timestamps: {e}")
        return (
            earliest.isoformat() if earliest else None,
            latest.isoformat() if latest else None,
        )

    def _extract_supported_abis(self):
        """Determine supported ABIs from lib/ directory."""
        abis = set()
        for f in self._list_files():
            if f.startswith("lib/") and f.endswith(".so"):
                parts = f.split("/")
                if len(parts) >= 3:
                    abis.add(parts[1])
        return sorted(abis)

    def _count_dex_files(self):
        """Count DEX files and compute total size."""
        dex_count = 0
        total_size = 0
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        if info.filename.endswith(".dex"):
                            dex_count += 1
                            total_size += info.file_size
        except Exception as e:
            self.log.warning(f"Error counting DEX files: {e}")
        return dex_count, total_size

    def _check_embedded_apk(self):
        """Check if the archive contains nested APK files."""
        for f in self._list_files():
            if f.lower().endswith(".apk"):
                return True
        return False

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

        package_name = self._safe_extract(
            "package_name", lambda: self.apk.get_package()
        )
        app_name = self._safe_extract(
            "app_name", lambda: self.apk.get_app_name()
        )

        def _get_version_code():
            try:
                return int(self.apk.get_androidversion_code() or 0)
            except (ValueError, TypeError):
                return 0

        version_code = self._safe_extract("version_code", _get_version_code)
        version_name = self._safe_extract(
            "version_name", lambda: self.apk.get_androidversion_name()
        )

        def _get_sdk(getter):
            val = getter()
            return int(val) if val else None

        min_sdk = self._safe_extract(
            "min_sdk_version", lambda: _get_sdk(self.apk.get_min_sdk_version)
        )
        target_sdk = self._safe_extract(
            "target_sdk_version", lambda: _get_sdk(self.apk.get_target_sdk_version)
        )
        compile_sdk = self._safe_extract(
            "compile_sdk_version",
            lambda: _get_sdk(self.apk.get_effective_target_sdk_version),
        )

        main_activity = self._safe_extract(
            "main_activity", lambda: self.apk.get_main_activity()
        )

        is_debuggable = self._safe_extract(
            "is_debuggable",
            lambda: self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true",
            False,
        )
        allow_backup = self._safe_extract(
            "allow_backup",
            lambda: self.apk.get_attribute_value(
                "application", "allowBackup"
            ) != "false",
            True,
        )
        uses_cleartext = self._safe_extract(
            "uses_cleartext_traffic",
            lambda: self.apk.get_attribute_value(
                "application", "usesCleartextTraffic"
            ) == "true",
            False,
        )

        supported_abis = self._safe_extract(
            "supported_abis", self._extract_supported_abis, []
        )
        dex_count, total_dex_size = self._safe_extract(
            "dex_files", self._count_dex_files, (0, 0)
        )
        all_files = self._safe_extract("file_list", self._list_files, [])
        total_file_count = len(all_files)
        has_native_code = any(
            f.startswith("lib/") and f.endswith(".so") for f in all_files
        )
        has_assets = any(f.startswith("assets/") for f in all_files)
        contains_embedded_apk = self._safe_extract(
            "contains_embedded_apk", self._check_embedded_apk, False
        )

        uses_libraries = self._safe_extract(
            "uses_libraries",
            lambda: list(self.apk.get_libraries() or []),
            [],
        )

        earliest_mod, latest_mod = self._safe_extract(
            "zip_timestamps", self._extract_zip_timestamps, (None, None)
        )

        self.apk_features = APKFeatures(
            package_name=package_name,
            app_name=app_name,
            version_code=version_code,
            version_name=version_name,
            min_sdk_version=min_sdk,
            target_sdk_version=target_sdk,
            compile_sdk_version=compile_sdk,
            main_activity=main_activity,
            is_debuggable=is_debuggable,
            allow_backup=allow_backup,
            uses_cleartext_traffic=uses_cleartext,
            supported_abis=supported_abis,
            dex_count=dex_count,
            total_dex_size=total_dex_size,
            total_file_count=total_file_count,
            has_native_code=has_native_code,
            has_assets=has_assets,
            uses_libraries=uses_libraries,
            earliest_content_modification=earliest_mod,
            latest_content_modification=latest_mod,
            contains_embedded_apk=contains_embedded_apk,
        )
        return self.apk_features

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

            f = self.apk_features
            current_time = datetime.now(timezone.utc)
            data = [[
                self.sha256,
                f.package_name,
                f.app_name,
                f.version_code,
                f.version_name,
                f.min_sdk_version,
                f.target_sdk_version,
                f.compile_sdk_version,
                f.main_activity,
                int(f.is_debuggable),
                int(f.allow_backup),
                int(f.uses_cleartext_traffic),
                f.supported_abis,
                f.dex_count,
                f.total_dex_size,
                f.total_file_count,
                int(f.has_native_code),
                int(f.has_assets),
                f.uses_libraries,
                f.earliest_content_modification,
                f.latest_content_modification,
                int(f.contains_embedded_apk),
                current_time,
            ]]

            column_names = [
                "sha256",
                "package_name", "app_name", "version_code", "version_name",
                "min_sdk_version", "target_sdk_version", "compile_sdk_version",
                "main_activity",
                "is_debuggable", "allow_backup", "uses_cleartext_traffic",
                "supported_abis",
                "dex_count", "total_dex_size", "total_file_count",
                "has_native_code", "has_assets",
                "uses_libraries",
                "earliest_content_modification", "latest_content_modification",
                "contains_embedded_apk",
                "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)",
                "Nullable(String)", "Nullable(String)", "Nullable(UInt32)", "Nullable(String)",
                "Nullable(UInt16)", "Nullable(UInt16)", "Nullable(UInt16)",
                "Nullable(String)",
                "UInt8", "UInt8", "UInt8",
                "Array(String)",
                "UInt16", "UInt64", "UInt32",
                "UInt8", "UInt8",
                "Array(String)",
                "Nullable(String)", "Nullable(String)",
                "UInt8",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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