Navya Martin Kollapally

19 papers C 1Journal 11Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Navya Martin Kollapally, Christa Akers, Renjith Nelson Joseph
2025 J jnl
CoRR
Navya Martin Kollapally, James Geller, Patricia Morreale, Daehan Kwak
2025 conf
BIBM
Navya Martin Kollapally, Christa Akes
2025 J jnl
J. Comput. Sci. Coll.
Ricardo Urbaez, Navya Martin Kollapally
2025 J jnl
J. Comput. Sci. Coll.
Jassiris Nunez, Navya Martin Kollapally
2025 J jnl
J. Comput. Sci. Coll.
Sarah Ainani, Navya Martin Kollapally
2025 J jnl
J. Biomed. Informatics
Navya Martin Kollapally, James Geller, Vipina Kuttichi Keloth, Zhe He, Julia Xu
2024 J jnl
J. Comput. Sci. Coll.
Navya Martin Kollapally, James Geller, Patricia Morreale, Daehan Kwak
2024 conf
BIOSTEC (2)
Navya Martin Kollapally, James Geller
2024 conf
BIOSTEC (2)
Navya Martin Kollapally, James Geller
2024 conf
BIOSTEC (2)
Mahshad Koohi Habibi Dehkordi, Navya Martin Kollapally, Yehoshua Perl, James Geller, Fadi P. Deek, Hao Liu, Vipina Kuttichi Keloth, Gai Elhanan, Andrew J. Einstein
2024 conf
BIBM
Navya Martin Kollapally, Mahshad Koohi Habibi Dehkordi, Yehoshua Perl, James Geller, Fadi P. Deek, Hao Liu, Vipina Kuttichi Keloth, Gai Elhanan, Andrew J. Einstein, Shuxin Zhou
2023 J jnl
CoRR
Navya Martin Kollapally, James Geller
2023 J jnl
CoRR
Alen Chih-Yuan Li, Navya Martin Kollapally, Soon Ae Chun, James Geller
2023 J jnl
CoRR
Navya Martin Kollapally, Vipina Kuttichi Keloth, Julia Xu, James Geller
2022 conf
BIBM
Navya Martin Kollapally, Yan Chen, Julia Xu, James Geller
2022 J jnl
CoRR
Navya Martin Kollapally, Yan Chen, Julia Xu, James Geller
2021 conf
BIBM
James Geller, Navya Martin Kollapally
2021 C conf
KEOD
Navya Martin Kollapally, Yan Chen, James Geller
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"