Wanqiang Yao

24 papers C 1Journal 23
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Dou Li, Pengfei Li, Jinfei Hu, Wanqiang Yao, Lu Yan, Hooman Latifi, Bingzhe Tang, Lifeng Liu
2025 J jnl
Int. J. Geogr. Inf. Sci.
Dingming Zhang, Xinyu Wang, Wanqiang Yao, Yanfei Zhong
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yongjie Ma, Qingzhi Zhao, Duoduo Jiang, Wanqiang Yao, Yibin Yao, Jinfang Yin, Hongwu Guo, Yuan Zhai, Ying Xu, Ruikun Wang, Qingfang Chen, Jingyu Zhang
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yongjie Ma, Qingzhi Zhao, Wanqiang Yao, Hongwu Guo, Jinfang Yin, Ying Xu, Yuan Zhai, Yibin Yao, Yuting Gao
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Dou Li, Pengfei Li, Jinfei Hu, Xiao Bai, Hooman Latifi, Lifeng Liu, Wanqiang Yao
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Ningjing Wang, Xinyu Wang, Yang Pan, Wanqiang Yao, Yanfei Zhong
2024 C conf
IGARSS
Ningjing Wang, Yang Pan, Xinyu Wang, Wanqiang Yao, Yanfei Zhong
2024 J jnl
CoRR
Ningjing Wang, Xinyu Wang, Yang Pan, Wanqiang Yao, Yanfei Zhong
2023 J jnl
Remote. Sens.
Xin Yang, Xiaohu Lin, Wanqiang Yao, Hongwei Ma, Junliang Zheng, Bolin Ma
2023 J jnl
Remote. Sens.
Yanjun Du, Yuanxi Yang, Xiaolin Jia, Wanqiang Yao, Jiahao Li, Qin Li
2023 J jnl
Remote. Sens.
Qin Li, Wanqiang Yao, Rui Tu, Yanjun Du, Mingyue Liu
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Qingzhi Zhao, Pengfei Yang, Wanqiang Yao, Yibin Yao
2022 J jnl
Remote. Sens.
Junliang Zheng, Wanqiang Yao, Xiaohu Lin, Bolin Ma, Lingxiao Bai
2022 J jnl
Remote. Sens.
Yongjie Ma, Qingzhi Zhao, Kan Wu, Wanqiang Yao, Yang Liu, Zufeng Li, Yun Shi
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Qingzhi Zhao, Yang Liu, Wanqiang Yao, Yibin Yao
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Peng Chen, Hang Liu, Michael Schmidt, Yibin Yao, Wanqiang Yao
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Qingzhi Zhao, Zheng Du, Zufeng Li, Wanqiang Yao, Yibin Yao
2020 J jnl
Remote. Sens.
Qingzhi Zhao, Yang Liu, Wanqiang Yao, Xiongwei Ma, Yibin Yao
2020 J jnl
IEEE Trans. Geosci. Remote. Sens.
Qingzhi Zhao, Yang Liu, Xiongwei Ma, Wanqiang Yao, Yibin Yao, Xin Li
2020 J jnl
IEEE Access
Qingzhi Zhao, Xiongwei Ma, Wanqiang Yao, Yang Liu, Yibin Yao
2020 J jnl
Sensors
Qingzhi Zhao, Pengfei Yang, Wanqiang Yao, Yibin Yao
2019 J jnl
Remote. Sens.
Qingzhi Zhao, Xiongwei Ma, Wanqiang Yao, Yibin Yao
2019 J jnl
Sensors
Qingzhi Zhao, Xiongwei Ma, Wanqiang Yao, Yang Liu, Zheng Du, Pengfei Yang, Yibin Yao
2018 J jnl
Remote. Sens.
Qingzhi Zhao, Yibin Yao, Wanqiang Yao
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