Xiang Zhang

23 papers C 2Journal 17Unranked 4
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Zixuan Wang, Xiang Zhang, Yuchuan Zhou, Yiyi Jiang, Haibin Xu
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Runmin Lei, Yuchuan Zhou, Zixuan Wang, Xiang Zhang
2025 J jnl
ISPRS Int. J. Geo Inf.
Zongze He, Xiang Zhang
2024 J jnl
Int. J. Digit. Earth
Xiang Zhang, Jiayan An, Yuchuan Zhou, Min Yang, Xi Zhao
2023 J jnl
Int. J. Geogr. Inf. Sci.
Azelle Courtial, Guillaume Touya, Xiang Zhang
2022 conf
AGILE Conf.
Azelle Courtial, Guillaume Touya, Xiang Zhang
2021 J jnl
Remote. Sens.
Md Fazlul Karim, Xiang Zhang
2020 J jnl
ISPRS Int. J. Geo Inf.
Yi Xiao, Tinghua Ai, Min Yang, Xiang Zhang
2020 J jnl
ISPRS Int. J. Geo Inf.
Azelle Courtial, Achraf El Ayedi, Guillaume Touya, Xiang Zhang
2018 J jnl
Trans. GIS
Min Yang, Tinghua Ai, Xiongfeng Yan, Yuanyuan Chen, Xiang Zhang
2018 J jnl
ISPRS Int. J. Geo Inf.
Xiaodong Zhou, Zhe Chen, Xiang Zhang, Tinghua Ai
2018 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xiang Zhang, Weijun Yin, Min Yang, Tinghua Ai, Jantien E. Stoter
2017 J jnl
Int. J. Geogr. Inf. Sci.
Yakun He, Tinghua Ai, Wenhao Yu, Xiang Zhang
2017 J jnl
ISPRS Int. J. Geo Inf.
Xiongfeng Yan, Tinghua Ai, Xiang Zhang
2016 conf
AGILE Conf.
Xiang Zhang, Tinghua Ai, Jantien E. Stoter
2015 J jnl
Int. J. Geogr. Inf. Sci.
Tinghua Ai, Xiang Zhang, Qi Zhou, Min Yang
2014 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xi Zhao, Alfred Stein, Xiang Zhang, Lian Feng, Xiaoling Chen
2013 J jnl
Int. J. Geogr. Inf. Sci.
Xiang Zhang, Jantien E. Stoter, Tinghua Ai, Menno-Jan Kraak, Martien Molenaar
2013 J jnl
GeoInformatica
Xiang Zhang, Tinghua Ai, Jantien E. Stoter, Menno-Jan Kraak, Martien Molenaar
2010 C conf
SDH
Xiang Zhang, Tinghua Ai, Jantien E. Stoter
2010 C conf
SDH
Xiang Zhang, Jantien E. Stoter, Tinghua Ai, Menno-Jan Kraak
2009 conf
ISVD
Xiang Zhang, Tinghua Ai, Jantien E. Stoter
2007 conf
AGILE Conf.
Tinghua Ai, Xiang Zhang
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