Camilo Libedinsky

26 papers B 1C 1Journal 8Unranked 16
YearRankTypeTitle / Venue / Authors
2025 J jnl
PLoS Comput. Biol.
Evangelos Sigalas, Camilo Libedinsky
2024 J jnl
Algorithms
Kyle McMillan, Rosa Q. So, Camilo Libedinsky, Kai Keng Ang, Brian Premchand
2023 B conf
CogSci
Evangelos Sigalas, Thanh Vinh Vo, Tze-Yun Leong, Camilo Libedinsky
2022 conf
EMBC
Brian Premchand, Kyaw Kyar Toe, Chuanchu Wang, Camilo Libedinsky, Kai Keng Ang, Rosa Q. So
2022 J jnl
IEEE Trans. Biomed. Eng.
Agata Blasiak, Kian Ann Ng, Marshal Dian Sheng Wong, Chne-Wuen Tsai, Astrid Rusly, Gil Gerald Lasam Gammad, Kai Voges, Camilo Libedinsky, Shih-Cheng Yen, Nitish V. Thakor, Amitabha Lahiri
2021 J jnl
CoRR
M. Ganesh Kumar, Cheston Tan, Camilo Libedinsky, Shih-Cheng Yen, Andrew Yong-Yi Tan
2021 conf
EMBC
Han Wei Ng, Brian Premchand, Kyaw Kyar Toe, Camilo Libedinsky, Rosa Q. So
2021 J jnl
CoRR
M. Ganesh Kumar, Cheston Tan, Camilo Libedinsky, Shih-Cheng Yen, Andrew Yong-Yi Tan
2020 conf
EMBC
Brian Premchand, Kyaw Kyar Toe, Chuanchu Wang, Shoeb Shaikh, Camilo Libedinsky, Kai Keng Ang, Rosa Q. So
2020 C conf
ISCAS
Shoeb Shaikh, Rosa Q. So, Tafadzwa Sibindi, Camilo Libedinsky, Arindam Basu
2019 conf
NER
Shoeb Shaikh, Rosa Q. So, Camilo Libedinsky, Arindam Basu
2019 conf
BHI
Brian Premchand, Kyaw Kyar Toe, Chuanchu Wang, Camilo Libedinsky, Kai Keng Ang, Rosa Q. So
2019 conf
NER
Shoeb Shaikh, Rosa Q. So, Tafadzwa Sibindi, Camilo Libedinsky, Arindam Basu
2019 J jnl
IEEE Trans. Biomed. Circuits Syst.
Shoeb Shaikh, Rosa Q. So, Tafadzwa Sibindi, Camilo Libedinsky, Arindam Basu
2018 conf
BioCAS
Li Jing Ong, Shih-Chiang Liu, Marshal Dian Sheng Wong, Tafadzwa Sibindi, Gil Gerald Lasam Gammad, Chne Wuen Tsai, Astrid Rusly, Kian Ann Ng, Camilo Libedinsky, Sudip Nag, Shih-Cheng Yen
2018 J jnl
CoRR
Shoeb Shaikh, Rosa Q. So, Tafadzwa Sibindi, Camilo Libedinsky, Arindam Basu
2018 conf
EMBC
Huijuan Yang, Kai Keng Ang, Camilo Libedinsky, Rosa Q. So
2017 conf
BioCAS
Marshal Dian Sheng Wong, Kian Ann Ng, Sudip Nag, Rangarajan Jegadeesan, Khay-Wai Leong, Li Jing Ong, Astrid Rusly, Monzurul Alam, Gil Gerald Lasam Gammad, Chne Wuen Tsai, Shih-Chiang Liu, Kai Voges, Nitish V. Thakor, Amitabha Lahiri, Camilo Libedinsky, Yong Ping Xu, Shih-Cheng Yen
2017 conf
EMBC
Huijuan Yang, Camilo Libedinsky, Cuntai Guan, Kai Keng Ang, Rosa Q. So
2017 conf
EMBC
Tze Hui Koh, Camilo Libedinsky, Cuntai Guan, Kai Keng Ang, Rosa Q. So
2017 conf
NER
Gary C. F. Lee, Camilo Libedinsky, Cuntai Guan, Rosa Q. So
2016 conf
EMBC
Rosa Q. So, Camilo Libedinsky, Kai Keng Ang, Wee Chiek Clement Lim, Kyaw Kyar Toe, Cuntai Guan
2015 conf
NER
Swathi Sheshadri, Jukka Kortelainen, Jacopo Rigosa, Annarita Cutrone, Silvia Bossi, Camilo Libedinsky, Amitabha Lahiri, Louiza Chan, Keefe Chng, Nitish V. Thakor, Ignacio Delgado-Martínez, Shih-Cheng Yen
2015 conf
NER
Rosa Q. So, Zhiming Xu, Camilo Libedinsky, Kyaw Kyar Toe, Kai Keng Ang, Shih-Cheng Yen, Cuntai Guan
2015 J jnl
NeuroImage
Stijn A. A. Massar, Camilo Libedinsky, Chee Weiyan, Scott A. Huettel, Michael W. L. Chee
2014 conf
EMBC
Swathi Sheshadri, Jukka Kortelainen, Sudip Nag, Kian Ann Ng, Faith A. Bazley, Frederic Michoud, Anoop C. Patil, Josue Orellana, Camilo Libedinsky, Amitabha Lahiri, Louiza Chan, Keefe Chng, Annarita Cutrone, Silvia Bossi, Nitish V. Thakor, Ignacio Delgado-Martínez, Shih-Cheng Yen
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