Hailong Wang

108 papers A* 2A 1B 7C 6Misc 3Journal 64Unranked 24
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf. Sci.
Chuanxia Jian, Ziyue Yin, Yuelei Zhang, Yinhui Ao, Heen Chen, Hailong Wang
2026 J jnl
Inf. Process. Manag.
Chen Yang, Hailong Wang, Hexuan Zhang, Xusheng Wu, Yiduo Liu, Ben Niu
2026 J jnl
CoRR
Siyuan Ma, Bo Gao, Zikai Xiao, Hailong Wang, Xinlei Yu, Rui Qian, Jiayu Qian, Luqi Gong, Yang Liu
2026 J jnl
Neurocomputing
Yichao Wu, Yirui Wang, Hailong Wang, Bingqian Zhu, Panpan Ding, Chun Liu
2026 A* conf
AAAI
Wenya Wei, Sipeng Yang, Qixian Zhou, Ruochen Liu, Xuelei Zhang, Yifu Yuan, Yan Jiang, Yongle Luo, Hailong Wang, Tianzhou Wang, Peipei Jin, Wangtong Liu, Zhou Zhao, Xiaogang Jin, Elvis S. Liu
2026 J jnl
Appl. Intell.
Chun Liu, Hailong Wang, Bingqian Zhu, Panpan Ding, Zheng Zheng, Tao Xu, Zhigang Han, Jiayao Wang
2026 J jnl
Comput. Electron. Agric.
Miao Su, Shaoyang Luo, Yaze Yun, Bing Ding, Hailong Wang, Xiangming Zhou, Yan Zhu, Xia Yao, Weixing Cao, Dong Zhou
2026 J jnl
J. Real Time Image Process.
Siyuan Qian, Dongfang Zhao, Xun Zhang, Zhentong Gao, Hailong Wang, Zhihao Guo
2026 J jnl
Cybersecur.
Zhuo Wu, Shi Qi, Xinxuan Zhang, Yi Deng, Kun Lai, Hailong Wang
2026 J jnl
Clust. Comput.
Pei Chen, Wuzheng Tan, Yijian Zhong, Hailong Wang, Linlin Fan, Jian Weng
2026 J jnl
Reliab. Eng. Syst. Saf.
Dan Wang, Kai Yin, Hailong Wang
2025 J jnl
J. Intell. Inf. Syst.
Hailong Wang, Jiaxin Cao, Jinjin Liu, Jie Song
2025 J jnl
CoRR
Chun Liu, Panpan Ding, Zheng Zheng, Hailong Wang, Bingqian Zhu, Tao Xu, Zhigang Han, Jiayao Wang
2025 B conf
SMC
Weifeng Guan, Fangqing Gu, Xingyuan Chen, Hailong Wang, Hai-lin Liu
2025 B conf
IJCNN
Hailong Wang, Jiehao Lei, Jianting Liu
2025 J jnl
CoRR
Shun Huang, Wenlu Xing, Shijia Geng, Hailong Wang, Guangkun Nie, Gongzheng Tang, Chenyang He, Shenda Hong
2025 J jnl
Comput. Mater. Continua
Junchao Shi, Hailong Wang
2025 J jnl
CoRR
Yichao Wu, Yirui Wang, Panpan Ding, Hailong Wang, Bingqian Zhu, Chun Liu
2025 J jnl
CoRR
Wenya Wei, Sipeng Yang, Qixian Zhou, Ruochen Liu, Xuelei Zhang, Yifu Yuan, Yan Jiang, Yongle Luo, Hailong Wang, Tianzhou Wang, Peipei Jin, Wangtong Liu, Zhou Zhao, Xiaogang Jin, Elvis S. Liu
2025 J jnl
Vis. Comput.
Jinchang Zhu, Dayang Sun, Yu Cheng, Hailong Wang, Yujing Chen, Yaowei Chen
2025 J jnl
CoRR
Chun Liu, Hailong Wang, Bingqian Zhu, Panpan Ding, Zheng Zheng, Tao Xu, Zhigang Han, Jiayao Wang
2025 J jnl
Swarm Evol. Comput.
Chen Yang, Weijia Liu, Qiong Chen, Hailong Wang, Ben Niu
2025 J jnl
Scientometrics
Chen Yang, Hailong Wang, Yiduo Liu, Xusheng Wu, Fei Liu, Ben Niu
2025 B conf
IJCNN
Hailong Wang, Jiehao Lei, Jianting Liu
2025 J jnl
IACR Cryptol. ePrint Arch.
Yuanju Wei, Kaixuan Wang, Binwu Xiang, Xinxuan Zhang, Yi Deng, Hailong Wang, Xudong Zhu
2025 J jnl
IACR Cryptol. ePrint Arch.
Zhuo Wu, Shi Qi, Xinxuan Zhang, Yi Deng, Kun Lai, Hailong Wang
2025 J jnl
Empir. Softw. Eng.
Zhuang Liu, Hailong Wang, Tongtong Xu, Bei Wang
2025 J jnl
CoRR
Xiaolei Li, Jialun Cao, Yepang Liu, Shing-Chi Cheung, Hailong Wang
2025 J jnl
Comput. Math. Appl.
Hailong Wang, Liang Wang, Guoqing Zhu, Chunguang Xiong
2025 conf
APWeb-WAIM (1)
Kaijia Xu, Lin Liu, Hailong Wang, Ruixin Shi, Tianyuan Niu, Anqi Ren
2025 J jnl
IEEE Multim.
Mengxin Li, Zhenghan Xing, Hailong Wang, Haoyu Jiang, Qiaowen Xie
2025 J jnl
Comput. Mater. Continua
Hailong Wang, Junchao Shi, Xinjie Li
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Cui Zhang, Zhouyang Sha, Hailong Wang
2025 J jnl
IACR Cryptol. ePrint Arch.
Li Lin, Tian Qiu, Xin Wang, Hailong Wang, Changzheng Wei, Ying Yan, Wei Wang, Wenbiao Zhao
2024 J jnl
CoRR
Zhiyuan Zhong, Sinan Wang, Hailong Wang, Shaojin Wen, Hao Guan, Yida Tao, Yepang Liu
2024 conf
GLOBECOM (Workshops)
Pengzhe Xin, Yang Cao, Yu Liu, Hailong Wang, Yue Wu, Xinjiang Xia, Dongming Wang
2024 conf
CHI Extended Abstracts
Xishuo Zhang, Lin Liu, Yi Wang, Xiao Liu, Hailong Wang, Chetan Arora, Haichao Liu, Weijia Wang, Thuong Hoang
2024 conf
FORGE
Hailong Wang, Tongtong Xu, Bei Wang
2024 C conf
ICCE
Toru Ishida, Tongxi Liu, Hailong Wang, William K. Cheung
2024 J jnl
CoRR
Toru Ishida, Tongxi Liu, Hailong Wang, William K. Cheung
2024 J jnl
RAIRO Oper. Res.
Duni Hu, Guomin Yang, Hailong Wang
2024 conf
RE Workshops
Anqi Ren, Lin Liu, Yi Wang, Xiao Liu, Hailong Wang, Kaijia Xu, Xishuo Zhang, Chetan Arora
2024 J jnl
CoRR
Anqi Ren, Lin Liu, Yi Wang, Xiao Liu, Hailong Wang, Kaijia Xu, Xishuo Zhang, Chetan Arora
2024 J jnl
Multim. Tools Appl.
Yongjun Feng, Mingxia Li, Yongji Pei, Xinlei Huang, Hailong Wang, Panpan Li
2024 J jnl
J. Intell. Fuzzy Syst.
Sicong Tang, Hailong Wang
2024 A* conf
ACM Multimedia
Richen Liu, Hansheng Wang, Hailong Wang, Siru Chen, Chufan Lai, Ayush Kumar, Siming Chen
2024 J jnl
Symmetry
Hailong Wang, Yaolu Chen, Hongshan Wang
2023 conf
ISGT Asia
Hailong Wang, Jeremy D. Watson, Neville R. Watson
2023 J jnl
Comput. Electron. Agric.
Junwei Li, Xiangyu Li, Bin Hu, Tianlong Gu, Zhaojie Wang, Hailong Wang
2023 conf
ICONIP (11)
Juntao Zhang, Jun Zhou, Hailong Wang, Yang Lei, Peng Cheng, Zehan Li, Hao Wu, Kun Yu, Wenbo An
2023 A conf
RE
Xishuo Zhang, Lin Liu, Yi Wang, Xiao Liu, Hailong Wang, Anqi Ren, Chetan Arora
2023 J jnl
CoRR
Xishuo Zhang, Lin Liu, Yi Wang, Xiao Liu, Hailong Wang, Anqi Ren, Chetan Arora
2023 conf
PRCV (3)
Juntao Zhang, Jun Zhou, Hailong Wang, Yang Lei, Peng Cheng, Zehan Li, Hao Wu, Kun Yu, Wenbo An
2022 conf
ICSPCC
Pengcheng Wan, Weike Feng, Yanzhong Hao, Hailong Wang
2022 J jnl
J. Syst. Control. Eng.
Yanhui Tong, Xudong Zhao, Mingyuan Zhai, Hailong Wang, Xiaohang Li
2022 J jnl
ISPRS Int. J. Geo Inf.
Xiaojian Chen, Hailong Wang, Yu Zhu, Hansheng Wang, Mingjun Su, Shuyu Bao, Yiping Wu
2022 conf
ICCS (1)
Mingyu Zhang, Fang Fang, Hao Li, Qingyun Liu, Yangchun Li, Hailong Wang
2022 J jnl
IACR Cryptol. ePrint Arch.
Yi Deng, Shunli Ma, Xinxuan Zhang, Hailong Wang, Xuyang Song, Xiang Xie
2022 conf
ISMAR Adjunct
Hansheng Wang, Xiaojian Chen, Zeyu Xia, Hailong Wang, Xiaohan Wang, Richen Liu
2021 J jnl
Remote. Sens.
Zhenjie Zhu, Bingjun Liu, Hailong Wang, Maochuan Hu
2021 J jnl
IEEE Access
Weiheng Kong, Lili He, Hailong Wang
2021 J jnl
Int. J. Syst. Sci.
Hailong Wang, Yanhui Tong, Dongmei Xu, Wanqing Song
2021 J jnl
Bioinform.
Richen Liu, Hailong Wang, Chuyu Zhang, Xiaojian Chen, Lijun Wang, Genlin Ji, Bin Zhao, Zhiwei Mao, Dan Yang
2021 J jnl
Sci. Program.
Rui Cong, Hailong Wang
2021 conf
ASIACRYPT (4)
Yi Deng, Shunli Ma, Xinxuan Zhang, Hailong Wang, Xuyang Song, Xiang Xie
2021 J jnl
Pattern Anal. Appl.
Luyang Zhang, Haitao Wang, Xinyao Wang, Qiang Liu, Huaibin Wang, Hailong Wang
2021 J jnl
IEEE Access
Yizhen Xu, Yuandan Dong, Sichao Wen, Hailong Wang
2020 J jnl
Phys. Commun.
Jinlong Wang, Gang Wang, Bo Li, Zihuai Lin, Hailong Wang, Guanyi Chen
2020 Misc conf
Inscrypt
Hailong Wang, Yi Deng, Xiang Xie
2020 J jnl
IEEE Access
Yi Jiang, Haitao Wang, Shuai Chen, Qing Zhang, Pan Hu, Xin Li, Kai Zheng, Hailong Wang
2020 J jnl
J. Comput. Biol.
Yongqian Shu, Xiaohong Wu, Jia Shen, Dongdong Luo, Xiang Li, Hailong Wang, Yuanhua Tom Tang
2019 J jnl
Neural Comput. Appl.
Hailong Wang, Zhongbo Hu, Yuqiu Sun, Qinghua Su, Xuewen Xia
2019 J jnl
Mob. Networks Appl.
Hailong Wang, Gang Wang, Bo Li, Gongliang Liu, Weidang Lu
2018 J jnl
Comput. Intell. Neurosci.
Hailong Wang, Zhongbo Hu, Yuqiu Sun, Qinghua Su, Xuewen Xia
2018 J jnl
Eur. J. Oper. Res.
Duni Hu, Shou Chen, Hailong Wang
2018 J jnl
计算机科学
Hailong Wang, Youliang Tian, Xin Yin
2017 conf
CSPS
Hailong Wang, Gang Wang, Bo Li
2017 C conf
FUSION
Biao Song, Jian Sun, Hailong Wang, Wendong Xiao
2017 conf
ISCID (1)
Hailong Wang, Jun Zhou, Zhouquan Du, Qing Yao
2017 C conf
FUSION
Biao Song, Hailong Wang, Wendong Xiao, Shoudong Huang, Lei Shi
2015 J jnl
Intell. Autom. Soft Comput.
Chuanqi Xie, Hailong Wang, Yongni Shao, Yong He
2015 J jnl
Sensors
Hailong Wang, Jiyu Peng, Chuanqi Xie, Yidan Bao, Yong He
2015 conf
ChinaCom
Jinlong Wang, Gang Wang, Liming Zheng, Hailong Wang
2014 J jnl
J. Intell. Fuzzy Syst.
Li Yan, Hailong Wang, Zong Min Ma
2014 conf
BMEI
Xiaoming Liu, Gang Wang, Hailong Wang, Bo Li, Gongliang Liu
2013 J jnl
Knowl. Eng. Rev.
Zong Min Ma, Fu Zhang, Hailong Wang, Li Yan
2013 Misc conf
ICCS
Jiong Xie, Fanjun Meng, Hailong Wang, Hongfang Pan, JinHong Cheng, Xiao Qin
2012 J jnl
Math. Comput. Model.
Fei Wang, Hailong Wang, Xiaofeng Wang, Jinshu Su
2012 B conf
WCNC
Peng Cheng, Lei Deng, Hui Yu, Youyun Xu, Hailong Wang
2011 conf
WCSP
Xi Chen, Haike Yi, Hanwen Luo, Hui Yu, Hailong Wang
2011 J jnl
J. Networks
Hailong Wang, Jie Hou, Zhenghu Gong
2011 conf
ICC
Zhengwei Wu, Peng Cheng, Xinbing Wang, Xiaoying Gan, Hui Yu, Hailong Wang
2010 B conf
IWCMC
Hui Yu, Ruikai Zhang, Xi Chen, Wentao Song, Hailong Wang
2010 C conf
APSEC
Hailong Wang, Juan Li, Qing Wang, Ye Yang
2010 conf
CTS
Hailong Wang, Zhenghu Gong
2010 J jnl
J. Am. Medical Informatics Assoc.
Stephen B. Johnson, Glen Whitney, Matthew J. McAuliffe, Hailong Wang, Evan S. McCreedy, Leon Rozenblit, Clark C. Evans
2009 conf
ICNC (4)
Hongze Qiu, Wanli Zhou, Hailong Wang
2009 ch.
The Semantic Web for Knowledge and Data Management
Hailong Wang
2009 C conf
DEXA
Hailong Wang, Zong Min Ma, Junfu Yin
2008 C conf
DEXA
Hailong Wang, Zong Min Ma
2008 conf
ASWC
Fu Zhang, Zong Min Ma, Hailong Wang, Xiangfu Meng
2008 Misc conf
GrC
Zhanjie Wang, Hailong Wang, Kai He, Dexin Sun, Xiaobin Chen
2008 conf
FSKD (1)
Hailong Wang, Zong Min Ma, Li Yan, Jingwei Cheng
2008 B conf
FUZZ-IEEE
Hailong Wang, Zong Min Ma, Li Yan, Jingwei Cheng
2008 B conf
FUZZ-IEEE
Zong Min Ma, Jingwei Cheng, Hailong Wang, Li Yan
2007 conf
FSKD (4)
Hailong Wang, Zong Min Ma, Li Yan, Gang Zhang
2007 conf
MIMI
Gang Zhang, Zong Min Ma, Zhiping Cai, Hailong Wang
2000 J jnl
Appl. Math. Comput.
Hailong Wang, Jianjing Jiang
redb/extractors/elf_extractors/elf_features.py
← Index redb/extractors/elf_extractors/elf_features.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

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 ELFFeatures


