Xiai Chen

34 papers A* 2A 1Journal 23Unranked 8
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Robotics Autom.
Fantong Wang, Ling Wang, Suan Xu, Xiai Chen, Binrui Wang
2025 J jnl
IEEE Trans. Instrum. Meas.
Hang Yu, Huijie Fan, Xiai Chen, Qiang Wang, Zhi Han
2024 A conf
IROS
Zhuanglei Wen, Mingze Dong, Xiai Chen
2024 J jnl
CoRR
Zhuanglei Wen, Mingze Dong, Xiai Chen
2024 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Xudong Wang, Xiai Chen, Weihong Ren, Zhi Han, Huijie Fan, Yandong Tang, Lianqing Liu
2024 J jnl
CoRR
Shiben Liu, Huijie Fan, Qiang Wang, Xiai Chen, Zhi Han, Yandong Tang
2024 J jnl
IEEE Robotics Autom. Lett.
Xinglong Xu, Weihong Ren, Xiai Chen, Huijie Fan, Zhi Han, Honghai Liu
2024 J jnl
Eng. Appl. Artif. Intell.
Xin Luan, Qiang Wang, Huijie Fan, Xiai Chen, Zhi Han, Yandong Tang
2024 J jnl
Remote. Sens.
Xiai Chen, Zhen Wang, Kaidong Wang, Huidi Jia, Zhi Han, Yandong Tang
2023 conf
AAIA
Yuxuan Chen, Shuaiying Zhan, Gaoen Cao, Jialin Li, Zhihao Wu, Xiai Chen
2023 J jnl
Signal Process. Image Commun.
Pengyue Li, Xiai Chen, Jiandong Tian, Yandong Tang
2023 conf
AAIA
Shuaiying Zhan, Yuxuan Chen, Gaoen Cao, Mengyu Jiang, Xiai Chen
2023 J jnl
Ind. Robot
Ling Wang, Xiaoliang Wu, Zeng Kang, Yanfeng Gao, Xiai Chen, Binrui Wang
2022 J jnl
Knowl. Based Syst.
Baichen Liu, Zhi Han, Xiai Chen, Wenming Shao, Huidi Jia, Yanmei Wang, Yandong Tang
2022 conf
ICIRA (2)
Baichen Liu, Huidi Jia, Zhi Han, Xiai Chen, Yandong Tang
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Yang Zhang, Yao Wang, Zhi Han, Xiai Chen, Yandong Tang
2022 J jnl
Remote. Sens.
Siyu Guo, Xiai Chen, Huidi Jia, Zhi Han, Zhigang Duan, Yandong Tang
2022 conf
ICIRA (4)
Xiai Chen, Siyu Guo, Huidi Jia, Baichen Liu, Zhenyu Li, Zhi Han
2022 conf
ICIRA (2)
Huidi Jia, Siyu Guo, Zhenyu Li, Xiai Chen, Zhi Han, Yandong Tang
2022 J jnl
CoRR
Mi Zhou, Hongye Liu, Zhekun Lv, Wei Hong, Xiai Chen
2022 J jnl
Frontiers Neuroinformatics
Huidi Jia, Xiai Chen, Zhi Han, Baichen Liu, Tianhui Wen, Yandong Tang
2022 conf
ICCDA
Yu Guan, Xiai Chen, Jiandong Tian, Yandong Tang
2022 conf
ICIRA (2)
Wei Zhang, Xiai Chen, Shuangxi Du, Huijie Fan, Yandong Tang
2021 J jnl
CoRR
Yang Zhang, Yao Wang, Zhi Han, Xiai Chen, Yandong Tang
2018 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xiai Chen, Zhi Han, Yao Wang, Qian Zhao, Deyu Meng, Lin Lin, Yandong Tang
2018 J jnl
Sci. China Inf. Sci.
Guiping Shen, Zhi Han, Xiai Chen, Yandong Tang
2018 J jnl
IEEE Trans. Multim.
Jiandong Tian, Zhi Han, Weihong Ren, Xiai Chen, Yandong Tang
2017 J jnl
CoRR
Xiai Chen, Zhi Han, Yao Wang, Qian Zhao, Deyu Meng, Lin Lin, Yandong Tang
2017 J jnl
Remote. Sens.
Yao Wang, Xiai Chen, Zhi Han, Shiying He
2017 A* conf
ICCV
Qiong Luo, Zhi Han, Xiai Chen, Yao Wang, Deyu Meng, Dong Liang, Yandong Tang
2016 J jnl
Sci. China Inf. Sci.
Xiai Chen, Zhi Han, Yao Wang, Yandong Tang, Haibin Yu
2016 A* conf
CVPR
Xiai Chen, Zhi Han, Yao Wang, Qian Zhao, Deyu Meng, Yandong Tang
2015 J jnl
Eur. J. Oper. Res.
Ling Wang, Hong Xu, Hua Yuan, Wenjie Zhao, Xiai Chen
2012 conf
ICICA (1)
Xiai Chen, Shuang Ke, Ling Wang, Hong Xu, Wenquan Chen
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.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 MachOExport


class MachOExportExtractor(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_exports"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports 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 exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {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

            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 exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

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

            return (data, column_names, column_type_names)

        return None

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