Castrense Savojardo

30 papers Journal 25Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
Bioinform.
Castrense Savojardo, Matteo Manfredi, Pier Luigi Martelli, Rita Casadio
2025 J jnl
Comput.
Gabriele Vazzana, Matteo Manfredi, Castrense Savojardo, Pier Luigi Martelli, Rita Casadio
2023 J jnl
Bioinform.
Giovanni Madeo, Castrense Savojardo, Matteo Manfredi, Pier Luigi Martelli, Rita Casadio
2022 J jnl
Bioinform.
Matteo Manfredi, Castrense Savojardo, Pier Luigi Martelli, Rita Casadio
2021 J jnl
Nucleic Acids Res.
Davide Baldazzi, Castrense Savojardo, Pier Luigi Martelli, Rita Casadio
2021 J jnl
Briefings Bioinform.
Castrense Savojardo, Pier Luigi Martelli, Rita Casadio, Piero Fariselli
2020 J jnl
Bioinform.
Castrense Savojardo, Niccolò Bruciaferri, Giacomo Tartari, Pier Luigi Martelli, Rita Casadio
2020 J jnl
BMC Bioinform.
Castrense Savojardo, Pier Luigi Martelli, Giacomo Tartari, Rita Casadio
2019 J jnl
Bioinform.
Ludovica Montanucci, Castrense Savojardo, Pier Luigi Martelli, Rita Casadio, Piero Fariselli
2019 ch.
Encyclopedia of Bioinformatics and Computational Biology (2)
Pier Luigi Martelli, Castrense Savojardo, Giuseppe Profiti, Rita Casadio
2018 J jnl
Nucleic Acids Res.
Castrense Savojardo, Pier Luigi Martelli, Piero Fariselli, Giuseppe Profiti, Rita Casadio
2018 J jnl
Bioinform.
Castrense Savojardo, Pier Luigi Martelli, Piero Fariselli, Rita Casadio
2017 J jnl
Bioinform.
Castrense Savojardo, Piero Fariselli, Pier Luigi Martelli, Rita Casadio
2017 J jnl
Bioinform.
Castrense Savojardo, Pier Luigi Martelli, Piero Fariselli, Rita Casadio
2016 J jnl
Bioinform.
Castrense Savojardo, Piero Fariselli, Pier Luigi Martelli, Rita Casadio
2015 J jnl
Bioinform.
Piero Fariselli, Pier Luigi Martelli, Castrense Savojardo, Rita Casadio
2015 J jnl
Bioinform.
Castrense Savojardo, Pier Luigi Martelli, Piero Fariselli, Rita Casadio
2014 J jnl
Bioinform.
Castrense Savojardo, Pier Luigi Martelli, Piero Fariselli, Rita Casadio
2013 J jnl
Bioinform.
Castrense Savojardo, Piero Fariselli, Pier Luigi Martelli, Rita Casadio
2013 J jnl
Bioinform.
Castrense Savojardo, Piero Fariselli, Rita Casadio
2013
Castrense Savojardo
2013 J jnl
BMC Bioinform.
Castrense Savojardo, Piero Fariselli, Pier Luigi Martelli, Rita Casadio
2013 J jnl
Bioinform.
Valentina Indio, Pier Luigi Martelli, Castrense Savojardo, Piero Fariselli, Rita Casadio
2011 conf
BIOINFORMATICS
Monther Alhamdoosh, Castrense Savojardo, Piero Fariselli, Rita Casadio
2011 J jnl
Bioinform.
Castrense Savojardo, Piero Fariselli, Rita Casadio
2011 J jnl
Bioinform.
Castrense Savojardo, Piero Fariselli, Monther Alhamdoosh, Pier Luigi Martelli, Andrea Pierleoni, Rita Casadio
2011 conf
CIBB
Castrense Savojardo, Piero Fariselli, Damiano Piovesan, Pier Luigi Martelli, Rita Casadio
2011 J jnl
Nucleic Acids Res.
Andrea Pierleoni, Valentina Indio, Castrense Savojardo, Piero Fariselli, Pier Luigi Martelli, Rita Casadio
2010 conf
CIBB
Castrense Savojardo, Piero Fariselli, Pier Luigi Martelli, Priyank Shukla, Rita Casadio
2009 J jnl
Algorithms Mol. Biol.
Piero Fariselli, Castrense Savojardo, Pier Luigi Martelli, Rita Casadio
redb/extractor_registry.py
← Index redb/extractor_registry.py python
"""
Extractor registry with lazy loading by file type.

Groups extractors by file type (pe, elf, macho, apk) and only imports
the relevant group when that file type is first encountered. This avoids
loading heavy dependencies (pefile, lief, androguard, etc.) into workers
that don't need them.
"""
import importlib
import logging

