Xiao Cui

56 papers A* 3C 2Journal 38Unranked 13
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Xiao Cui, Yulei Qin, Xinyue Li, Wengang Zhou, Hongsheng Li, Houqiang Li
2025 J jnl
CoRR
Marc D. Berliner, Minsu Kim, Xiao Cui, Vivek N. Lam, Patrick A. Asinger, Martin Z. Bazant, William C. Chueh, Richard D. Braatz
2025 J jnl
Comput. Electron. Agric.
Wensheng Du, Xiao Cui, Yanjun Zhu, Ping Liu
2025 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Xiao Cui, Zhihua Wang, Ping Li, Qiang Xu
2025 J jnl
CoRR
Yulei Qin, Gang Li, Zongyi Li, Zihan Xu, Yuchen Shi, Zhekai Lin, Xiao Cui, Ke Li, Xing Sun
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Xiao Cui, Qi Sun, Min Wang, Li Li, Wengang Zhou, Houqiang Li
2025 A* conf
AAAI
Xiao Cui, Mo Zhu, Yulei Qin, Liang Xie, Wengang Zhou, Houqiang Li
2025 A* conf
CVPR
Xiao Cui, Yulei Qin, Wengang Zhou, Hongsheng Li, Houqiang Li
2025 J jnl
CoRR
Xiao Cui, Yulei Qin, Wengang Zhou, Hongsheng Li, Houqiang Li
2025 J jnl
CoRR
Xiao Cui, Yulei Qin, Xinyue Li, Wengang Zhou, Hongsheng Li, Houqiang Li
2025 J jnl
CoRR
Siyuan Yan, Mo Zhu, Guo-qing Jiang, Jianfei Wang, Jiaxing Chen, Wentai Zhang, Xiang Liao, Xiao Cui, Chen Zhang, Zhuoran Song, Ran Zhu
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xiao Cui, Yulei Qin, Yuting Gao, Enwei Zhang, Zihan Xu, Tong Wu, Ke Li, Xing Sun, Wengang Zhou, Houqiang Li
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Xiao Cui, Weicai Ye, Yifan Wang, Guofeng Zhang, Wengang Zhou, Tong He, Houqiang Li
2024 J jnl
Eng. Appl. Artif. Intell.
Mingyuan Zhang, Xiao Cui, LiuWei Zhao, Xinlei He, Yu Shi, Jianhong Yang, YuXin Leng
2024 J jnl
CoRR
Qi Sun, Xiao Cui, Wengang Zhou, Houqiang Li
2024 conf
Tiny Papers @ ICLR
Xiao Cui, Qi Sun, Wengang Zhou, Houqiang Li
2024 conf
Tiny Papers @ ICLR
Xiao Cui, Wengang Zhou, Houqiang Li
2024 J jnl
CoRR
Xiao Cui, Mo Zhu, Yulei Qin, Liang Xie, Wengang Zhou, Houqiang Li
2024 conf
CVM (2)
Xiao Cui, Nan Li, Chi Zhang, Qian Zhang, Wei Feng, Liang Wan
2024 conf
LREC/COLING
Xiao Cui, Yulei Qin, Yuting Gao, Enwei Zhang, Zihan Xu, Tong Wu, Ke Li, Xing Sun, Wengang Zhou, Houqiang Li
2024 J jnl
CoRR
Xiao Cui, Yulei Qin, Yuting Gao, Enwei Zhang, Zihan Xu, Tong Wu, Ke Li, Xing Sun, Wengang Zhou, Houqiang Li
2024 J jnl
CoRR
Xiao Cui, Weicai Ye, Yifan Wang, Guofeng Zhang, Wengang Zhou, Houqiang Li
2024 J jnl
CoRR
Jinwook Rhyu, Joachim Schaeffer, Michael L. Li, Xiao Cui, William C. Chueh, Martin Z. Bazant, Richard D. Braatz
2023 J jnl
IEEE J. Biomed. Health Informatics
Guoyu Tong, Xi Wang, Huiyan Jiang, Anhua Wu, Wen Cheng, Xiao Cui, Long Bao, Ruikai Cai, Wei Cai
2023 conf
ICAI (2)
Yusheng Sun, Weibo Zhong, Yuhua Li, Xiao Cui, Zhe Zhao, Weihai Chen
2023 J jnl
Comput. Ind. Eng.
Xiao Cui, Zhengwen He, Nengmin Wang, Weibo Zheng
2023 conf
MSN
Xiao Cui, Xiaohui Han, Guangqi Liu, Wenbo Zuo, Zhiwen Wang
2023 J jnl
ACM SIGMIS Database
Kuang-Yuan Huang, Yoanna Long, Xiao Cui
2022 conf
ICNCC
Zhe Zhao, Zhifeng Zhang, Xiao Cui, Tong Sun
2022 C conf
CGI
Zhifeng Zhang, Jinhui Kuang, Xiao Cui, Xiaohui Ji, Junxia Ma, Jinghan Cai, Zhe Zhao
2021 J jnl
IEEE Access
Zhifeng Zhang, Xiao Cui, Xiaohui Ji
2021 J jnl
Int. J. Intell. Syst. Technol. Appl.
Jie Cao, Zhifeng Zhang, Bo Wang, Xiao Cui, Jinchao Xu
2021 J jnl
IEEE Access
Xiao Cui, Zhifeng Zhang, Jie Cao, Qian Zheng
2021 conf
ICAIIS
Denglu Li, Li Hui, Xiao Cui, Shuai Liu
2021 J jnl
Int. J. Grid High Perform. Comput.
Zhifeng Zhang, Junxia Ma, Xiao Cui
2021 J jnl
CoRR
Xiao Cui, Wengang Zhou, Yang Hu, Weilun Wang, Houqiang Li
2021 conf
ICNCC
Jinghan Cai, Yu-Sheng Sun, Xiao Cui
2021 J jnl
Int. J. Comput. Intell. Syst.
Jiayong Zhang, Zibo Ai, Liwen Guo, Xiao Cui
2020 conf
ICNCC
Zhifeng Zhang, Xiaohui Ji, Xiao Cui, Junxia Ma
2020 J jnl
Clust. Comput.
Bo Wang, Changhai Wang, Ying Song, Jie Cao, Xiao Cui, Ling Zhang
2020 C conf
IV
Fan Zhu, Xin Xu, Lin Ma, Dingfeng Guo, Xiao Cui, Qi Kong
2020 J jnl
Int. J. Perform. Eng.
Zhifeng Zhang, Xiao Cui, Pu Li, Jintao Jiang, Xiaohui Ji
2019 conf
ITQM
Zhenni Jin, Yijing Wang, Xiao Cui, Kun Guo
2019 J jnl
Future Gener. Comput. Syst.
Bo Wang, Ying Song, Jie Cao, Xiao Cui, Ling Zhang
2018 J jnl
IEEE Access
Xiao Cui, Gongmin Yan, Qiangwen Fu, Qi Zhou, Zhenbo Liu
2018 J jnl
CoRR
Fan Zhu, Lin Ma, Xin Xu, Dingfeng Guo, Xiao Cui, Qi Kong
2017 J jnl
IEEE Geosci. Remote. Sens. Lett.
Lei Qiao, Gang Chen, Xiao Cui, Wanlin Gong
2017 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gang Chen, Han Jin, Jing-Ye Yan, Xiao Cui, Shao-Dong Zhang, Chunxiao Yan, Guotao Yang, Ai-Lan Lan, Wanlin Gong, Lei Qiao, Chen Wu, Jin Wang
2017 conf
ICSAI
Bo Wang, Ying Song, Xiao Cui, Jie Cao
2017 conf
ICSAI
Bo Wang, Ying Song, Xiao Cui, Jie Cao
2016 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xiao Cui, Wanlin Gong, Xiaoqing Ye, Lingyun Pan, Yanping Chen
2016 J jnl
Sensors
Xiao Cui, Gang Chen, Jin Wang, Huan Song, Wanlin Gong
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gang Chen, Xiao Cui, Fei-Long Chen, Zhengyu Zhao, Yong Wang, Qi Yao, Chi Wang, Da-ren Lu, Shao-Dong Zhang, Xiao-xi Zhang, Xiao-Ming Zhou, Liang Huang, Wanlin Gong
2015 J jnl
IEEE Geosci. Remote. Sens. Lett.
Hengqing Sun, Guobin Yang, Xiao Cui, Peng Zhu, Chunhua Jiang
2014 J jnl
IEICE Electron. Express
Hengqing Sun, Guobin Yang, Yuannong Zhang, Peng Zhu, Xiao Cui, Chunhua Jiang, Fan Wang
2013 J jnl
Nucleic Acids Res.
Lars Geffers, Benjamin Tetzlaff, Xiao Cui, Jun Yan, Gregor Eichele
redb/extractors/macho_extractors/macho_universal.py
← Index redb/extractors/macho_extractors/macho_universal.py python
import hashlib
import inspect
import json
from datetime import datetime, timezone
from typing import Any, List

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


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

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

    def _extract_universal_info(self):
        """Extract Universal/FAT binary architecture information using new API."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Parse at Universal level first (new API requirement)
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # Check if this is a FAT binary
            is_fat = len(architectures) > 1

            architecture_info = []

            # Extract info for each architecture
            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    # Get header info for this architecture
                    header_info = self.macho.get_macho_header(arch=arch_name)

                    # Get architecture-specific MachO instance for detailed analysis
                    arch_macho = self.macho.get_macho_for_arch(arch_name)

                    # Calculate architecture slice hash (if we can access the raw data)
                    arch_sha256 = None
                    arch_md5 = None
                    arch_sha1 = None

                    # For FAT binaries, try to get slice-specific info
                    if is_fat and arch_macho:
                        try:
                            # This would require access to the slice data
                            # For now, we'll use the general file info
                            arch_sha256 = general_info.get('SHA256', '') if general_info else ''
                            arch_md5 = general_info.get('MD5', '') if general_info else ''
                            arch_sha1 = general_info.get('SHA1', '') if general_info else ''
                        except Exception as e:
                            self.log.debug(f"Could not extract slice hash for {arch_name}: {e}")

                    architecture_info.append({
                        'architecture': arch_name,
                        'arch_sha256': arch_sha256,
                        'arch_md5': arch_md5,
                        'arch_sha1': arch_sha1,
                        'cputype': header_info.get('cputype') if header_info else None,
                        'cpusubtype': header_info.get('cpusubtype') if header_info else None,
                        'filetype': header_info.get('filetype') if header_info else None
                    })

                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            # Create Universal dataclass
            macho_universal = MachOUniversal(
                is_fat=is_fat,
                architecture_count=len(architectures),
                architectures=architectures,
                architecture_info=architecture_info,
                fat_hash=self.sha256,
                fat_md5=self.md5,
                fat_sha1=self.sha1
            )

            return macho_universal

        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def _extract_fat_architecture_mappings(self):
        """Extract detailed FAT binary architecture mappings for database relationships."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return []

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return []  # Not a FAT binary

            mappings = []
            current_time = datetime.now(timezone.utc)

            # For each architecture, create a mapping record
            for arch_name in architectures:
                try:
                    # Get general info
                    general_info = self.macho.get_general_info()

                    # Create mapping record for FAT binary architecture table
                    mapping = {
                        'fat_hash': self.sha256,  # SHA256 of the FAT binary
                        'architecture': arch_name,
                        'arch_sha256': general_info.get('SHA256', '') if general_info else '',  # Will need proper slice extraction
                        'arch_md5': general_info.get('MD5', '') if general_info else '',
                        'arch_sha1': general_info.get('SHA1', '') if general_info else '',
                        'arch_filename': f"{general_info.get('Filename', '')}.{arch_name}" if general_info else '',
                        'analysis_date': current_time
                    }
                    mappings.append(mapping)

                except Exception as e:
                    self.log.warning(f"Error creating mapping for architecture {arch_name}: {e}")
                    continue

            return mappings

        except Exception as e:
            self.log.error(f"Error extracting FAT architecture mappings: {e}")
            return []

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            universal_info = self._extract_universal_info()
            return universal_info
        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def extract_fat_binary_basic_properties_data(self):
        """Extract data needed for creating multiple BasicProperties records for FAT binaries.

        Returns:
            Tuple: (is_fat, fat_sha256, architectures_info) where:
                - is_fat: bool indicating if this is a FAT binary
                - fat_sha256: SHA256 of the FAT wrapper
                - architectures_info: dict with arch names and their hashes
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return False, None, {}

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return False, None, {}  # Not a FAT binary

            # This is a FAT binary
            architectures_info = {}

            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    if general_info:
                        architectures_info[arch_name] = {
                            'sha256': general_info.get('SHA256', ''),
                            'md5': general_info.get('MD5', ''),
                            'sha1': general_info.get('SHA1', ''),
                            'filename': general_info.get('Filename', ''),
                            'filesize': general_info.get('Filesize', 0)
                        }
                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            return True, self.sha256, architectures_info

        except Exception as e:
            self.log.error(f"Error extracting FAT binary data: {e}")
            return False, None, {}

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

            data = []
            current_time = datetime.now(timezone.utc)

            # Get architecture info for the binary
            try:
                if universal_info.is_fat:
                    # For FAT binaries, architecture fields should be NULL since it contains multiple
                    architecture_raw = None
                    architecture_str = None
                else:
                    # For single-arch binaries, get the actual architecture info
                    header_info = self.macho.get_macho_header()
                    architecture_raw = header_info.get('cputype', 0) if header_info else 0
                    architecture_str = universal_info.architectures[0] if universal_info.architectures else None
            except Exception as e:
                self.log.warning(f"Could not get architecture info for binary: {e}")
                architecture_raw = None
                architecture_str = None

            # Main Universal binary record
            data.append([
                self.sha256,                              # sha256
                self.md5,                                 # md5
                self.sha1,                                # sha1
                None,                                     # parent_sha256 (always None for main FAT binary)
                architecture_raw,                         # architecture (raw CPU type)
                architecture_str,                         # architecture_str (human-readable)
                universal_info.is_fat,                    # is_fat
                universal_info.architecture_count,       # architecture_count
                universal_info.architectures,            # architectures (array)
                json.dumps(universal_info.architecture_info[0] if len(universal_info.architecture_info) == 1 else {"architectures": universal_info.architecture_info}) if universal_info.architecture_info else None,  # architecture_info (JSON)
                current_time,                             # analysis_date
            ])

            column_names = [
                'sha256', 'md5', 'sha1', 'parent_sha256', 'architecture', 'architecture_str',
                'is_fat', 'architecture_count', 'architectures', 'architecture_info',
                'analysis_date'
            ]

            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'Nullable(FixedString(64))', 'Nullable(UInt32)', 'LowCardinality(Nullable(String))',
                'UInt8', 'UInt32', 'Array(LowCardinality(String))', 'JSON',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def prepare_fat_architecture_export_data(self) -> Any:
        """Prepare export data for the FAT binary architecture mapping table."""
        mappings = self._extract_fat_architecture_mappings()
        if not mappings:
            return None

        data = []
        for mapping in mappings:
            data.append([
                mapping['fat_hash'],
                mapping['architecture'],
                mapping['arch_sha256'],
                mapping['arch_md5'],
                mapping['arch_sha1'],
                mapping['arch_filename'],
                mapping['analysis_date'],
            ])

        column_names = [
            'fat_hash', 'architecture', 'arch_sha256', 'arch_md5', 'arch_sha1',
            'arch_filename', 'analysis_date'
        ]

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

        return (data, column_names, column_type_names)

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

    # def get_fat_architecture_table(self) -> str:
    #     """Return table name for FAT binary architecture mappings."""
    #     return "redb_fat_binary_architectures"