Manish Saggar

14 papers B 1C 1Journal 10Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Hormoz Shahrzad, Niharika Gajawelli, Kaitlin Maile, Manish Saggar, Risto Miikkulainen
2023 J jnl
NeuroImage
Yinming Sun, Mengsen Zhang, Manish Saggar
2022 J jnl
NeuroImage
Mengsen Zhang, Yinming Sun, Manish Saggar
2022 J jnl
NeuroImage
Manish Saggar, Jennifer Lynn Bruno, Claudie Gaillard, Leonardo Claudino, Monique Ernst
2021 J jnl
NeuroImage
Manish Saggar, Emmanuelle Volle, Lucina Q. Uddin, Evangelia G. Chrysikou, Adam E. Green
2021 J jnl
NeuroImage
Hua Xie, Roger E. Beaty, Sahar Jahanikia, Caleb Geniesse, Neeraj S. Sonalkar, Manish Saggar
2019 J jnl
NeuroImage
Manish Saggar, Hua Xie, Roger E. Beaty, Atanas D. Stankov, Meredith Schreier, Allan L. Reiss
2019 conf
GECCO (Companion)
Kaitlin Maile, Manish Saggar, Risto Miikkulainen
2015 J jnl
NeuroImage
Manish Saggar, S. M. Hadi Hosseini, Jennifer Lynn Bruno, Eve-Marie Quintin, Mira M. Raman, Shelli R. Kesler, Allan L. Reiss
2015 J jnl
NeuroImage
Manish Saggar, Anthony P. Zanesco, Brandon G. King, David A. Bridwell, Katherine A. MacLean, Stephen R. Aichele, Tonya L. Jacobs, B. Alan Wallace, Clifford D. Saron, Risto Miikkulainen
2014 J jnl
NeuroImage
Manish Saggar, Elizabeth Walter Shelly, Jean-Francois Lepage, Fumiko Hoeft, Allan L. Reiss
2007 B conf
IJCNN
Manish Saggar, Tekin Meriçli, Sari Andoni, Risto Miikkulainen
2006 C conf
RoboCup
Manish Saggar, Thomas D'Silva, Nate Kohl, Peter Stone
2004 conf
SMC (4)
Manish Saggar, Ashish K. Agrawal, Abhimanyu Lad
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"