Isaac Cano

15 papers B 3Misc 1Journal 5Unranked 6
YearRankTypeTitle / Venue / Authors
2019 conf
EMBC
Mireia Calvo, Isaac Cano, Carme Hernández, Vicent J. Ribas, Felip Miralles, Josep Roca, Raimon Jané
2019 B conf
CBMS
Stefano Mariani, Franco Zambonelli, Ákos Tényi, Isaac Cano, Josep Roca
2019 Misc conf
EDCC
Sotiris Diamantopoulos, Marco Nalin, Ilaria Baroni, Fabrizio Clemente, Giuliana Faiella, Charis Mesaritakis, Evangelos Grivas, Janne Rasmussen, Jan Petersen, Isaac Cano, Elisa Puigdomènech, Dimitris Karamitros, Erol Gelenbe, Jos Dumortier, Maja Voss-Knude Voronkov, Luigi Romano, Luigi Coppolino, Vassilis Koutkias, Kostas Votis, Oana Stan, Paolo Campegiani, David Mari Martinez
2019 conf
IDCS
Sotiris Diamantopoulos, Dimitris Karamitros, Luigi Romano, Luigi Coppolino, Vassilis Koutkias, Kostas Votis, Oana Stan, Paolo Campegiani, David Mari Martinez, Marco Nalin, Ilaria Baroni, Fabrizio Clemente, Giuliana Faiella, Charis Mesaritakis, Evangelos Grivas, Janne Rasmussen, Jan Petersen, Isaac Cano, Elisa Puigdomènech, Erol Gelenbe, Jos Dumortier, Maja Voss-Knude
2018 conf
Euro-CYBERSEC
Giuliana Faiella, Ioannis Komnios, Maja Voss-Knude, Isaac Cano, Penny Duquenoy, Marco Nalin, Ilaria Baroni, Flavia Matrisciano, Fabrizio Clemente
2018 J jnl
BMC Medical Informatics Decis. Mak.
Pantelis Natsiavas, Janne Rasmussen, Maja Voss-Knude, Konstantinos Votis, Luigi Coppolino, Paolo Campegiani, Isaac Cano, David Marí, Giuliana Faiella, Fabrizio Clemente, Marco Nalin, Evangelos Grivas, Oana Stan, Erol Gelenbe, Jos Dumortier, Jan Petersen, Dimitrios Tzovaras, Luigi Romano, Ioannis Komnios, Vassilis Koutkias
2016 J jnl
BMC Bioinform.
Ákos Tényi, Pedro de Atauri, David Gomez-Cabrero, Isaac Cano, Kim Clarke, Francesco Falciani, Marta Cascante, Josep Roca, Dieter Maier
2016 J jnl
BMC Bioinform.
David Gomez-Cabrero, Jörg Menche, Claudia Vargas, Isaac Cano, Dieter Maier, Albert-László Barabási, Jesper Tegnér, Josep Roca
2015 J jnl
J. Biomed. Informatics
Isaac Cano, Albert Alonso, Carme Hernández, Felip Burgos, Anael Barberan-Garcia, Jim Roldan, Josep Roca
2010 J jnl
Soft Comput.
Vicenç Torra, Isaac Cano, Sadaaki Miyamoto, Yasunori Endo
2010 conf
PSDML
Isaac Cano, Vicenç Torra
2010 B conf
FUZZ-IEEE
Isaac Cano, Susana Ladra, Vicenç Torra
2010 conf
ICAISC (2)
Isaac Cano, Vicenç Torra
2009 conf
CIKM-PAVLAD
Isaac Cano, Guillermo Navarro-Arribas, Vicenç Torra
2009 B conf
FUZZ-IEEE
Isaac Cano, Vicenç Torra
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"