Xiaofei Sun

44 papers A* 2A 1Journal 34Unranked 7
YearRankTypeTitle / Venue / Authors
2026 A* conf
CHI
Xiaofei Sun, Alejandra Gómez Ortega, Asreen Rostami, Airi Lampinen
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Huan Xiao, Long Ling, Huaiyong Shao, Xiaofei Sun, Long Wan, Yingzhi Zhou, Jiamei Long, Wenjun Wang
2025 J jnl
Comput. Stat. Data Anal.
Kangning Wang, Jingyu Zhang, Xiaofei Sun
2025 J jnl
CoRR
Xiaoya Li, Xiaofei Sun, Albert Wang, Chris Shum, Jiwei Li
2025 J jnl
CoRR
Xiaoya Li, Xiaofei Sun, Albert Wang, Jiwei Li, Chris Shum
2025 J jnl
CoRR
Songqiao Su, Xiaofei Sun, Xiaoya Li, Albert Wang, Jiwei Li, Chris Shum
2025 A* conf
EMNLP
Jusheng Zhang, Yijia Fan, Kaitong Cai, Zimeng Huang, Xiaofei Sun, Jian Wang, Chengpei Tang, Keze Wang
2025 J jnl
CoRR
Jusheng Zhang, Yijia Fan, Kaitong Cai, Zimeng Huang, Xiaofei Sun, Jian Wang, Chengpei Tang, Keze Wang
2025 J jnl
CoRR
Jusheng Zhang, Kaitong Cai, Xiaoyang Guo, Sidi Liu, Qinhan Lv, Ruiqi Chen, Jing Yang, Yijia Fan, Xiaofei Sun, Jian Wang, Ziliang Chen, Liang Lin, Keze Wang
2025 conf
EMNLP (Findings)
Jusheng Zhang, Yijia Fan, Kaitong Cai, Xiaofei Sun, Keze Wang
2025 J jnl
CoRR
Jusheng Zhang, Yijia Fan, Kaitong Cai, Xiaofei Sun, Keze Wang
2025 J jnl
CoRR
Jesen Zhang, Ningyuan Liu, Kaitong Cai, Sidi Liu, Jing Yang, Ziliang Chen, Xiaofei Sun, Keze Wang
2024 J jnl
Appl. Soft Comput.
Kangning Wang, Junning Yang, Kemal Polat, Adi Alhudhaif, Xiaofei Sun
2024 J jnl
Expert Syst. Appl.
Xiaofei Sun, Jingyu Zhang, Zhongmo Liu, Kemal Polat, Yujie Gai, Wenliang Gao
2024 J jnl
Pattern Recognit.
Shaomin Li, Xiaofei Sun, Kangning Wang
2024 J jnl
CoRR
Xiangxiang Chu, Limeng Qiao, Xinyu Zhang, Shuang Xu, Fei Wei, Yang Yang, Xiaofei Sun, Yiming Hu, Xinyang Lin, Bo Zhang, Chunhua Shen
2024 J jnl
Stat. Comput.
Kangning Wang, Jin Liu, Xiaofei Sun
2024 J jnl
J. Intell. Fuzzy Syst.
Hanhan Shen, Fu Zhang, Xiaodong Pan, Xiaofei Sun
2024 J jnl
Knowl. Based Syst.
Kang Meng, Yujie Gai, Xiaodi Wang, Mei Yao, Xiaofei Sun
2024 J jnl
Comput. Electr. Eng.
Xiaofei Sun, Wenwen Pan, Jian Qin, Yizheng Lang, Yunsheng Qian
2023 conf
CEP
Cristina Adriana Alexandru, Andrius Girdzius, Chris Sun, Hamdani Azmi, Xisen Wang, Xiaofei Sun
2023 J jnl
CoRR
Xiaofei Sun, He Li, Wei-Ning Lee
2023 J jnl
Comput. Stat. Data Anal.
Xiaofei Sun, Hongwei Wang, Chao Cai, Mei Yao, Kangning Wang
2023 J jnl
Appl. Intell.
Wenwen Pan, Xiaofei Sun, Yunsheng Qian
2023 conf
AAIA
Zeng Li, Zhenzhen Wang, Xiaofei Sun
2023 J jnl
Expert Syst. Appl.
Kangning Wang, Jiaojiao Jia, Kemal Polat, Xiaofei Sun, Adi Alhudhaif, Fayadh Alenezi
2022 J jnl
Axioms
Shouguang Yao, Xinyu Huang, Linglong Zhang, Huiyi Mao, Xiaofei Sun
2022 J jnl
Expert Syst. Appl.
Kangning Wang, Benle Zhang, Xiaofei Sun, Shaomin Li
2022 J jnl
IET Comput. Vis.
Zhuo Qi, Wenyi Chen, Xiaofei Sun, Wangqian Sun, Hui Yang
2022 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xiaofei Sun, Linguo Yuan, Meng Liu, Shuneng Liang, Dongfeng Li, Liyang Liu
2021 J jnl
J. Intell. Fuzzy Syst.
Xiaofei Sun, Jianming Li, Jialiang Ma, Huiqing Xu, Bin Chen, Yuefei Zhang, Tao Feng
2021 J jnl
Complex.
Yaling Chen, Yin Peng Liu, Xiaofei Sun
2020 J jnl
IEEE Access
Yuefei Zhang, Bin Chen, JinFei Wang, Jianming Li, Xiaofei Sun
2020 conf
ICADL
Xiaofei Sun, Ting Zhang, Lei Chen, Xiaoyang Wang, Jiakeng Tang
2019 J jnl
Comput. Stat. Data Anal.
Kangning Wang, Shaomin Li, Xiaofei Sun, Lu Lin
2019 conf
ECIR (1)
Yingtao Tian, Haochen Chen, Bryan Perozzi, Muhao Chen, Xiaofei Sun, Steven Skiena
2018 A conf
CIKM
Haochen Chen, Xiaofei Sun, Yingtao Tian, Bryan Perozzi, Muhao Chen, Steven Skiena
2018 J jnl
CoRR
Haochen Chen, Xiaofei Sun, Yingtao Tian, Bryan Perozzi, Muhao Chen, Steven Skiena
2017 J jnl
ACM Trans. Intell. Syst. Technol.
Yang Li, Jing Jiang, Ting Liu, Minghui Qiu, Xiaofei Sun
2016 J jnl
CoRR
Xiaofei Sun, Jiang Guo, Xiao Ding, Ting Liu
2015 conf
SMP
Yang Li, Jing Jiang, Ting Liu, Xiaofei Sun
2014 conf
SMP
Xiaofei Sun, Xiao Ding, Ting Liu
2011 J jnl
Appl. Soft Comput.
Jinquan Wan, Mingzhi Huang, Yongwen Ma, Wenjie Guo, Yan Wang, Huiping Zhang, Weijiang Li, Xiaofei Sun
2009 J jnl
Expert Syst. Appl.
Mingzhi Huang, Jinquan Wan, Yongwen Ma, Wang Yan, Weijiang Li, Xiaofei Sun
redb/extractors/elf_extractors/elf_segments.py
← Index redb/extractors/elf_extractors/elf_segments.py python
import inspect
import hashlib
import math
from collections import Counter
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSegment


class ELFSegmentExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_segments = []
        self.elastic_index = self.index_prefix + "-elf_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 ELF file must have segments (program headers).
        """
        # Always return False - empty segments should be treated as an error
        return False

    def _calculate_entropy(self, data: bytes) -> float:
        """Calculate Shannon entropy of data."""
        if not data:
            return 0.0

        try:
            # Count frequency of each byte
            byte_counts = Counter(data)
            data_len = len(data)

            # Calculate entropy
            entropy = 0.0
            for count in byte_counts.values():
                if count > 0:
                    frequency = count / data_len
                    entropy -= frequency * math.log2(frequency)

            return entropy
        except Exception as e:
            self.log.error(f"Error calculating entropy: {e}")
            return 0.0

    def _map_segment_type(self, p_type_str: str) -> int:
        """Map segment type string to enum value."""
        type_map = {
            'PT_NULL': 0,
            'PT_LOAD': 1,
            'PT_DYNAMIC': 2,
            'PT_INTERP': 3,
            'PT_NOTE': 4,
            'PT_SHLIB': 5,
            'PT_PHDR': 6,
            'PT_TLS': 7
        }
        return type_map.get(p_type_str, 0)

    def _decode_segment_flags(self, flags: int) -> List[str]:
        """Decode segment flags to human-readable strings."""
        flag_strings = []

        if flags & 0x1:  # PF_X
            flag_strings.append('EXECUTE')
        if flags & 0x2:  # PF_W
            flag_strings.append('WRITE')
        if flags & 0x4:  # PF_R
            flag_strings.append('READ')

        return flag_strings if flag_strings else ['NONE']

    def _extract_segment_data(self, segment) -> ELFSegment:
        """Extract data from a single segment with granular error handling."""
        # Initialize with safe defaults
        segment_type = 0
        segment_type_str = 'unknown'
        segment_flags = 0
        segment_flags_str = ['NONE']
        segment_offset = 0
        segment_vaddr = 0
        segment_paddr = 0
        segment_filesz = 0
        segment_memsz = 0
        segment_align = 0
        segment_entropy = 0.0
        segment_sha256 = ""
        segment_md5 = ""

        # Try to get segment header
        header = None
        try:
            header = segment.header
        except Exception as e:
            self.log.warning(f"Could not access segment header: {e}")
            return ELFSegment(
                segment_type=segment_type, segment_type_str=segment_type_str,
                segment_flags=segment_flags, segment_flags_str=segment_flags_str,
                segment_offset=segment_offset, segment_vaddr=segment_vaddr,
                segment_paddr=segment_paddr, segment_filesz=segment_filesz,
                segment_memsz=segment_memsz, segment_align=segment_align,
                segment_entropy=segment_entropy, segment_sha256=segment_sha256,
                segment_md5=segment_md5
            )

        # Extract segment type
        try:
            p_type_str = header.get('p_type', 'PT_NULL')
            segment_type = self._map_segment_type(p_type_str)
            segment_type_str = p_type_str.replace('PT_', '') if p_type_str.startswith('PT_') else p_type_str
        except Exception as e:
            self.log.warning(f"Could not extract segment type: {e}")

        # Extract segment flags
        try:
            segment_flags = header.get('p_flags', 0)
            segment_flags_str = self._decode_segment_flags(segment_flags)
        except Exception as e:
            self.log.warning(f"Could not extract segment flags: {e}")

        # Extract segment addresses and sizes
        try:
            segment_offset = header.get('p_offset', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment offset: {e}")

        try:
            segment_vaddr = header.get('p_vaddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment vaddr: {e}")

        try:
            segment_paddr = header.get('p_paddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment paddr: {e}")

        try:
            segment_filesz = header.get('p_filesz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment filesz: {e}")

        try:
            segment_memsz = header.get('p_memsz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment memsz: {e}")

        try:
            segment_align = header.get('p_align', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment align: {e}")

        # Calculate entropy and hashes for segment data (most likely to fail)
        try:
            if segment_filesz > 0:
                segment_data = segment.data()
                if segment_data:
                    # Calculate entropy
                    segment_entropy = self._calculate_entropy(segment_data)

                    # Calculate hashes
                    segment_sha256 = hashlib.sha256(segment_data).hexdigest()
                    segment_md5 = hashlib.md5(segment_data).hexdigest()
        except Exception as e:
            self.log.warning(f"Could not read segment data for hashing: {e}")
            # Keep defaults (0.0, "", "")

        return ELFSegment(
            segment_type=segment_type,
            segment_type_str=segment_type_str,
            segment_flags=segment_flags,
            segment_flags_str=segment_flags_str,
            segment_offset=segment_offset,
            segment_vaddr=segment_vaddr,
            segment_paddr=segment_paddr,
            segment_filesz=segment_filesz,
            segment_memsz=segment_memsz,
            segment_align=segment_align,
            segment_entropy=segment_entropy,
            segment_sha256=segment_sha256,
            segment_md5=segment_md5
        )

    def tag(self):
        return Tag.ELF_SEGMENTS.value if hasattr(Tag, 'ELF_SEGMENTS') else "elf_segments"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_segments(elf):
                segments_data = []

                # Iterate through all segments with per-segment error handling
                for segment_index, segment in enumerate(elf.iter_segments()):
                    try:
                        segment_data = self._extract_segment_data(segment)
                        if segment_data:
                            segments_data.append(segment_data)
                        else:
                            self.log.warning(f"Failed to extract data for segment {segment_index}")
                    except Exception as e:
                        self.log.warning(f"Error processing segment {segment_index}: {e}")
                        # Continue processing other segments

                return segments_data

            # Check if file is valid ELF
            if not self._is_elf_file():
                self.log.error(f"No valid ELF file for {self.hash.sha256}")
                return None

            segments_data = self._with_elf_file(extract_segments)
            if segments_data is None:
                return None

            self.elf_segments = segments_data
            return self.elf_segments

        except Exception as e:
            self.log.error(f"Error extracting ELF segments {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_segments
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_segments:
                    return None

                # Prepare data arrays for all segments
                data = []
                current_time = datetime.now(timezone.utc)
                for segment in self.elf_segments:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        segment.segment_type,
                        segment.segment_type_str,
                        segment.segment_flags,
                        segment.segment_flags_str,
                        segment.segment_offset,
                        segment.segment_vaddr,
                        segment.segment_paddr,
                        segment.segment_filesz,
                        segment.segment_memsz,
                        segment.segment_align,
                        segment.segment_entropy,
                        segment.segment_sha256,
                        segment.segment_md5,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'segment_type', 'segment_type_str', 'segment_flags', 'segment_flags_str',
                    'segment_offset', 'segment_vaddr', 'segment_paddr',
                    'segment_filesz', 'segment_memsz', 'segment_align',
                    'segment_entropy', 'segment_sha256', 'segment_md5',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('NULL'=0, 'LOAD'=1, 'DYNAMIC'=2, 'INTERP'=3, 'NOTE'=4, 'SHLIB'=5, 'PHDR'=6, 'TLS'=7)",
                    'LowCardinality(String)',
                    'UInt32',
                    'Array(LowCardinality(String))',
                    'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64',
                    'Float64',
                    'FixedString(64)', 'FixedString(32)',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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