Xiaohui Zhao

85 papers B 6C 3Misc 1Journal 64Unranked 11
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Internet Things J.
Haiyan Wang, Zan Li, Xiaohui Zhao, Zheng Chang, Fengye Hu
2025 B conf
WCNC
Shaoai Guo, Zan Li, Junjie Yan, Xiaohui Zhao
2025 J jnl
IEEE Trans. Wirel. Commun.
Haiyan Wang, Zhongzheng Qi, Zan Li, Xiaohui Zhao
2025 J jnl
IEEE Internet Things J.
Xiaoyan Li, Yitong Liu, Shaoai Guo, Zan Li, Xiaohui Zhao
2024 J jnl
IEEE Internet Things J.
Junjie Yan, Xiaohui Zhao, Zan Li
2024 B conf
WCNC
Yu Zhou, Jingjing Guo, Haohui Li, Jinjin Tian, Xiaohui Zhao, Lei Lei
2024 J jnl
IEEE Internet Things J.
Liyu Kang, Zan Li, Xiaohui Zhao, Zhongliang Zhao, Torsten Braun
2024 J jnl
IEEE Trans. Wirel. Commun.
Shaoai Guo, Xiaohui Zhao, Wei Zhang
2023 J jnl
IEEE Internet Things J.
Zan Li, Xiaohui Zhao, Zhongliang Zhao, Torsten Braun
2023 J jnl
IEEE Internet Things J.
Congming Wang, Xiaohui Zhao, Zan Li
2023 C conf
ICCC
Yu Zhou, Xiaohui Zhao, Xuemei Liu, Lei You, Lei Lei
2023 J jnl
IEEE Trans. Commun.
Shaoai Guo, Xiaohui Zhao
2023 J jnl
Telecommun. Syst.
Lingling Chen, Quanjun Zhao, Ke Fu, Xiaohui Zhao, Hongliang Sun
2023 J jnl
IEEE Internet Things J.
Mengmeng Shao, Junjie Yan, Xiaohui Zhao
2023 J jnl
IEEE Trans. Cogn. Commun. Netw.
Shuying Zhang, Zuyao Ni, Linling Kuang, Chunxiao Jiang, Xiaohui Zhao
2022 J jnl
Phys. Commun.
Lingling Chen, Ke Fu, Quanjun Zhao, Xiaohui Zhao
2022 J jnl
IEEE Trans. Veh. Technol.
Ying Liu, Junjie Yan, Xiaohui Zhao
2022 J jnl
IEEE Trans. Cogn. Commun. Netw.
Shaoai Guo, Xiaohui Zhao
2022 J jnl
IEEE Internet Things J.
Bin Zhao, Xiaohui Zhao
2022 J jnl
IEEE Internet Things J.
Yitong Liu, Junjie Yan, Xiaohui Zhao
2022 J jnl
IEEE Access
Haiyan Wang, Xiaohui Zhao, Yanping Zhao
2021 J jnl
IEEE Internet Things J.
Yuan Yue, Xiaohui Zhao, Zan Li
2021 J jnl
IEEE Trans. Cogn. Commun. Netw.
Hangqi Li, Xiaohui Zhao
2021 J jnl
IEEE Internet Things J.
Jianghong Yang, Xiaohui Zhao, Zan Li
2021 J jnl
IEEE Trans. Wirel. Commun.
Zan Li, Xiaohui Zhao, Zhongliang Zhao, Torsten Braun
2020 B conf
IWCMC
Shuying Zhang, Zuyao Ni, Chunxiao Jiang, Linling Kuang, Zhu Han, Xiaohui Zhao
2020 conf
GLOBECOM (Workshops)
Yangming Zhang, Xiaohui Zhao, Zan Li
2020 J jnl
IEEE Internet Things J.
Geng Sun, Xiaohui Zhao, Guojun Shen, Yanheng Liu, Aimin Wang, Suhanya Jayaprakasam, Ying Zhang, Victor C. M. Leung
2020 J jnl
IEEE Trans. Veh. Technol.
Hui Liang, Xiaohui Zhao, Zan Li
2020 J jnl
IET Commun.
Weiwei Yang, Xiaohui Zhao, Jiazhou He
2020 J jnl
IEEE Trans. Veh. Technol.
Xingchi Mu, Xiaohui Zhao, Hui Liang
2020 J jnl
IEEE Internet Things J.
Ya Li, Xiaohui Zhao, Hui Liang
2019 J jnl
IEEE Access
Wenting Zhang, Xiaohui Zhao, Zan Li
2019 conf
VTC Fall
Geng Sun, Xiaohui Zhao, Shuang Liang, Yanheng Liu, Ying Zhang, Victor C. M. Leung
2019 conf
VTC Fall
Geng Sun, Xiaohui Zhao, Shuang Liang, Yanheng Liu, Xu Zhou, Ying Zhang
2019 J jnl
IEEE Commun. Lett.
Xiaoyan Li, Xiaohui Zhao, Peng Zhang
2019 J jnl
IEEE Access
Jianghong Yang, Xiaohui Zhao, Zan Li
2019 J jnl
IEEE Trans. Veh. Technol.
Mingyu Li, Xiaohui Zhao, Hui Liang, Fengye Hu
2019 J jnl
IEEE Access
Shuang Liang, Zhiyi Fang, Geng Sun, Yanheng Liu, Xiaohui Zhao, Guannan Qu, Ying Zhang, Victor C. M. Leung
2019 J jnl
Comput. Commun.
Lingling Chen, Qi Li, Xiaohui Zhao, Zhiyi Fang, Furong Peng, Jiaqi Wang
2019 J jnl
IEEE Access
Yuhong Zhu, Tengfei Ma, Zhijun Li, Dayang Sun, Xiaosong Sun, Xiaohui Zhao, Fengye Hu
2019 J jnl
IEEE Trans. Veh. Technol.
Huifang Liu, Xiaohui Zhao, Hui Liang, Zan Li
2019 J jnl
Wirel. Networks
Yao Wang, Xiaohui Zhao, Hui Liang
2019 J jnl
IEEE Internet Things J.
Zan Li, Xiaohui Zhao, Fengye Hu, Zhongliang Zhao, José Luis Carrera Villacrés, Torsten Braun
2018 J jnl
IEEE Access
Zan Li, Torsten Braun, Xiaohui Zhao, Zhongliang Zhao, Fengye Hu, Hui Liang
2018 J jnl
Appl. Intell.
Xu Zhou, Xiaohui Zhao, Yanheng Liu
2018 conf
ICC
Zan Li, Xiaohui Zhao, Hui Liang
2018 B conf
GLOBECOM
Zan Li, Xiaohui Zhao, Zhongliang Zhao, Fengye Hu, Hui Liang, Torsten Braun
2018 J jnl
IEEE Access
Shuying Zhang, Xiaohui Zhao
2018 conf
ICC
Shuying Zhang, Xiaohui Zhao
2018 J jnl
IEEE Access
Shuying Zhang, Xiaohui Zhao
2018 J jnl
IEEE Trans. Veh. Technol.
Hangqi Li, Xiaohui Zhao
2018 J jnl
IEEE Access
Hangqi Li, Xiaohui Zhao
2018 J jnl
Int. J. Online Eng.
Lingling Chen, Zhiyi Fang, Xiaohui Zhao
2018 J jnl
Wirel. Networks
Zhihan Liu, Xiaohui Zhao, Hui Liang
2018 J jnl
EURASIP J. Wirel. Commun. Netw.
Yuanyi Wang, Xiaohui Zhao, Hui Liang
2017 conf
VTC Fall
Shuying Zhang, Xiaohui Zhao
2017 conf
ICSAI
Munyaradzi Munochiveyi, Xiaohui Zhao, Hui Liang
2017 C conf
WoWMoM
Hui Liang, Xiaohui Zhao, Wei Zhang
2017 J jnl
IET Commun.
Xiaoyan Li, Xiaohui Zhao, Peng Zhang, Weiwei Yang, Tianshu Wang, Huilin Jiang
2017 J jnl
EURASIP J. Wirel. Commun. Netw.
Weiwei Yang, Xiaohui Zhao
2017 J jnl
Wirel. Pers. Commun.
Ling Zhu, Xiaohui Zhao, Yongjun Xu
2017 J jnl
IEEE Access
Shi Pan, Xiaohui Zhao, Ying-Chang Liang
2017 C conf
APCC
Shi Pan, Xiaohui Zhao, Hui Liang
2017 J jnl
EURASIP J. Wirel. Commun. Netw.
Weiwei Yang, Xiaohui Zhao
2017 J jnl
IET Commun.
Weiwei Yang, Xiaohui Zhao
2016 J jnl
Int. J. Online Eng.
Lingling Chen, Xiaohui Zhao, Shubei Sun, Yueliang Lu, Xiaoyue Gong, Xingquan Gao
2016 J jnl
Wirel. Pers. Commun.
Lingling Chen, Xiaohui Zhao
2016 J jnl
IEEE Wirel. Commun. Lett.
Xu Ding, Chun-Hung Liu, Li-Chun Wang, Xiaohui Zhao
2016 B conf
WCNC
Yongjun Xu, Xiaohui Zhao, Fengye Hu
2016 conf
CrownCom
Hangqi Li, Xiaohui Zhao, Yongjun Xu
2016 Misc conf
ICNC
Hui Liang, Xiaohui Zhao
2016 J jnl
EURASIP J. Wirel. Commun. Netw.
Hangqi Li, Xiaohui Zhao, Yongjun Xu
2016 B conf
GLOBECOM
Weiwei Yang, Xiaohui Zhao
2016 J jnl
IET Signal Process.
Yongjun Xu, Xiaohui Zhao
2016 J jnl
IET Commun.
Ling Zhu, Xiaohui Zhao
2016 conf
CITS
Ling Zhu, Xiaohui Zhao, Yongjun Xu
2015 J jnl
CoRR
Xu Ding, Chun-Hung Liu, Li-Chun Wang, Xiaohui Zhao
2015 J jnl
Wirel. Commun. Mob. Comput.
Yongjun Xu, Xiaohui Zhao
2015 J jnl
IEEE Commun. Surv. Tutorials
Yongjun Xu, Xiaohui Zhao, Ying-Chang Liang
2014 J jnl
Wirel. Pers. Commun.
Yongjun Xu, Xiaohui Zhao
2014 J jnl
Wirel. Pers. Commun.
Yongjun Xu, Xiaohui Zhao
2014 J jnl
IET Commun.
Yongjun Xu, Xiaohui Zhao
2014 conf
GlobalSIP
Yongjun Xu, Xiaohui Zhao
2010 conf
WCSP
Hui Liang, Xiaohui Zhao, Chunfa Zhang
redb/extractors/macho_extractors/macho_segments.py
← Index redb/extractors/macho_extractors/macho_segments.py python
import hashlib
import inspect
import base64
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 MachOSegment


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

    def _is_empty_result(self, extracted_data) -> bool:
        """
        Override: Empty segments is an ERROR, not a valid empty case.
        A valid MachO file must have segments (at minimum __PAGEZERO, __TEXT).
        """
        # Always return False - empty segments should be treated as an error
        return False

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

    def _extract_segments_for_arch(self, arch_name):
        """Extract segment information for a specific architecture."""
        self.log.debug(f"Extracting segments for architecture: {arch_name}")
        segments = []

        try:
            # Get segments using new API with architecture parameter
            segments_data = self.macho.get_segments(arch=arch_name)
            if not segments_data:
                return segments

            # Extract segments for this architecture
            for segment in segments_data:
                try:
                    segment_name = segment.get('segname', 'Unknown')

                    # Calculate segment hash
                    segment_data = self._get_segment_data(segment)
                    if segment_data:
                        seg_sha256 = hashlib.sha256(segment_data).hexdigest()
                    else:
                        seg_sha256 = ""

                    # Use entropy already calculated by machofile module, rounded to 3 decimal places
                    seg_entropy = round(segment.get('entropy', 0.0), 3)

                    # Create segment dataclass with architecture info
                    macho_segment = MachOSegment(
                        segment_name=segment_name,
                        segment_vaddr=segment.get('vaddr', 0),
                        segment_vsize=segment.get('vsize', 0),
                        segment_offset=segment.get('offset', 0),
                        segment_size=segment.get('size', 0),
                        segment_max_vm_protection=segment.get('max_vm_protection', 0),
                        segment_initial_vm_protection=segment.get('initial_vm_protection', 0),
                        segment_nsects=segment.get('nsects', 0),
                        segment_flags=segment.get('flags', 0),
                        segment_entropy=seg_entropy,
                        segment_sha256=seg_sha256,
                    )
                    # Add architecture info to the segment
                    macho_segment.architecture = arch_name
                    segments.append(macho_segment)

                except Exception as e:
                    self.log.warning(
                        f'Unable to process segment "{segment.get("segname", "Unknown")}" for architecture {arch_name} in {self.hash.sha256}: {e}'
                    )
                    continue

            return segments

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

    def _extract_segments(self):
        """Extract segment information from all architectures in the MachO binary."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        segments = []

        if not self.macho:
            return segments

        try:
            # Get architectures using new API (already parsed in base class)
            architectures = self.macho.get_architectures()
            if not architectures:
                return segments

            # Process each architecture
            for arch_name in architectures:
                arch_segments = self._extract_segments_for_arch(arch_name)
                segments.extend(arch_segments)

            return segments

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

    def _get_segment_data(self, segment):
        """Get the raw data for a segment."""
        try:
            offset = segment.get('offset', 0)
            size = segment.get('size', 0)
            
            if size == 0:
                return None
            
            # Read segment data from file
            with open(self.filepath, 'rb') as f:
                f.seek(offset)
                return f.read(size)
                
        except Exception as e:
            self.log.warning(f"Error reading segment data: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            segments = self._extract_segments()
            return segments
        except Exception as e:
            self.log.error(f"Error extracting MachO segments: {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:
                # Extract segments for this specific architecture
                segments = self._extract_segments_for_arch(arch_name)
                if not segments:
                    continue

                # Get architecture-specific sha256 and header info
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)

                    # Get raw architecture value
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    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

                for segment in segments:
                    data.append([
                        arch_sha256,                          # sha256 (architecture-specific)
                        segment.segment_name,                 # segment_name
                        segment.segment_vaddr,                # segment_vaddr
                        segment.segment_vsize,                # segment_vsize
                        segment.segment_offset,               # segment_offset
                        segment.segment_size,                 # segment_size
                        segment.segment_max_vm_protection,    # segment_max_vm_protection
                        segment.segment_initial_vm_protection, # segment_initial_vm_protection
                        segment.segment_nsects,               # segment_nsects
                        segment.segment_flags,                # segment_flags
                        segment.segment_entropy,              # segment_entropy
                        segment.segment_sha256,               # segment_sha256
                        current_time,                         # analysis_date
                    ])

            column_names = [
                'sha256',
                'segment_name', 'segment_vaddr', 'segment_vsize', 'segment_offset',
                'segment_size', 'segment_max_vm_protection', 'segment_initial_vm_protection',
                'segment_nsects', 'segment_flags', 'segment_entropy', 'segment_sha256',
                'analysis_date'
            ]

            if not data:
                return None

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

            return (data, column_names, column_type_names)

        return None

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