Radim Baca

32 papers A* 1C 4Journal 10Unranked 17
YearRankTypeTitle / Venue / Authors
2024 J jnl
Proc. VLDB Endow.
Radim Baca
2021 J jnl
IEEE Trans. Knowl. Data Eng.
Petr Lukás, Radim Baca, Michal Krátký, Tok Wang Ling
2020 A* conf
ICDE
Petr Lukás, Radim Baca, Michal Krátký, Tok Wang Ling
2019 J jnl
CoRR
Petr Lukás, Radim Baca, Michal Krátký
2018 J jnl
IEEE Trans. Ind. Electron.
Michal Krátký, Stanislav Misák, Petr Gajdos, Petr Lukas, Radim Baca, Peter Chovanec
2017 J jnl
CoRR
Petr Lukás, Radim Baca, Michal Krátký
2017 J jnl
ACM Comput. Surv.
Radim Baca, Michal Krátký, Irena Holubová, Martin Necaský, Tomás Skopal, Martin Svoboda, Sherif Sakr
2015 J jnl
Inf. Syst.
Radim Baca, Petr Lukas, Michal Krátký
2014 conf
DATESO
Radim Baca, Peter Chovanec, Michal Krátký, Petr Lukas
2013 J jnl
VLDB J.
Radim Baca, Michal Krátký, Tok Wang Ling, Jiaheng Lu
2013 conf
DATESO
Petr Lukas, Radim Baca, Michal Krátký
2012 J jnl
Inf. Sci.
Jirí Walder, Michal Krátký, Radim Baca, Jan Platos, Václav Snásel
2012 C conf
IDEAS
Radim Baca, Michal Krátký
2011 conf
DATESO
Radim Baca, David Bednar
2011 conf
ICDIM
Michal Krátký, Radim Baca, David Bednar, Jirí Walder, Jiri Dvorský, Peter Chovanec
2011 conf
WAIM Workshops
Filip Krizka, Michal Krátký, Radim Baca, Peter Chovanec
2010 conf
DASFAA Workshops
Radim Baca, Jirí Walder, Martin Pawlas, Michal Krátký
2010 C conf
ADBIS
Filip Krizka, Michal Krátký, Radim Baca
2010 conf
ADBIS (Local Proceedings)
Filip Krizka, Michal Krátký, Radim Baca
2010 conf
DEXA (1)
Peter Chovanec, Michal Krátký, Radim Baca
2009 conf
PDeS
Jiri Dvorský, Jan Martinovic, Václav Snásel, Lukás Adamus, Michal Gacek, Radim Baca
2009 conf
DATESO
Jirí Walder, Michal Krátký, Radim Baca
2009 conf
ITAT
Filip Krizka, Michal Krátký, Radim Baca
2009 conf
DATESO
Radim Baca, Martin Pawlas
2009 conf
XSym
Radim Baca, Michal Krátký
2009 conf
DASFAA Workshops
Radim Baca, Michal Krátký
2008 conf
DataX@EDBT
Radim Baca, Michal Krátký
2008 C conf
IDEAS
Radim Baca, Michal Krátký, Václav Snásel
2008 conf
DATESO
Michal Krátký, Radim Baca
2007 C conf
DEXA
Michal Krátký, Radim Baca, Václav Snásel
2007 J jnl
CoRR
Radim Baca, Václav Snásel, Jan Platos, Michal Krátký, Eyas El-Qawasmeh
2006 conf
DATESO
Michal Krátký, Radim Baca
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"