Na Gao

47 papers B 3C 2Journal 24Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
Ecol. Informatics
Huiwen Zhang, Xiaoxia Yang, Ruiqi Zhang, Na Gao, Ning Wang, Zixi Zhang, Cuicui Zhang
2025 conf
FSDM
Ruohan Li, Yuling Liu, Na Gao, Meng Ju
2025 J jnl
CoRR
Na Gao, Chenfei Ye, Yanwu Yang, Anqi Li, Zhengbo He, Li Liang, Zhiyuan Liu, Xingyu Hao, Ting Ma, Tengfei Guo
2025 C conf
INDIN
Na Gao, Xiaoxia Yang, Huiwen Zhang, Ning Wang, Cuicui Zhang
2024 J jnl
Remote. Sens.
Xiaowei Zhu, Zhiyong Kong, Jian Cao, Ruina Gao, Na Gao
2024 J jnl
Scalable Comput. Pract. Exp.
Na Gao, Qiuling Lu
2024 J jnl
Expert Syst. Appl.
Huyi Zhang, Lijie Feng, Jinfeng Wang, Na Gao
2024 J jnl
Symmetry
Na Gao, Yue Qiao, Yuan Wang, Jun Wang, Fuming Guo, Yujun Yang
2024 J jnl
Scalable Comput. Pract. Exp.
Xinhuan Zhao, Fang Zhang, Na Gao
2023 J jnl
CoRR
Gongning Luo, Kuanquan Wang, Jun Liu, Shuo Li, Xinjie Liang, Xiangyu Li, Shaowei Gan, Wei Wang, Suyu Dong, Wenyi Wang, Pengxin Yu, Enyou Liu, Hongrong Wei, Na Wang, Jia Guo, Huiqi Li, Zhao Zhang, Ziwei Zhao, Na Gao, Nan An, Ashkan Pakzad, Bojidar Rangelov, Jiaqi Dou, Song Tian, Zeyu Liu, Yi Wang, Ampatishan Sivalingam, Kumaradevan Punithakumar, Zhaowen Qiu, Xin Gao
2023 J jnl
Int. J. Online Biomed. Eng.
Xing Wei, Na Gao, Mengru Xu, Mostafa Rezaeitaleshmahalleh, Nan Mu, Zonghan Lyu, Michael Ngala, Jingfeng Jiang, Xuelian Chang
2023 J jnl
Comput. Biol. Medicine
Jiajia Li, Faming Xu, Na Gao, Yuanqiang Zhu, Yuewen Hao, Chen Qiao
2022 J jnl
IEEE Trans. Broadcast.
Yin Xu, Hao Ju, Dazhi He, Na Gao, Yiyan Wu, Yihang Huang, Wenjun Zhang
2022 conf
ICBBS
Yufei Jia, Na Gao, Xiujun Yao, Jiaqi Nie, Tian Chen
2022 J jnl
Ind. Manag. Data Syst.
Yang Liu, Wei Fang, Taiwen Feng, Na Gao
2022 J jnl
IEEE Trans. Broadcast.
Hanjiang Hong, Yin Xu, Yiyan Wu, Yihang Huang, Na Gao, Dazhi He, Haoyang Li, Yu Zhang, Wenjun Zhang
2021 J jnl
IEEE Trans. Broadcast.
Hanjiang Hong, Yin Xu, Yiyan Wu, Dazhi He, Na Gao, Wenjun Zhang
2021 conf
BMSB
Bin Xu, Yin Xu, Dazhi He, Hao Ju, Na Gao, Wenjun Zhang
2021 conf
BMSB
Bin Xu, Yin Xu, Dazhi He, Hao Ju, Na Gao, Wenjun Zhang
2021 J jnl
IEEE Commun. Lett.
Na Gao, Yin Xu, Yihang Huang, Hanjiang Hong, Dazhi He, Changwen Chen, Wenjun Zhang
2021 J jnl
IEEE Trans. Veh. Technol.
Na Gao, Yin Xu, Yihang Huang, Dazhi He, Hanjiang Hong, Changwen Chen, Wenjun Zhang
2020 J jnl
IEEE Access
Feng Yang, Shenwen Wang, Jiaxing Zhang, Na Gao, Jun-Feng Qu
2020 conf
ICCAI
Yanwu Yang, Xutao Guo, Na Gao, Chenfei Ye, Heather T. Ma
2020 conf
ICIC (2)
Na Gao, Chen Qiao, Shun Qi, Kai Ren, Jian Chen, Hanfeng Fang
2020 J jnl
IEEE Trans. Broadcast.
Yin Xu, Na Gao, Hanjiang Hong, Yang Cai, Xiaohan Duan, Dazhi He, Yiyan Wu, Wenjun Zhang
2020 J jnl
IEEE Trans. Broadcast.
Na Gao, Yin Xu, Dazhi He, Sung-Ik Park, Hanjiang Hong, Hao Ju, Changwen Chen, Wenjun Zhang
2020 conf
BMSB
Kang Xu, Na Gao, Yin Xu, Dazhi He, Yang Cai, Boyuan Xu, Wenjun Zhang
2020 conf
IEEM
Na Gao, Yuting Li, Yuxi Mai, Haoxuan Xu
2020 conf
HP3C
Le Zhang, Na Gao, Jiayang Li
2019 conf
IEEM
Na Gao, Seung Ki Moon
2019 conf
BMSB
Hanjiang Hong, Yin Xu, Dazhi He, Na Gao, Yiyan Wu, Wenjun Zhang
2019 conf
BMSB
Hao Ju, Yin Xu, Genning Zhang, Dazhi He, Na Gao, Wenjun Zhang
2019 conf
VTC Fall
Chao Zhang, Yin Xu, Na Gao, Dazhi He, Hao Ju, Genning Zhang, Yizhe Zhang, Yu Zhang, Wei Xie
2018 conf
EMBC
Yan Wang, Yanwu Yang, Xin Guo, Chenfei Ye, Na Gao, Yuan Fang, Heather T. Ma
2018 conf
BMSB
Na Gao, Yin Xu, Dazhi He, Genning Zhang, Wenjun Zhang
2018 conf
EMBC
Xin Guo, Yanwu Yang, Yan Wang, Na Gao, Heather T. Ma
2017 J jnl
Int. J. Syst. Sci.
Na Gao, Xiaoguang Han, Zengqiang Chen, Qing Zhang
2017 conf
EMBC
Shuai Mao, Changle Zhang, Na Gao, Yan Wang, Yanwu Yang, Xin Guo, Ting Ma
2017 C conf
IGARSS
Xiwei Fan, Gaozhong Nie, Na Gao, Yan Deng, Jiwen An, Huayue Li
2017 conf
EMBC
Changle Zhang, Tao Chai, Na Gao, Heather T. Ma
2016 J jnl
计算机科学
Na Gao, Ming Yang
2015 J jnl
Neurocomputing
Bao Liu, Yongsheng Ding, Na Gao, Xin Zhang
2011 B conf
GLOBECOM
Xin Wang, Zhaoquan Li, Na Gao
2011 J jnl
IEEE Trans. Wirel. Commun.
Na Gao, Xin Wang
2010 B conf
GLOBECOM
Na Gao, Xin Wang
2010 J jnl
IEEE Trans. Inf. Theory
Xin Wang, Na Gao
2009 B conf
GLOBECOM
Na Gao, Xin Wang
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"