class ELFFeaturesExtractor(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_features = None
        self.elastic_index = self.index_prefix + "-elf_features"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _extract_header_data(self):
        """Extract ELF header data using pyelftools."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        def extract_header(elf):
            # Initialize result with safe defaults
            result = {
                'ei_class': 0, 'ei_data': 0, 'ei_version': 0, 'ei_osabi': 0, 'ei_abiversion': 0,
                'e_type': 0, 'e_machine': 0, 'e_version': 0, 'e_entry': 0, 'e_flags': 0,
                'ei_class_str': 'unknown', 'ei_data_str': 'unknown', 'ei_osabi_str': 'unknown',
                'e_type_str': 'unknown', 'e_machine_str': 'unknown'
            }

            # Try to get the main header - if this fails, we can't extract anything
            try:
                header = elf.header
            except Exception as e:
                self.log.warning(f"Could not access ELF header: {e}")
                return result

            # Try to get e_ident section
            ident = None
            try:
                ident = header.get('e_ident', {})
            except Exception as e:
                self.log.warning(f"Could not access e_ident: {e}")

            # Extract EI_CLASS (32/64 bit)
            try:
                if ident:
                    ei_class_raw = ident.get('EI_CLASS', 'ELFCLASSNONE')
                    result['ei_class'] = 2 if ei_class_raw == 'ELFCLASS64' else 1 if ei_class_raw == 'ELFCLASS32' else 0
                    result['ei_class_str'] = '64-bit' if ei_class_raw == 'ELFCLASS64' else '32-bit' if ei_class_raw == 'ELFCLASS32' else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_CLASS: {e}")

            # Extract EI_DATA (endianness)
            try:
                if ident:
                    ei_data_raw = ident.get('EI_DATA', 'ELFDATANONE')
                    result['ei_data'] = 1 if ei_data_raw == 'ELFDATA2LSB' else 2 if ei_data_raw == 'ELFDATA2MSB' else 0
                    result['ei_data_str'] = 'Little-endian' if ei_data_raw == 'ELFDATA2LSB' else 'Big-endian' if ei_data_raw == 'ELFDATA2MSB' else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_DATA: {e}")

            # Extract EI_VERSION
            try:
                if ident:
                    ei_version_raw = ident.get('EI_VERSION', 0)
                    # Convert string like 'EV_CURRENT' to integer
                    if isinstance(ei_version_raw, str):
                        version_map = {'EV_NONE': 0, 'EV_CURRENT': 1}
                        result['ei_version'] = version_map.get(ei_version_raw, 1)
                    else:
                        result['ei_version'] = ei_version_raw
            except Exception as e:
                self.log.warning(f"Could not extract EI_VERSION: {e}")

            # Extract EI_OSABI
            try:
                if ident:
                    ei_osabi_raw = ident.get('EI_OSABI', 'ELFOSABI_SYSV')
                    osabi_map = {
                        'ELFOSABI_SYSV': 0, 'ELFOSABI_HPUX': 1, 'ELFOSABI_NETBSD': 2,
                        'ELFOSABI_LINUX': 3, 'ELFOSABI_SOLARIS': 6, 'ELFOSABI_FREEBSD': 9
                    }
                    result['ei_osabi'] = osabi_map.get(ei_osabi_raw, 0)
                    result['ei_osabi_str'] = ei_osabi_raw.replace('ELFOSABI_', '') if ei_osabi_raw and ei_osabi_raw.startswith('ELFOSABI_') else str(ei_osabi_raw) if ei_osabi_raw else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_OSABI: {e}")

            # Extract EI_ABIVERSION
            try:
                if ident:
                    result['ei_abiversion'] = ident.get('EI_ABIVERSION', 0)
            except Exception as e:
                self.log.warning(f"Could not extract EI_ABIVERSION: {e}")

            # Extract e_type (file type)
            try:
                e_type_raw = header.get('e_type', 'ET_NONE')
                type_map = {
                    'ET_NONE': 0, 'ET_REL': 1, 'ET_EXEC': 2, 'ET_DYN': 3, 'ET_CORE': 4
                }
                result['e_type'] = type_map.get(e_type_raw, 0)
                result['e_type_str'] = e_type_raw.replace('ET_', '') if e_type_raw and e_type_raw.startswith('ET_') else str(e_type_raw) if e_type_raw else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract e_type: {e}")

            # Extract e_machine (architecture)
            try:
                e_machine_raw = header.get('e_machine', 0)
                # Map machine strings to integers and human-readable names
                # https://github.com/eliben/pyelftools/blob/main/elftools/elf/enums.py
                # https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf-em.h
                # https://refspecs.linuxfoundation.org/elf/elf.pdf
                machine_int_map = {
                    'EM_NONE': 0, 'EM_M32': 1, 'EM_SPARC': 2, 'EM_386': 3,
                    'EM_68K': 4, 'EM_88K': 5, 'EM_860': 7, 'EM_MIPS': 8,
                    'EM_S370': 9, 'EM_MIPS_RS3_LE': 10, 'EM_PARISC': 15,
                    'EM_VPP500': 17, 'EM_SPARC32PLUS': 18, 'EM_960': 19,
                    'EM_PPC': 20, 'EM_PPC64': 21, 'EM_S390': 22, 'EM_V800': 36,
                    'EM_FR20': 37, 'EM_RH32': 38, 'EM_RCE': 39, 'EM_ARM': 40,
                    'EM_ALPHA': 41, 'EM_SH': 42, 'EM_SPARCV9': 43, 'EM_TRICORE': 44,
                    'EM_ARC': 45, 'EM_H8_300': 46, 'EM_H8_300H': 47, 'EM_H8S': 48,
                    'EM_H8_500': 49, 'EM_IA_64': 50, 'EM_MIPS_X': 51, 'EM_COLDFIRE': 52,
                    'EM_68HC12': 53, 'EM_X86_64': 62, 'EM_AARCH64': 183, 'EM_RISCV': 243,
                }
                machine_str_map = {
                    'EM_386': 'x86', 'EM_X86_64': 'x86_64', 'EM_ARM': 'ARM', 'EM_AARCH64': 'ARM64',
                    'EM_MIPS': 'MIPS', 'EM_PPC': 'PowerPC', 'EM_PPC64': 'PowerPC64',
                    'EM_SPARC': 'SPARC', 'EM_SPARCV9': 'SPARC64', 'EM_RISCV': 'RISC-V',
                    'EM_IA_64': 'IA-64', 'EM_S390': 'S390', 'EM_SH': 'SuperH',
                }
                if isinstance(e_machine_raw, str):
                    result['e_machine'] = machine_int_map.get(e_machine_raw, 0)
                    result['e_machine_str'] = machine_str_map.get(e_machine_raw, e_machine_raw.replace('EM_', '') if e_machine_raw.startswith('EM_') else e_machine_raw)
                else:
                    result['e_machine'] = e_machine_raw
                    result['e_machine_str'] = str(e_machine_raw)
            except Exception as e:
                self.log.warning(f"Could not extract e_machine: {e}")

            # Extract e_version
            try:
                e_version_raw = header.get('e_version', 0)
                # Convert string like 'EV_CURRENT' to integer
                if isinstance(e_version_raw, str):
                    version_map = {'EV_NONE': 0, 'EV_CURRENT': 1}
                    result['e_version'] = version_map.get(e_version_raw, 1)
                else:
                    result['e_version'] = e_version_raw
            except Exception as e:
                self.log.warning(f"Could not extract e_version: {e}")

            # Extract e_entry (entry point)
            try:
                result['e_entry'] = header.get('e_entry', 0)
            except Exception as e:
                self.log.warning(f"Could not extract e_entry: {e}")

            # Extract e_flags
            try:
                result['e_flags'] = header.get('e_flags', 0)
            except Exception as e:
                self.log.warning(f"Could not extract e_flags: {e}")

            return result

        try:
            return self._with_elf_file(extract_header)
        except Exception as e:
            self.log.error(f"Error extracting header data {self.hash.sha256}: {e}")
            return None

    def _count_dynamic_symbols(self):
        """Count symbols in dynamic symbol table."""
        def count_dynsym(elf):
            dynsym_section = elf.get_section_by_name('.dynsym')
            if dynsym_section and hasattr(dynsym_section, 'num_symbols'):
                return dynsym_section.num_symbols()
            return 0

        try:
            result = self._with_elf_file(count_dynsym)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting dynamic symbols: {e}")
            return 0

    def _count_relocations(self):
        """Count total relocations across all sections."""
        def count_relocs(elf):
            reloc_count = 0
            for section in elf.iter_sections():
                if hasattr(section, 'iter_relocations'):
                    try:
                        reloc_count += section.num_relocations()
                    except:
                        # Some sections might not support num_relocations()
                        for _ in section.iter_relocations():
                            reloc_count += 1
            return reloc_count

        try:
            result = self._with_elf_file(count_relocs)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting relocations: {e}")
            return 0

    def _has_gnu_hash(self):
        """Check if GNU hash table is present."""
        def check_gnu_hash(elf):
            gnu_hash_section = elf.get_section_by_name('.gnu.hash')
            return gnu_hash_section is not None

        try:
            result = self._with_elf_file(check_gnu_hash)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking GNU hash: {e}")
            return False

    def _has_fortify(self):
        """Check if binary has fortify source protection."""
        def check_fortify(elf):
            # Look for fortified function symbols
            fortify_symbols = ['__printf_chk', '__sprintf_chk', '__snprintf_chk',
                             '__strcpy_chk', '__strcat_chk', '__memcpy_chk']

            for section in elf.iter_sections():
                if hasattr(section, 'iter_symbols'):
                    for symbol in section.iter_symbols():
                        if symbol.name in fortify_symbols:
                            return True
            return False

        try:
            result = self._with_elf_file(check_fortify)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking fortify: {e}")
            return False

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

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

            # 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

            # Extract header data (now always returns a result, even with defaults)
            header_data = self._extract_header_data()
            if not header_data:
                self.log.error(f"Complete failure to extract any header data for {self.hash.sha256}")
                return None

            # Extract binary properties
            is_64bit = 1 if self._is_64bit() else 0
            is_stripped = 1 if self._is_stripped() else 0
            is_pie = 1 if self._is_pie() else 0
            has_canary = 1 if self._has_stack_protection() else 0
            has_nx = 1 if self._has_nx_bit() else 0
            has_relro = 1 if self._has_relro() else 0
            has_fortify = 1 if self._has_fortify() else 0

            # Extract counts
            number_of_segments = self._count_segments()
            number_of_sections = self._count_sections()
            number_of_symbols = self._count_symbols()
            number_of_dynamic_symbols = self._count_dynamic_symbols()
            number_of_relocations = self._count_relocations()
            number_of_dependencies = len(self._get_dependencies())

            # Extract build information
            build_id = self._get_build_id()
            gnu_hash_present = 1 if self._has_gnu_hash() else 0
            has_debug_info = 1 if self._has_debug_info() else 0

            self.elf_features = ELFFeatures(
                # ELF Header data
                ei_class=header_data['ei_class'],
                ei_data=header_data['ei_data'],
                ei_version=header_data['ei_version'],
                ei_osabi=header_data['ei_osabi'],
                ei_abiversion=header_data['ei_abiversion'],
                e_type=header_data['e_type'],
                e_machine=header_data['e_machine'],
                e_version=header_data['e_version'],
                e_entry=header_data['e_entry'],
                e_flags=header_data['e_flags'],
                # Human readable values
                ei_class_str=header_data['ei_class_str'],
                ei_data_str=header_data['ei_data_str'],
                ei_osabi_str=header_data['ei_osabi_str'],
                e_type_str=header_data['e_type_str'],
                e_machine_str=header_data['e_machine_str'],
                # Binary properties
                is_64bit=is_64bit,
                is_stripped=is_stripped,
                is_pie=is_pie,
                has_canary=has_canary,
                has_nx=has_nx,
                has_relro=has_relro,
                has_fortify=has_fortify,
                # Counts
                number_of_segments=number_of_segments,
                number_of_sections=number_of_sections,
                number_of_symbols=number_of_symbols,
                number_of_dynamic_symbols=number_of_dynamic_symbols,
                number_of_relocations=number_of_relocations,
                number_of_dependencies=number_of_dependencies,
                # Build information
                build_id=build_id,
                gnu_hash_present=gnu_hash_present,
                has_debug_info=has_debug_info,
            )

            return self.elf_features

        except Exception as e:
            self.log.error(f"Error extracting ELF features {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_features
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_features:
                    return None

                # Prepare data array matching the schema
                data = [[
                    self.sha256,
                    self.md5,
                    self.sha1,

                    # ELF Header data
                    self.elf_features.ei_class,
                    self.elf_features.ei_data,
                    self.elf_features.ei_version,
                    self.elf_features.ei_osabi,
                    self.elf_features.ei_abiversion,
                    self.elf_features.e_type,
                    self.elf_features.e_machine,
                    self.elf_features.e_version,
                    self.elf_features.e_entry,
                    self.elf_features.e_flags,

                    # Human readable values
                    self.elf_features.ei_class_str,
                    self.elf_features.ei_data_str,
                    self.elf_features.ei_osabi_str,
                    self.elf_features.e_type_str,
                    self.elf_features.e_machine_str,

                    # Binary properties
                    self.elf_features.is_64bit,
                    self.elf_features.is_stripped,
                    self.elf_features.is_pie,
                    self.elf_features.has_canary,
                    self.elf_features.has_nx,
                    self.elf_features.has_relro,
                    self.elf_features.has_fortify,

                    # Counts
                    self.elf_features.number_of_segments,
                    self.elf_features.number_of_sections,
                    self.elf_features.number_of_symbols,
                    self.elf_features.number_of_dynamic_symbols,
                    self.elf_features.number_of_relocations,
                    self.elf_features.number_of_dependencies,

                    # Build information
                    self.elf_features.build_id,
                    self.elf_features.gnu_hash_present,
                    self.elf_features.has_debug_info,

                    # Analysis metadata
                    datetime.now(timezone.utc)
                ]]

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'ei_class', 'ei_data', 'ei_version', 'ei_osabi', 'ei_abiversion',
                    'e_type', 'e_machine', 'e_version', 'e_entry', 'e_flags',
                    'ei_class_str', 'ei_data_str', 'ei_osabi_str', 'e_type_str', 'e_machine_str',
                    'is_64bit', 'is_stripped', 'is_pie', 'has_canary', 'has_nx', 'has_relro', 'has_fortify',
                    'number_of_segments', 'number_of_sections', 'number_of_symbols',
                    'number_of_dynamic_symbols', 'number_of_relocations', 'number_of_dependencies',
                    'build_id', 'gnu_hash_present', 'has_debug_info',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('32-bit'=1, '64-bit'=2)",
                    "Enum8('Little-endian'=1, 'Big-endian'=2)",
                    'UInt8',
                    "Enum8('SYSV'=0, 'HPUX'=1, 'NETBSD'=2, 'LINUX'=3, 'SOLARIS'=6, 'FREEBSD'=9)",
                    'UInt8',
                    "Enum8('NONE'=0, 'REL'=1, 'EXEC'=2, 'DYN'=3, 'CORE'=4)",
                    'UInt16', 'UInt32', 'UInt64', 'UInt32',
                    'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)',
                    'LowCardinality(String)', 'LowCardinality(String)',
                    'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8',
                    'UInt16', 'UInt16', 'UInt32', 'UInt32', 'UInt32', 'UInt16',
                    'Nullable(String)', 'UInt8', 'UInt8',
                    '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_features"