N. Serdar Uckun

14 papers A* 2Journal 7Unranked 4
YearRankTypeTitle / Venue / Authors
2010 J jnl
IEEE Trans. Syst. Man Cybern. Part A
Ole J. Mengshoel, Mark Chavira, Keith Cascio, Scott Poll, Adnan Darwiche, N. Serdar Uckun
2008 J jnl
AI Mag.
Jerry T. Ball, Chris Arney, Samuel G. Collins, Mitchell Marcus, Sergei Nirenburg, Antonio Chella, Kai Goebel, Jason H. Li, Margaret Lyell, Brian Magerko, Riccardo Manzotti, Clayton T. Morrison, Tim Oates, Mark O. Riedl, Goran Trajkovski, Walt Truszkowski, N. Serdar Uckun
2008 A* conf
AAAI
Ole J. Mengshoel, Adnan Darwiche, Keith Cascio, Mark Chavira, Scott Poll, N. Serdar Uckun
2007 ed.
AAAI Fall Symposium: Artificial Intelligence for Prognostics
George J. Vachtsevanos, N. Serdar Uckun, Kai Goebel
1994 A* conf
AAAI
Barbara Hayes-Roth, N. Serdar Uckun, Jan Eric Larsson, David M. Gaba, Juliana Barr, Jane Chien
1993 J jnl
Artif. Intell. Medicine
N. Serdar Uckun
1993 J jnl
IEEE Expert
N. Serdar Uckun, Sugato Bagchi, Kazuhiko Kawamura, Yutaka Miyabe
1993 J jnl
Artif. Intell. Medicine
N. Serdar Uckun, Benoit M. Dawant, D. P. Lindstrom
1992 J jnl
Artif. Intell. Medicine
N. Serdar Uckun, Benoit M. Dawant
1991 conf
ICGA
Sugato Bagchi, N. Serdar Uckun, Yutaka Miyabe, Kazuhiko Kawamura
1991 J jnl
IEEE Trans. Knowl. Data Eng.
John R. Bourne, Hsi-Ho Liu, Constantine D. Orogo, Glen C. Collins, N. Serdar Uckun, Arthur J. Brodersen
1990 conf
IEA/AIE (Vol. 1)
N. Serdar Uckun, Benoit M. Dawant, Gautam Biswas, Kazuhiko Kawamura
1990 conf
IEA/AIE (Vol. 1)
Jerry B. Weinberg, Gautam Biswas, N. Serdar Uckun
1989 conf
IEA/AIE (1)
N. Serdar Uckun, Benoit M. Dawant, Kazuhiko Kawamura
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"