Carlo Alberto Magni

20 papers C 1Misc 1Journal 15Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. Oper. Res.
Jean-François Côté, Giulia Dotti, Vinícius Loti de Lima, Carlo Alberto Magni, Manuel Iori
2025 J jnl
INFOR Inf. Syst. Oper. Res.
Bruno Petrato Bruck, Manuel Iori, Carlo Alberto Magni, Daniele Pretolani, Dario Vezzali
2024 J jnl
Comput. Oper. Res.
Giulia Caselli, Maxence Delorme, Manuel Iori, Carlo Alberto Magni
2023 J jnl
Eur. J. Oper. Res.
Carlo Alberto Magni, Andrea Marchioni, Davide Baschieri
2022 C conf
INOC
Giulia Caselli, Giomaria Columbu, Manuel Iori, Carlo Alberto Magni
2022 J jnl
Int. J. Inf. Technol. Decis. Mak.
Maria Letizia Guerra, Carlo Alberto Magni, Luciano Stefanini
2021 conf
ICEIS (1)
Bruno Petrato Bruck, Dario Vezzali, Manuel Iori, Carlo Alberto Magni, Daniele Pretolani
2021 conf
ICEIS (1)
Nícolas P. Campana, Giorgio Zucchi, Manuel Iori, Carlo Alberto Magni, Anand Subramanian
2020 J jnl
J. Oper. Res. Soc.
Carlo Alberto Magni, Stefano Malagoli, Andrea Marchioni, Giovanni Mastroleo
2018 J jnl
Eur. J. Oper. Res.
Andrea Marchioni, Carlo Alberto Magni
2015 J jnl
Eur. J. Oper. Res.
Carlo Alberto Magni
2014 J jnl
Fuzzy Sets Syst.
Maria Letizia Guerra, Carlo Alberto Magni, Luciano Stefanini
2012 conf
IPMU (4)
Maria Letizia Guerra, Carlo Alberto Magni, Luciano Stefanini
2010 J jnl
Eur. J. Oper. Res.
Carlo Alberto Magni
2009 J jnl
Eur. J. Oper. Res.
Carlo Alberto Magni
2009 J jnl
Eur. J. Oper. Res.
Carlo Alberto Magni
2006 J jnl
Int. J. Inf. Technol. Decis. Mak.
Carlo Alberto Magni, Stefano Malagoli, Giovanni Mastroleo
2004 J jnl
Soft Comput.
Carlo Alberto Magni, Giovanni Mastroleo, Marina Vignola, Gisella Facchinetti
2002 J jnl
Eur. J. Oper. Res.
Carlo Alberto Magni
2001 Misc conf
SAC
Giovanni Mastroleo, Gisella Facchinetti, Carlo Alberto Magni
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"