logger = logging.getLogger(__name__)

# Registry: group name -> list of (module_path, class_names)
_REGISTRY = {
    "pe": [
        ("redb.extractors.pe_extractors", [
            "PEFeaturesExtractor",
            "PEImportExtractor",
            "PEResourceExtractor",
            "PEOverlayExtractor",
            "PESectionExtractor",
            "PESignatureExtractor",
            "PEExtraFindings",
            "PEInconstistencyTestsExtractor",
            "PEDotNetExtractor",
        ]),
    ],
    "elf": [
        ("redb.extractors.elf_extractors", [
            "ELFFeaturesExtractor",
            "ELFSegmentExtractor",
            "ELFSectionExtractor",
            "ELFDependencyExtractor",
            "ELFSymbolExtractor",
            "ELFImportExtractor",
            "ELFExportExtractor",
            "ELFRelocationExtractor",
            "ELFNotesExtractor",
        ]),
    ],
    "macho": [
        ("redb.extractors.macho_extractors", [
            "MachOFeaturesExtractor",
            "MachOSegmentExtractor",
            "MachOImportExtractor",
            "MachOExportExtractor",
            "MachODylibExtractor",
            "MachOSignatureExtractor",
        ]),
    ],
    "apk": [
        ("redb.extractors.apk_extractors", [
            "APKFeaturesExtractor",
            "APKManifestExtractor",
            "APKPermissionsExtractor",
            "APKSignatureExtractor",
            "APKDexExtractor",
            "APKResourceExtractor",
            "APKNativeLibExtractor",
            "APKInconsistencyTestsExtractor",
        ]),
        ("redb.extractors.decompiler.DecompileAPK", [
            "DecompileAPK",
        ]),
    ],
    "js": [
        ("redb.extractors.js_extractors", [
            "JSFeaturesExtractor",
            "JSSuspiciousAPIsExtractor",
            "JSStringsExtractor",
            "JSDeobfuscationExtractor",
            "JSContentExtractor",
        ]),
    ],
}

# Map filetype labels (from Magika) to registry group names
FILETYPE_TO_GROUP = {
    "pebin": "pe",
    "elf": "elf",
    "macho": "macho",
    "apk": "apk",
    "javascript": "js",
}

# Cache: group name -> {class_name: class}
_group_cache = {}


def _load_group(group_name):
    """Import all extractors for a group. Cached after first call."""
    if group_name in _group_cache:
        return _group_cache[group_name]

    logger.debug(f"Loading extractor group: {group_name}")

    # Suppress androguard logging before importing APK extractors
    if group_name == "apk":
        from loguru import logger as loguru_logger
        loguru_logger.disable("androguard")

    classes = {}
    for module_path, class_names in _REGISTRY[group_name]:
        mod = importlib.import_module(module_path)
        for name in class_names:
            classes[name] = getattr(mod, name)

    _group_cache[group_name] = classes
    return classes


def get_filetype_modules(filetype):
    """Get the list of format-specific extractor classes for a filetype.

    Returns only analysis extractors (excludes decompilers like DecompileAPK).
    """
    group = FILETYPE_TO_GROUP.get(filetype)
    if not group:
        return []
    classes = _load_group(group)
    return [cls for name, cls in classes.items() if not name.startswith("Decompile")]


def get_extractor_class(name):
    """Look up a single extractor class by name across all groups.

    Checks cached groups first, then loads groups on demand.
    """
    # Check already-loaded groups first
    for group_classes in _group_cache.values():
        if name in group_classes:
            return group_classes[name]

    # Search all groups (triggers lazy loading)
    for group_name in _REGISTRY:
        classes = _load_group(group_name)
        if name in classes:
            return classes[name]

    return None