M. Becker

15 papers A* 1Journal 8Unranked 6
YearRankTypeTitle / Venue / Authors
2015 conf
OFC
Zhixin Liu, Zhihong Li, Yong Chen, Brian Kelly, Richard Phelan, John O'Carroll, John P. Wooler, Natalie V. Wheeler, Alexander M. Heidt, Thomas Richter, Colja Schubert, M. Becker, Francesco Poletti, Marco N. Petrovich, Shaif-Ul Alam, David J. Richardson, Radan Slavík
2013 conf
3DTV-Conference
M. Becker, M. Baron, Daniel Kondermann, Michael Bußler, Volker Helzle
2010 J jnl
IEEE Trans. Instrum. Meas.
George C. Giakos, S. Atreya Paturi, Keerthisrivatsav Valluru, P. Bathini, V. Adya, Srinivas Sukumar, K. Ambadipudi, B. Mandadi, M. Becker, S. Athawale, P. Farajipour, S. Marotta, Daniel B. Sheffer, Georgios Livanos, Michalis E. Zervakis
2002 J jnl
South Afr. Comput. J.
D. C. Smith, M. Becker, J. Burns-Howell, J. Kyriakides
1998 J jnl
Ann. Oper. Res.
M. Moulki, André-Luc Beylot, L. Truffet, M. Becker
1992 J jnl
Eng. Comput.
Robert Schneiders, Walter Oberschelp, Reiner Kopp, M. Becker
1991 conf
Fault-Tolerant Computing Systems
M. Becker, Friedrich Lücking
1990 J jnl
Comput. Syst. Sci. Eng.
M. Becker, C. Dekoninck, J. P. Prost, B. Verrier
1989 J jnl
Int. J. High Speed Comput.
J. P. Prost, M. Becker
1988 A* conf
SIGMETRICS
M. Becker, C. Dekoninck, J. P. Prost, B. Verrier
1988 conf
Simulationstechnik
M. Becker, Reiner Kopp
1987 J jnl
Comput. Syst. Sci. Eng.
J. R. Barra, M. Becker, E. F. M. Kouka, M. Tricot
1986 J jnl
J. Syst. Softw.
M. Becker, G. Pion
1983 conf
ICOD
Nguyen Hoan Phuc, M. Becker, P. Sevray
1979 conf
PASCAL
M. Becker, W. Dersch, K. Guntermann, P. Hofferbert, A. Kappas, E. Seibert, H. Waldschmidt
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"