Wei Ou

53 papers B 3C 1Journal 37Unranked 12
YearRankTypeTitle / Venue / Authors
2026 J jnl
Cybersecur.
Wei Ou, Chengliang Sun, Mengxue Pang, Qiuling Yue, Yanshuo Zhang, Wenbao Han
2025 J jnl
Comput. Electr. Eng.
Hao Meng, Wei Ou, Ju Huang, Haozhe Liang, Wenbao Han, Qionglu Zhang
2025 J jnl
Cybersecur.
Yang Hou, Qiuling Yue, Lujia Chai, Guozhao Liao, Wenbao Han, Wei Ou
2025 J jnl
IEEE Access
Yirui Kuang, Hui Jin, Jiayu Yang, Mengxue Pang, Jianqiang Ma, Wei Ou
2025 J jnl
Comput. Mater. Continua
Wei Ou, Shuai Liu, Mengxue Pang, Jianqiang Ma, Qiuling Yue, Wenbao Han
2024 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Hongyu Guo, Haozhe Liang, Ju Huang, Wei Ou, Wenbao Han, Qionglu Zhang, Ruizhi Zhang
2024 J jnl
Comput. Electr. Eng.
Mao Chen, Yuan Jiang, Ju Huang, Wei Ou, Wenbao Han, Qionglu Zhang
2024 J jnl
Inf. Sci.
Wei Ou, Van-Nam Huynh
2024 J jnl
Inf. Sci.
Wei Ou, Van-Nam Huynh
2024 J jnl
CoRR
Yang Hou, Qiuling Yue, Lujia Chai, Guozhao Liao, Wenbao Han, Wei Ou
2024 J jnl
CoRR
Meng Shen, Yuzhi Liu, Qinglin Zhao, Wei Wang, Wei Ou, Wenbao Han, Liehuang Zhu
2024 J jnl
IEEE Access
Kaijun Zhang, Jiayu Yang, Yangfei Shao, Lehua Hu, Wei Ou, Wenbao Han, Qionglu Zhang
2024 J jnl
Cybersecur.
Nansen Wang, Jianing Zhang, Ju Huang, Wei Ou, Wenbao Han, Qionglu Zhang
2023 J jnl
Connect. Sci.
Ning Li, Ruijie Zhang, Chengyu Zhu, Wei Ou, Wenbao Han, Qionglu Zhang
2023 J jnl
J. Netw. Comput. Appl.
Peirong Li, Wei Ou, Haozhe Liang, Wenbao Han, Qionglu Zhang, Guang Zeng
2023 J jnl
Comput. Syst. Sci. Eng.
Jin Wang, Wei Ou, Osama Alfarraj, Amr Tolba, Gwang-Jun Kim, Yongjun Ren
2023 J jnl
Int. J. Web Based Communities
Meiyan Wei, Haiying Wen, Danlei Du, Wei Ou
2022 J jnl
IEEE Access
Randall Mauricio Pérez-Wheelock, Wei Ou, Pisal Yenradee, Van-Nam Huynh
2022 conf
ML4CS (1)
Hongyu Guo, Mao Chen, Wei Ou
2022 conf
ML4CS (1)
Haichao Wu, Xiaoming Liu, Wei Ou
2022 conf
ML4CS (1)
Nansen Wang, Wenbao Han, Wei Ou
2022 J jnl
Int. J. Sens. Networks
Wei Ou, Zihan Jin, Shiying Huang, Danlei Du, Jun Ye, Wenbao Han
2022 J jnl
EURASIP J. Wirel. Commun. Netw.
Xiangqi Wu, Peng Ma, Zihan Jin, Yuxuan Wu, Wenbao Han, Wei Ou
2022 J jnl
Frontiers Neurorobotics
Wei Ou, Shitao Xiao, Chengyu Zhu, Wenbao Han, Qionglu Zhang
2022 J jnl
Comput. Networks
Wei Ou, Shiying Huang, Jingjing Zheng, Qionglu Zhang, Guang Zeng, Wenbao Han
2022 conf
ML4CS (1)
Ning Li, Nansen Wang, Wei Ou, Wenbao Han
2022 J jnl
Electron. Commer. Res. Appl.
Long Ma, Wei Ou, Chei Sian Lee
2022 J jnl
Int. J. Internet Protoc. Technol.
Linjiang Xie, Feilu Hang, Wei Guo, Yao Lv, Wei Ou, C. Chandru Vignesh
2022 conf
WAC
Wei Ou, Jiajia Wang, Guanghai Ren, Lin Bai, Bo Zhang, Wei Zhang
2021 J jnl
Int. J. Auton. Adapt. Commun. Syst.
Wei Ou, Qin Yi, Jiao Hu, Dingwan Liu, Wei Liu, Wanqin Yan
2021 J jnl
Mob. Inf. Syst.
Yongqiang Peng, Zongyao Chen, Zexuan Chen, Wei Ou, Wenbao Han, Jianqiang Ma
2021 J jnl
Wirel. Commun. Mob. Comput.
Xuan Wang, Jingjing Xu, Jiaxin Wang, Wei Ou, Jung-Yoon Kim, Wenbao Han
2021 J jnl
IEEE Trans. Netw. Sci. Eng.
Jiahao Liu, Baokang Zhao, Qin Xin, Jinshu Su, Wei Ou
2021 J jnl
Mob. Inf. Syst.
Tao Shen, Chan Gao, Yukari Nagai, Wei Ou
2021 J jnl
Int. J. High Perform. Syst. Archit.
Linjiang Xie, Feilu Hang, Wei Guo, Yao Lv, Wei Ou, F. H. A. Shibly
2021 J jnl
Int. J. High Perform. Syst. Archit.
Feilu Hang, Linjiang Xie, Wei Guo, Yao Lv, Wei Ou, A. Shanthini
2020 J jnl
Secur. Commun. Networks
Wenzhi Cheng, Wei Ou, Xiangdong Yin, Wanqin Yan, Dingwan Liu, Chunyan Liu
2020 J jnl
Comput. Sci. Inf. Syst.
Wei Ou, Jianhuan Zeng, Zijun Guo, Wanqin Yan, Dingwan Liu, Stelios Fuentes
2019 C conf
CollaborateCom
Wei Ou, Mingwei Deng, Entao Luo
2019 B conf
NSS
Wei Ou, Entao Luo, Zhiyuan Tan, Lihong Xiang, Qin Yi, Chen Tian
2019 conf
BigCom
Wei Ou, Ning Fang, Hequn Xian, Wei Guo, Feilu Hang, Linjiang Xie, Xuyue Tang
2019 conf
IUKM
Xiaoyu Tang, Wei Ou, Van-Nam Huynh
2019 conf
iThings/GreenCom/CPSCom/SmartData
Wei Ou, Mingwei Deng, Entao Luo, Wei Shi, Zhiyuan Tan, Md. Zakirul Alam Bhuiyan
2018 J jnl
J. Adv. Comput. Intell. Intell. Informatics
Wei Ou, Van-Nam Huynh
2018 J jnl
Electron. Commer. Res. Appl.
Wei Ou, Van-Nam Huynh, Songsak Sriboonchitta
2016 conf
IUKM
Wei Ou, Anh-Cuong Le, Van-Nam Huynh
2016 B conf
MDAI
Wei Ou, Van-Nam Huynh
2015 B conf
SMC
Wei Ou, Zanfu Xie, Zhihan Lv
2014 conf
MLSDA@PRICAI
Wei Ou
2009 J jnl
Expert Syst. Appl.
Zhi-Ping Fan, Bo Feng, Yong-Hong Sun, Wei Ou
2009 J jnl
Expert Syst. Appl.
Zhi-Ping Fan, Bo Feng, Yong-Hong Sun, Wei Ou
2009 conf
FCST
Wei Ou, Xiaofeng Wang, Wenbao Han, Yongjun Wang
2008 conf
ICYCS
Wei Ou, Fengxing Zou, Xiaohong Xu, Gao Zheng
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"