Hangfeng He

53 papers A* 11B 2Journal 29Unranked 11
YearRankTypeTitle / Venue / Authors
2026 conf
EACL (Findings)
Yiyang Wang, Chen Ding, Hangfeng He
2026 J jnl
CoRR
Neeley Pate, Adiba Mahbub Proma, Hangfeng He, James Druckman, Daniel Molden, Gourab Ghoshal, Ehsan Hoque
2025 J jnl
CoRR
Adiba Mahbub Proma, Neeley Pate, James Druckman, Gourab Ghoshal, Hangfeng He, Mohammed E. Hoque
2025 A* conf
EMNLP
Huanxin Sheng, Xinyi Liu, Hangfeng He, Jieyu Zhao, Jian Kang
2025 J jnl
CoRR
Huanxin Sheng, Xinyi Liu, Hangfeng He, Jieyu Zhao, Jian Kang
2025 conf
NAACL (Findings)
Jiarui Wu, Zhuo Liu, Hangfeng He
2025 J jnl
CoRR
Jiarui Wu, Zhuo Liu, Hangfeng He
2025 A* conf
EMNLP
Zhuo Liu, Ding Yu, Hangfeng He
2025 conf
ACL (Findings)
Ding Yu, Zhuo Liu, Hangfeng He
2025 conf
EMNLP (Findings)
Xinyi Liu, Weiguang Wang, Hangfeng He
2025 J jnl
CoRR
Xinyi Liu, Weiguang Wang, Hangfeng He
2025 A* conf
EMNLP
Boyi Zhang, Zhuo Liu, Hangfeng He
2025 J jnl
CoRR
Boyi Zhang, Zhuo Liu, Hangfeng He
2024 J jnl
CoRR
Hangfeng He, Weijie J. Su
2024 conf
ACL (Short Papers)
Xinyi Liu, Pinxin Liu, Hangfeng He
2024 J jnl
CoRR
Xinyi Liu, Pinxin Liu, Hangfeng He
2024 J jnl
CoRR
Hang Hua, Yunlong Tang, Ziyun Zeng, Liangliang Cao, Zhengyuan Yang, Hangfeng He, Chenliang Xu, Jiebo Luo
2024 J jnl
CoRR
Zhuo Liu, Ding Yu, Hangfeng He
2024 J jnl
Trans. Mach. Learn. Res.
Matteo Sordello, Niccolò Dalmasso, Hangfeng He, Weijie J. Su
2024 J jnl
CoRR
Ding Yu, Zhuo Liu, Hangfeng He
2024 conf
NAACL-HLT (Findings)
Hangfeng He, Hongming Zhang, Dan Roth
2024 conf
NAACL (Short Papers)
Sindhu Kishore, Hangfeng He
2024 J jnl
CoRR
Sindhu Kishore, Hangfeng He
2023 A* conf
ICML
Kaifu Wang, Hangfeng He, Tin D. Nguyen, Piyush Kumar, Dan Roth
2023 J jnl
CoRR
Kaifu Wang, Hangfeng He, Tin D. Nguyen, Piyush Kumar, Dan Roth
2023 J jnl
CoRR
Hangfeng He, Hongming Zhang, Dan Roth
2023 J jnl
CoRR
Hangfeng He, Hongming Zhang, Dan Roth
2022 J jnl
CoRR
Hangfeng He, Weijie J. Su
2022 A* conf
ICLR
Shuxiao Chen, Koby Crammer, Hangfeng He, Dan Roth, Weijie J. Su
2021 conf
EMNLP (1)
Hangfeng He, Mingyuan Zhang, Qiang Ning, Dan Roth
2021 J jnl
CoRR
Cong Fang, Hangfeng He, Qi Long, Weijie J. Su
2021 A* conf
ICML
Zhun Deng, Hangfeng He, Weijie J. Su
2021 J jnl
CoRR
Shuxiao Chen, Koby Crammer, Hangfeng He, Dan Roth, Weijie J. Su
2020 J jnl
CoRR
Hangfeng He, Mingyuan Zhang, Qiang Ning, Dan Roth
2020 A* conf
NeurIPS
Shuxiao Chen, Hangfeng He, Weijie J. Su
2020 J jnl
CoRR
Shuxiao Chen, Hangfeng He, Weijie J. Su
2020 B conf
COLING
Ayal Klein, Jonathan Mamou, Valentina Pyatkin, Daniela Stepanov, Hangfeng He, Dan Roth, Luke Zettlemoyer, Ido Dagan
2020 A* conf
ACL
Hangfeng He, Qiang Ning, Dan Roth
2020 A* conf
ICLR
Hangfeng He, Weijie J. Su
2020 J jnl
CoRR
Zhun Deng, Hangfeng He, Weijie J. Su
2020 A* conf
ICML
Zhun Deng, Hangfeng He, Jiaoyang Huang, Weijie J. Su
2020 J jnl
CoRR
Zhun Deng, Hangfeng He, Jiaoyang Huang, Weijie J. Su
2020 B conf
LREC
Soham Dan, Hangfeng He, Dan Roth
2020 J jnl
CoRR
Soham Dan, Hangfeng He, Dan Roth
2019 J jnl
CoRR
Hangfeng He, Qiang Ning, Dan Roth
2019 conf
NAACL-HLT (1)
Qiang Ning, Hangfeng He, Chuchu Fan, Dan Roth
2019 J jnl
CoRR
Qiang Ning, Hangfeng He, Chuchu Fan, Dan Roth
2019 J jnl
CoRR
Hangfeng He, Weijie J. Su
2018 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Jingjing Xu, Hangfeng He, Xu Sun, Xuancheng Ren, Sujian Li
2017 A* conf
AAAI
Hangfeng He, Xu Sun
2017 conf
EACL (2)
Federico Fancellu, Adam Lopez, Bonnie L. Webber, Hangfeng He
2017 conf
EACL (2)
Hangfeng He, Xu Sun
2016 J jnl
CoRR
Hangfeng He, Xu 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"