Majed AlOtaibi

13 papers Journal 11Unranked 2
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Access
Ayaz Ahmed, Zulkurnain Abdul-Malek, Hasmat Malik, Majed AlOtaibi
2025 J jnl
Appl. Intell.
Salwan Tajjour, Shyam Singh Chandel, Hasmat Malik, Fausto Pedro García Márquez, Majed AlOtaibi
2024 J jnl
IEEE Access
Lokesh Kumar Yadav, Mitresh Kumar Verma, Puneet Joshi, Sanjay Agrawal, Majed AlOtaibi, Hasmat Malik, Fausto Pedro García Márquez, Mohammad Asef Hossaini
2024 J jnl
IEEE Access
Ravi Ucheniya, Amit Saraswat, Shahbaz Ahmed Siddiqui, Sunil Kumar Goyal, Majed AlOtaibi, Hasmat Malik, Fausto Pedro García Márquez
2024 J jnl
IEEE Access
Shivaji Ganpat Karad, Ritula Thakur, Majed AlOtaibi, Mohammad Junaid Khan, Hasmat Malik, Fausto Pedro García Márquez, Mohammad Asef Hossaini
2023 J jnl
IEEE Access
Divya Rishi Shrivastava, Shahbaz Ahmed Siddiqui, Kusum Verma, Satyendra Singh, Majed AlOtaibi, Hasmat Malik, Fausto Pedro García Márquez
2023 J jnl
IEEE Access
Anubhav Agrawal, Ranbir Singh, Nagendra Kumar, Vijay Prakash Singh, Majed AlOtaibi, Hasmat Malik, Fausto Pedro García Márquez, Mohammad Asef Hossaini
2023 J jnl
IEEE Access
Salwan Tajjour, Shyam Singh Chandel, Majed AlOtaibi, Hasmat Malik, Fausto Pedro García Márquez, Asyraf Afthanorhan
2022 J jnl
IEEE Access
Sherif M. Dabour, Majed AlOtaibi, Amr A. Abd-Elaziz, Mahmoud A. Alshahat, Mahmoud Abdallah, Ali Mohamed Eltamaly, Ayman S. Abdel-Khalik, Ahmed M. Massoud, Shehab Ahmed
2021 J jnl
IEEE Access
Mohit Bajaj, Naveen Kumar Sharma, Mukesh Pushkarna, Hasmat Malik, Majed AlOtaibi, AbdulAziz AlMutairi
2021 J jnl
IEEE Access
Nagendra Kumar, Hasmat Malik, Akhilesh Singh, Majed AlOtaibi, Mohammed E. Nassar
2018 conf
CCECE
Majed AlOtaibi, AbdulAziz AlMutairi, M. M. A. Salama
2018 conf
CCECE
AbdulAziz AlMutairi, Majed AlOtaibi, M. M. A. Salama
redb/extractors/apk_extractors/apk_native_libs.py
← Index redb/extractors/apk_extractors/apk_native_libs.py python
import fnmatch
import hashlib
import inspect
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 APKNativeLib

# Known packer/protector native library names
KNOWN_PACKER_LIBS = {
    # Jiagu (360/Qihoo)
    "libjiagu.so", "libjiagu_a64.so", "libjiagu_x86.so", "libjiagu_x64.so",
    # Bangcle/SecNeo
    "libsecexe.so", "libsecmain.so", "libSecShell.so",
    # Baidu
    "libbaiduprotect.so",
    # Tencent (Legu)
    "libtxAppProtect.so", "libBugly.so",
    # iJiami
    "libexec.so", "libexecmain.so",
    # Alibaba
    "libmobisec.so", "libaliprotect.so",
    # APKProtect
    "libAPKProtect.so",
    # Pangxie (Pangolin)
    "libdexjni.so",
    # DexProtector
    "libdexprotector.so",
    # AppSolid
    "libAppSolid.so",
    # Kiwisec
    "libkwscmm.so",
    # DingXiang
    "libx3g.so",
    # NQ Shield
    "libnqshield.so",
    # Generic / other
    "libprotectClass.so",
    "libDexHelper.so",
    "libdexloader.so",
    "libfdog.so",
}

# Glob-style patterns for packer libs (e.g. libshella-*.so)
KNOWN_PACKER_PATTERNS = [
    "libshella-*.so",
    "libshell-super.*.so",
]


def is_known_packer_lib(filename):
    """Check if a native library filename matches known packer signatures."""
    if filename in KNOWN_PACKER_LIBS:
        return True
    for pattern in KNOWN_PACKER_PATTERNS:
        if fnmatch.fnmatch(filename, pattern):
            return True
    return False


class APKNativeLibExtractor(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.native_libs = []
        self.abis = set()
        self.log.debug(inspect.currentframe().f_code.co_name)

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

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

        self.native_libs = []
        self.abis = set()

        zf = self._get_zip_file()
        if not zf:
            return None

        with zf:
            for info in zf.infolist():
                if not (info.filename.startswith("lib/") and info.filename.endswith(".so")):
                    continue
                parts = info.filename.split("/")
                if len(parts) < 3:
                    continue

                abi = parts[1]
                filename = parts[-1]
                self.abis.add(abi)

                try:
                    data = zf.read(info.filename)
                    lib_sha256 = hashlib.sha256(data).hexdigest()
                except Exception as e:
                    self.log.warning(f"Error reading native lib {info.filename}: {e}")
                    continue

                self.native_libs.append(APKNativeLib(
                    abi=abi,
                    filename=filename,
                    size=info.file_size,
                    sha256=lib_sha256,
                    is_known_packer=is_known_packer_lib(filename),
                ))

        if not self.native_libs:
            return None

        return {
            "native_lib_count": len(self.native_libs),
            "abis": sorted(self.abis),
            "native_libs": self.native_libs,
            "known_packer_libs": [
                lib for lib in self.native_libs if lib.is_known_packer
            ],
        }

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

            current_time = datetime.now(timezone.utc)
            data = []
            for lib in self.native_libs:
                data.append([
                    self.sha256,
                    lib.abi,
                    lib.filename,
                    lib.size,
                    lib.sha256,
                    int(lib.is_known_packer),
                    current_time,
                ])

            column_names = [
                'sha256', 'lib_abi', 'lib_filename', 'lib_size',
                'lib_sha256', 'lib_is_known_packer', 'analysis_date',
            ]

            column_type_names = [
                'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt64',
                'FixedString(64)', 'UInt8', "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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