Wei Xie

44 papers A* 1A 2B 6Misc 2Journal 25Unranked 8
YearRankTypeTitle / Venue / Authors
2026 B ed.
NSS
Jiageng Chen, Debiao He, Wei Xie
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Hao Sun, Renyi Chen, Zihao Yin, Huaxiong Yao, Yaxiong Chen, Wei Xie, Guirong Feng, Xiaoqiang Lu
2025 J jnl
Neurocomputing
Guiyuhan Deng, Hao Sun, Wei Xie
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Hao Sun, Hanlizi Chen, Wenjing Chen, Chengji Wang, Wei Xie, Xiaoqiang Lu
2024 J jnl
Concurr. Comput. Pract. Exp.
Jinglei Guo, Chen Gao, Shouyong Jiang, Wei Xie, Zhijian Wu
2024 J jnl
IEEE Signal Process. Lett.
Kaiyang You, Wenjing Chen, Chengji Wang, Hao Sun, Wei Xie
2024 Misc conf
ICASSP
Mingyao Zhou, Wenjing Chen, Hao Sun, Wei Xie
2024 conf
PRCV (12)
Weizhi Nie, Chengji Wang, Hao Sun, Wei Xie
2024 J jnl
IEEE Geosci. Remote. Sens. Lett.
Hao Xu, Wenjing Chen, Cheng Tan, Hailong Ning, Hao Sun, Wei Xie
2024 J jnl
IEEE Geosci. Remote. Sens. Lett.
Renyi Chen, Huaxiong Yao, Wenjing Chen, Hao Sun, Wei Xie, Le Dong, Xiaoqiang Lu
2024 J jnl
Knowl. Based Syst.
Mingyao Zhou, Wenjing Chen, Hao Sun, Wei Xie, Ming Dong, Xiaoqiang Lu
2024 conf
BIBM
Shiqi Hua, Dunbo Ning, Wei Xie, Hao Sun
2024 A conf
ICME
Zhao Wu, Dunbo Ning, Wenjing Chen, Hao Sun, Wei Xie, Ming Dong
2024 Misc conf
ICASSP
Dunbo Ning, Wenjing Chen, Wei Xie, Hao Sun
2024 A* conf
AAAI
Hao Sun, Mingyao Zhou, Wenjing Chen, Wei Xie
2024 J jnl
CoRR
Hao Sun, Mingyao Zhou, Wenjing Chen, Wei Xie
2024 J jnl
CAAI Trans. Intell. Technol.
Wei Xie, Lianghao Jin, Shiqi Hua, Hao Sun, Bo Sun, Zhigang Tu, Jun Liu
2023 B conf
ICPADS
Shuchang Zeng, Chingfang Hsu, Jianqun Cui, Wei Xie, Qihang Hou
2023 J jnl
Vis. Comput.
Jiaxu Zhang, Wei Xie, Chao Wang, Ruide Tu, Zhigang Tu
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Huaxiong Yao, Renyi Chen, Wenjing Chen, Hao Sun, Wei Xie, Xiaoqiang Lu
2023 A conf
ICME
Hao Sun, Chenchen Pi, Wei Xie
2022 conf
BIBM
Hao Sun, Lianghao Jin, Wei Xie
2022 B conf
IJCNN
Wanxin Li, Wei Xie, Zhigang Tu, Wei Wang, Lianghao Jin
2022 B conf
IJCNN
Wei Wang, Wei Xie, Zhigang Tu, Wanxin Li, Lianghao Jin
2022 J jnl
CoRR
Zhigang Tu, Hongyan Li, Wei Xie, Yuanzhong Liu, Shifu Zhang, Baoxin Li, Junsong Yuan
2022 J jnl
Artif. Intell. Rev.
Zhigang Tu, Hongyan Li, Wei Xie, Yuanzhong Liu, Shifu Zhang, Baoxin Li, Junsong Yuan
2022 J jnl
IEEE Trans. Image Process.
Xiangtao Zheng, Hao Sun, Xiaoqiang Lu, Wei Xie
2022 J jnl
Pattern Recognit.
Yunpeng Chang, Zhigang Tu, Wei Xie, Bin Luo, Shifu Zhang, Haigang Sui, Junsong Yuan
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Jiaxu Zhang, Yifan Jia, Wei Xie, Zhigang Tu
2021 B conf
IJCNN
Lequan Chen, Wei Xie, Zhigang Tu, Jinglei Guo, Yaping Tao, Xinming Wang
2021 J jnl
CoRR
Lequan Chen, Wei Xie, Zhigang Tu, Yaping Tao, Xinming Wang
2020 conf
ECCV (15)
Yunpeng Chang, Zhigang Tu, Wei Xie, Junsong Yuan
2020 conf
IEEE BigData
Huaxiong Yao, Jiabei Hu, Wenqi Xie, Yang Huang, Wei Xie
2020 J jnl
Soft Comput.
Jinglei Guo, Yong Wu, Wei Xie, Shouyong Jiang
2019 J jnl
Signal Process. Image Commun.
Zhigang Tu, Wei Xie, Dejun Zhang, Ronald Poppe, Remco C. Veltkamp, Baoxin Li, Junsong Yuan
2019 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Zhigang Tu, Wei Xie, Justin Dauwels, Baoxin Li, Junsong Yuan
2018 J jnl
Pattern Recognit.
Zhigang Tu, Wei Xie, Qianqing Qin, Ronald Poppe, Remco C. Veltkamp, Baoxin Li, Junsong Yuan
2017 J jnl
Pattern Recognit.
Zhigang Tu, Zuwei Guo, Wei Xie, Mengjia Yan, Remco C. Veltkamp, Baoxin Li, Junsong Yuan
2017 conf
ISCID (2)
Wei Xie, Xueling Long, Zhigang Tu, Jin Yu, Ke Xu
2017 J jnl
Pattern Recognit.
Zhigang Tu, Wei Xie, Jun Cao, Coert Van Gemeren, Ronald Poppe, Remco C. Veltkamp
2015 J jnl
Int. J. Distributed Sens. Networks
Xiaoguang Niu, Ying Zhu, Qingqing Cao, Xining Zhang, Wei Xie, Kun Zheng
2015 B conf
CEC
Jinglei Guo, Zhijian Li, Wei Xie, Hui Wang
2014 conf
CWSN
Xiaoguang Niu, Ying Zhu, Qingqing Cao, Lei Zhao, Wei Xie
2012 conf
ICDIP
Wei Xie, Jie Gao, Liyu Lin, Zhigang Tu
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"