Weilian Li

44 papers Journal 42Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
Environ. Model. Softw.
Jinbin Zhang, Hengchao Gu, Jun Zhu, Peiqi Que, Fanxu Huang, Yanhe Sun, Yuena Zhu, Weilian Li
2026 J jnl
Environ. Model. Softw.
Jun Zhu, Jianlin Wu, Yukun Guo, Jinbin Zhang, Zhihao Guo, Pei Dang, Weilian Li
2025 J jnl
CoRR
Weilian Li, Jun Zhu, Saied Pirasteh, Qing Zhu, Yukun Guo, Lan Luo, Youness Dehbi
2025 J jnl
Int. J. Digit. Earth
Yukun Guo, Jun Zhu, Jianlin Wu, Jinbin Zhang, Zhihao Guo, Weilian Li, Heng Zhang
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Zhihao Guo, Jun Zhu, Jinbin Zhang, Jianlin Wu, Yukun Guo, Fanxu Huang, Jiahao Li, Weilian Li, Bingli Xu
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Jinbin Zhang, Jun Zhu, Zhihao Guo, Jianlin Wu, Yukun Guo, Jianbo Lai, Weilian Li
2025 J jnl
CoRR
Jonathan Hecht, Weilian Li, Ziyue Li, Youness Dehbi
2024 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Weilian Li, Jun Zhu, Saied Pirasteh, Qing Zhu, Yukun Guo, Lan Luo, Youness Dehbi
2024 J jnl
Int. J. Geogr. Inf. Sci.
Jun Zhu, Pei Dang, Yungang Cao, Jianbo Lai, Yukun Guo, Ping Wang, Weilian Li
2024 J jnl
Int. J. Geogr. Inf. Sci.
Jun Zhu, Jinbin Zhang, Qing Zhu, Weilian Li, Jianlin Wu, Yukun Guo
2024 J jnl
ISPRS Int. J. Geo Inf.
Mohamed A. Damos, Jun Zhu, Weilian Li, Elhadi Khalifa, Abubakr Hassan, Rashad Elhabob, Alaa Hm, Esra Ei
2024 J jnl
Int. J. Geogr. Inf. Sci.
Jinbin Zhang, Jun Zhu, Yuxuan Zhou, Qing Zhu, Jianlin Wu, Yukun Guo, Pei Dang, Weilian Li, Heng Zhang
2024 J jnl
Int. J. Geogr. Inf. Sci.
Weilian Li, Jan-Henrik Haunert, Axel Forsch, Jun Zhu, Qing Zhu, Youness Dehbi
2024 J jnl
Int. J. Geogr. Inf. Sci.
Jun Zhu, Pei Dang, Jinbin Zhang, Yungang Cao, Jianlin Wu, Weilian Li, Ya Hu, Jigang You
2024 J jnl
Int. J. Geogr. Inf. Sci.
Weilian Li, Jun Zhu, Qing Zhu, Jinbin Zhang, Xiao Han, Youness Dehbi
2023 J jnl
Environ. Model. Softw.
Pei Dang, Jun Zhu, Yuxuan Zhou, Yuting Rao, Jigang You, Jianlin Wu, Mengting Zhang, Weilian Li
2023 J jnl
Int. J. Digit. Earth
Jianlin Wu, Jun Zhu, Jinbin Zhang, Pei Dang, Weilian Li, Yukun Guo, Lin Fu, Jianbo Lai, Jigang You, Yakun Xie, Ce Liang
2023 J jnl
Int. J. Digit. Earth
Jinbin Zhang, Jun Zhu, Pei Dang, Jianlin Wu, Yuxuan Zhou, Weilian Li, Lin Fu, Yukun Guo, Jigang You
2023 J jnl
Expert Syst. Appl.
Weilian Li, Jun Zhu, Pei Dang, Jianlin Wu, Jinbin Zhang, Lin Fu, Qing Zhu
2023 J jnl
Trans. GIS
Heng Zhang, Wen Zhao, Zujie Han, Jun Zhu, Qing Zhu, Zhu Xu, Dejun Feng, Yongjun Song, Shufeng Song, Bo Zhang, Fengpin Jia, Yakun Xie, Yushan Quan, Junhu Zhang, Weilian Li
2023 J jnl
Int. J. Digit. Earth
Jigang You, Jun Zhu, Weilian Li, Yukun Guo, Lin Fu, Pei Dang
2023 J jnl
Trans. GIS
Weilian Li, Jan-Henrik Haunert, Julius Knechtel, Jun Zhu, Qing Zhu, Youness Dehbi
2023 J jnl
Int. J. Digit. Earth
Heng Zhang, Wen Zhao, Zujie Han, Jun Zhu, Qing Zhu, Xinwen Ning, Dengke Fan, Hua Wang, Fengpin Jia, Wei Fang, Bin Yang, Weilian Li
2022 J jnl
ISPRS Int. J. Geo Inf.
Ping Wang, Xingdong Deng, Yang Liu, Liang Guo, Jun Zhu, Lin Fu, Yakun Xie, Weilian Li, Jianbo Lai
2022 J jnl
ISPRS Int. J. Geo Inf.
Lin Fu, Jun Zhu, Jianbo Lai, Weilian Li, Pei Dang, Lingzhi Yin, Jialuo Li, Yukun Guo, Jigang You
2022 J jnl
Trans. GIS
Huixin Zhang, Ya Hu, Jun Zhu, Lin Fu, Bingli Xu, Weilian Li
2022 J jnl
Int. J. Digit. Earth
Pei Dang, Jun Zhu, Jianlin Wu, Weilian Li, Jigang You, Lin Fu, Yiqun Shi, Yuhang Gong
2022 J jnl
Trans. GIS
Weilian Li, Jun Zhu, Saied Pirasteh, Qing Zhu, Lin Fu, Jianlin Wu, Ya Hu, Youness Dehbi
2022 J jnl
Int. J. Digit. Earth
Weilian Li, Jun Zhu, Jan-Henrik Haunert, Lin Fu, Qing Zhu, Youness Dehbi
2022 J jnl
Trans. GIS
Jianbo Lai, Jun Zhu, Yakun Xie, Ping Wang, Weilian Li, Lin Fu
2021 J jnl
ISPRS Int. J. Geo Inf.
Mohamed A. Damos, Jun Zhu, Weilian Li, Abubakr Hassan, Elhadi Khalifa
2021 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Pei Dang, Jun Zhu, Saied Pirasteh, Weilian Li, Jigang You, Bingli Xu, Ce Liang
2021 J jnl
Environ. Model. Softw.
Weilian Li, Jun Zhu, Lin Fu, Qing Zhu, Yukun Guo, Yuhang Gong
2021 J jnl
Int. J. Geogr. Inf. Sci.
Weilian Li, Jun Zhu, Lin Fu, Qing Zhu, Yakun Xie, Ya Hu
2021 J jnl
Int. J. Digit. Earth
Lin Fu, Jun Zhu, Weilian Li, Qing Zhu, Bingli Xu, Yakun Xie, Yunhao Zhang, Ya Hu, Jingtao Lu, Pei Dang, Jigang You
2020 J jnl
ISPRS Int. J. Geo Inf.
Yukun Guo, Jun Zhu, Yu Wang, Jinchuan Chai, Weilian Li, Lin Fu, Bingli Xu, Yuhang Gong
2020 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yakun Xie, Jun Zhu, Yungang Cao, Dejun Feng, Minjun Hu, Weilian Li, Yunhao Zhang, Lin Fu
2020 J jnl
Int. J. Digit. Earth
Yunhao Zhang, Jun Zhu, Qing Zhu, Yakun Xie, Weilian Li, Lin Fu, Junxiao Zhang, Jianmei Tan
2019 J jnl
ISPRS Int. J. Geo Inf.
Weilian Li, Jun Zhu, Yunhao Zhang, Yungang Cao, Ya Hu, Lin Fu, Pengcheng Huang, Yakun Xie, Lingzhi Yin, Bingli Xu
2019 J jnl
ISPRS Int. J. Geo Inf.
Yunhao Zhang, Jun Zhu, Weilian Li, Qing Zhu, Ya Hu, Lin Fu, Junxiao Zhang, Pengcheng Huang, Yakun Xie, Lingzhi Yin
2018 conf
Geoinformatics
Yunhao Zhang, Jun Zhu, Weilian Li, Ya Hu, Mingwei Liu
2018 J jnl
ISPRS Int. J. Geo Inf.
Ya Hu, Jun Zhu, Weilian Li, Yunhao Zhang, Qing Zhu, Hua Qi, Huixin Zhang, Zhenyu Cao, Weijun Yang, Pengcheng Zhang
2018 conf
Geoinformatics
Weilian Li, Jun Zhu, Yunhao Zhang, Ya Hu
2017 J jnl
ISPRS Int. J. Geo Inf.
Lingzhi Yin, Jun Zhu, Yi Li, Chao Zeng, Qing Zhu, Hua Qi, Mingwei Liu, Weilian Li, Zhenyu Cao, Weijun Yang, Pengcheng Zhang
redb/extractors/macho_extractors/macho_imports.py
← Index redb/extractors/macho_extractors/macho_imports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOImport


class MachOImportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_imports"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_IMPORT.value

    def _extract_imports(self, arch_name=None):
        """Extract import information from the MachO binary for a specific architecture.

        Handles machofile v2026.2.4+ API where get_imported_functions() returns:
        Dict[str, List[Dict]] where each dict has {'name': str, 'sources': [str, ...]}
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get imported functions using API for specific architecture
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            if not imported_functions:
                return None

            # Keep the library→functions mapping (like PE does)
            library_names = []
            imports_with_mapping = []  # List of {library: [(name, source), ...]}

            for dylib_name, functions in imported_functions.items():
                # v2026.2.4+: dylib_name is already str, but handle bytes for compatibility
                if isinstance(dylib_name, bytes):
                    dylib_name = dylib_name.decode('utf-8', errors='replace')
                library_names.append(dylib_name)

                # Process function entries
                func_list = []
                for func_entry in functions:
                    # v2026.2.4+: func_entry is {'name': str, 'sources': [str, ...]}
                    if isinstance(func_entry, dict):
                        func_name = func_entry.get('name', '')
                        # Join sources if multiple, take first if single
                        sources = func_entry.get('sources', [])
                        import_source = sources[0] if sources else None
                        func_list.append((func_name, import_source))
                    else:
                        # Legacy format: func_entry is str or bytes
                        if isinstance(func_entry, bytes):
                            func_entry = func_entry.decode('utf-8', errors='replace')
                        func_list.append((func_entry, None))

                imports_with_mapping.append({dylib_name: func_list})

            # Count total functions
            total_functions = sum(len(list(d.values())[0]) for d in imports_with_mapping)

            # Create import dataclass with mapping preserved
            macho_import = MachOImport(
                macho_imports_total=total_functions,
                macho_import_libraryName=library_names if library_names else None,
                macho_import_functions=imports_with_mapping if imports_with_mapping else None
            )

            return macho_import

        except Exception as e:
            self.log.error(f"Error extracting MachO imports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of imports for each architecture
                results = []
                for arch_name in architectures:
                    imports = self._extract_imports(arch_name)
                    if imports:
                        imports.arch_identifier = arch_name
                        results.append(imports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_imports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO imports: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            # Flatten the data - one row per function import (like PE imports)
            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get imports for this architecture
                macho_import = self._extract_imports(arch_name)
                if not macho_import or not macho_import.macho_import_functions:
                    continue

                # Flatten to one row per (library, function) pair
                for lib_funcs in macho_import.macho_import_functions:
                    for lib, funcs in lib_funcs.items():
                        for func_name, import_source in funcs:
                            data.append([
                                arch_sha256,        # sha256 (arch-specific)
                                lib,                # library_name
                                func_name,          # function_name
                                import_source,      # import_source (chained_fixups, bind_opcodes, symtab)
                                current_time,       # analysis_date
                            ])

            column_names = [
                'sha256',
                'library_name', 'function_name', 'import_source',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def get_clickhouse_table(self) -> str:
        return "redb_macho_imports"