Nannan Wu

76 papers A* 11A 3B 1Journal 45Unranked 16
YearRankTypeTitle / Venue / Authors
2026 J jnl
Int. J. Data Sci. Anal.
Quannan Zu, Nannan Wu, Wei Yu, Huaming Wu, Yanxia Zhao, Kehan Long, Sibo Yang, Lei Wang
2026 J jnl
Big Data Min. Anal.
Yiming Zhao, Wenjun Wang, Nannan Wu, Jilei Liu, Ying Sun, Wei Yu, Quannan Zu
2026 J jnl
Eur. J. Oper. Res.
Nannan Wu, Yejun Xu, Zaiwu Gong, D. Marc Kilgour, Liping Fang
2026 J jnl
Clust. Comput.
Jun Wang, Wenjun Wang, Nannan Wu, Xue Chen, Xueli Liu, Xiaoming Li, Wei Yu
2026 J jnl
Appl. Soft Comput.
Bowen Mao, Wenjun Wang, Wei Yu, Qiang Tian, Wenkai Wang, Jiye Liu, Han Bao, Nannan Wu
2025 A* conf
IJCAI
Nannan Wu, Hongdou Dong, Wenjun Wang, Yiming Zhao
2025 J jnl
CoRR
Xuefeng Jiang, Jia Li, Nannan Wu, Zhiyuan Wu, Xujing Li, Sheng Sun, Gang Xu, Yuwei Wang, Qi Li, Min Liu
2025 J jnl
CoRR
Nannan Wu, Zhuo Kuang, Zengqiang Yan, Ping Wang, Li Yu
2025 A conf
CIKM
Keao Xi, Nannan Wu, Yiming Zhao, Wenjun Wang
2025 J jnl
CoRR
Nannan Wu, Zengqiang Yan, Nong Sang, Li Yu, Chang Wen Chen
2025 A* conf
AAAI
Nannan Wu, Yazheng Zhao, Hongdou Dong, Keao Xi, Wei Yu, Wenjun Wang
2025 A conf
CIKM
Lei Wang, Nannan Wu, Huaming Wu, Wei Yu, Fan Zhang, Shuo Chen
2025 A* conf
ICML
Nannan Wu, Yuming Huang, Yiming Zhao, Jie Chen, Wenjun Wang
2025 J jnl
Appl. Soft Comput.
Nannan Wu, Ruyi Huang, Ming Situ, Dayong Wang
2024 conf
ADMA (3)
Yuqi Liu, Nannan Wu, Wenjun Wang
2024 A* conf
IJCAI
Ying Sun, Wenjun Wang, Nannan Wu, Chunlong Bao
2024 A* conf
AAAI
Zhehao Wang, Xian Lin, Nannan Wu, Li Yu, Kwang-Ting Cheng, Zengqiang Yan
2024 J jnl
Briefings Bioinform.
Guo Wei, Nannan Wu, Kunyang Zhao, Sihai Yang, Long Wang, Yan Liu
2024 conf
ADMA (4)
Yiming Zhao, Jie Chen, Nannan Wu, Wenjun Wang
2024 conf
DASFAA (6)
Qingcheng Lu, Nannan Wu, Yiming Zhao, Wenjun Wang, Quannan Zu
2024 J jnl
Proc. VLDB Endow.
Xueli Liu, Bowen Dong, Wenzhi Fu, Nannan Wu, Xin Wang, Wenjun Wang
2024 A* conf
AAAI
Nannan Wu, Zhaobin Sun, Zengqiang Yan, Li Yu
2024 conf
MICCAI (10)
Yangyang Xiang, Nannan Wu, Li Yu, Xin Yang, Kwang-Ting Cheng, Zengqiang Yan
2024 J jnl
CoRR
Yangyang Xiang, Nannan Wu, Li Yu, Xin Yang, Kwang-Ting Cheng, Zengqiang Yan
2024 J jnl
CoRR
Zhaobin Sun, Nannan Wu, Junjie Shi, Li Yu, Xin Yang, Kwang-Ting Cheng, Zengqiang Yan
2024 conf
MICCAI (10)
Zhaobin Sun, Nannan Wu, Junjie Shi, Li Yu, Kwang-Ting Cheng, Zengqiang Yan
2024 A* conf
IJCAI
Nannan Wu, Zhuo Kuang, Zengqiang Yan, Li Yu
2024 J jnl
CoRR
Nannan Wu, Zhuo Kuang, Zengqiang Yan, Li Yu
2024 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Nannan Wu, Yejun Xu, Huimin Wang, D. Marc Kilgour
2024 J jnl
Briefings Bioinform.
Jingxuan Qiu, Wanchun Nie, Hao Ding, Jia Dai, Yiwen Wei, Dezhi Li, Yuxi Zhang, Junting Xie, Xinxin Tian, Nannan Wu, Tianyi Qiu
2024 conf
DASFAA (6)
Zehao Guo, Nannan Wu, Yiming Zhao, Wenjun Wang
2023 J jnl
Future Gener. Comput. Syst.
Nannan Wu, Lei Xu, Liehuang Zhu
2023 J jnl
Int. J. Multim. Inf. Retr.
Xiaohan Yang, Zhen Wang, Wenhao Liu, Xinyi Chang, Nannan Wu
2023 J jnl
CoRR
Nannan Wu, Zhaobin Sun, Zengqiang Yan, Li Yu
2023 conf
MICCAI (2)
Nannan Wu, Li Yu, Xin Yang, Kwang-Ting Cheng, Zengqiang Yan
2023 A* conf
IJCAI
Nannan Wu, Li Yu, Xuefeng Jiang, Kwang-Ting Cheng, Zengqiang Yan
2023 J jnl
CoRR
Nannan Wu, Li Yu, Xuefeng Jiang, Kwang-Ting Cheng, Zengqiang Yan
2023 J jnl
Future Internet
James Msughter Adeke, Guangjie Liu, Junjie Zhao, Nannan Wu, Hafsat Muhammad Bashir
2023 J jnl
Eur. J. Oper. Res.
Nannan Wu, Yejun Xu, D. Marc Kilgour, Liping Fang
2022 J jnl
Knowl. Based Syst.
Ying Sun, Wenjun Wang, Nannan Wu, Chaochao Liu, Siddharth Bhatia, Yang Yu, Wei Yu
2022 J jnl
CoRR
Nannan Wu, Ning Zhang, Wenjun Wang, Lixin Fan, Qiang Yang
2022 J jnl
CoRR
Nannan Wu, Li Yu, Xin Yang, Kwang-Ting Cheng, Zengqiang Yan
2022 J jnl
Knowl. Based Syst.
Yang Yu, Wenjun Wang, Nannan Wu, Hongtao Liu, Minglai Shao
2022 J jnl
Neurocomputing
Yang Yu, Wenjun Wang, Minglai Shao, Nannan Wu, Ying Sun, Yueheng Sun, Qiang Tian
2022 conf
ICKG
Nannan Wu, Ning Zhang, Qingcheng Lu, Jie Zhang, Wenjun Wang, Ying Sun, Siddharth Bhatia
2022 conf
ICANN (1)
Xiaolai Huo, Chung-Ming Own, Yue Zhou, Nannan Wu, Jianwen Sun
2022 J jnl
Appl. Soft Comput.
Dayong Wang, Jing Huang, Yejun Xu, Nannan Wu
2021 J jnl
CoRR
Xinyue Zhang, Nannan Wu, Zixu Zhen, Wenjun Wang
2021 J jnl
IEEE Trans. Vis. Comput. Graph.
Nannan Wu, Qianwen Chao, Yanzhen Chen, Weiwei Xu, Chen Liu, Dinesh Manocha, Wenxin Sun, Yi Han, Xinran Yao, Xiaogang Jin
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Nannan Wu, Yejun Xu, D. Marc Kilgour, Liping Fang
2021 J jnl
Remote. Sens.
Zhen Wang, Nannan Wu, Xiaohan Yang, Bingqi Yan, Pingping Liu
2021 J jnl
CoRR
Nannan Wu, Qianwen Chao, Yanzhen Chen, Weiwei Xu, Chen Liu, Dinesh Manocha, Wenxin Sun, Yi Han, Xinran Yao, Xiaogang Jin
2021 J jnl
Fuzzy Sets Syst.
Nannan Wu, D. Marc Kilgour, Keith W. Hipel, Yejun Xu
2021 J jnl
ACM Trans. Inf. Syst.
Hongtao Liu, Wenjun Wang, Qiyao Peng, Nannan Wu, Fangzhao Wu, Pengfei Jiao
2020 A conf
CIKM
Ying Sun, Wenjun Wang, Nannan Wu, Wei Yu, Xue Chen
2020 conf
HCC
Qinghua Cao, Xiaoxing Zhang, Nannan Wu, Zhifeng Zhou, Jinming Zang
2020 conf
HCC
Qinghua Cao, Jinming Zang, Nannan Wu, Zhifeng Zhou
2020 J jnl
Appl. Soft Comput.
Nannan Wu, Yejun Xu, Xia Liu, Huimin Wang, Enrique Herrera-Viedma
2019 J jnl
IEEE Trans. Knowl. Data Eng.
Nannan Wu, Feng Chen, Jianxin Li, Jinpeng Huai, Baojian Zhou, Bo Li, Naren Ramakrishnan
2019 J jnl
Soft Comput.
Yejun Xu, Nannan Wu
2019 J jnl
IEEE Access
Nuerzhegeti Aiyitibieke, Wenjun Wang, Nannan Wu, Ying Sun, Xuewei Li, Yueheng Sun
2019 conf
ACM TUR-C
Nannan Wu, Lei Zhang, Yi Gao, Mingfei Zhang, Xia Sun, Jun Feng
2019 J jnl
Fuzzy Sets Syst.
Nannan Wu, Yejun Xu, Keith W. Hipel
2019 A* conf
AAAI
Nannan Wu, Wenjun Wang, Feng Chen, Jianxin Li, Bo Li, Jinpeng Huai
2018 J jnl
Comput. Animat. Virtual Worlds
Nannan Wu, Zhigang Deng, Yue Huang, Chen Liu, Dongliang Zhang, Xiaogang Jin
2018 J jnl
Neurocomputing
Jianxin Li, Nannan Wu, Zhirui Feng
2018 J jnl
J. Inf. Hiding Multim. Signal Process.
Ying Ma, Nannan Wu
2018 J jnl
IEEE Access
Nannan Wu, Dongliang Zhang, Zhigang Deng, Xiaogang Jin
2017 conf
ICNC-FSKD
Gang Sun, Zhongxin Wang, Jia Zhao, Hao Wang, Chuanyun Ni, Jie Bai, Nannan Wu
2017 A* conf
IJCAI
Nannan Wu, Feng Chen, Jianxin Li, Jinpeng Huai, Bo Li
2016 A* conf
AAAI
Nannan Wu, Feng Chen, Jianxin Li, Baojian Zhou, Naren Ramakrishnan
2015 conf
UIC/ATC/ScalCom
Peiyuan Sun, Shengli Liu, Nannan Wu, Bo Li, Jianxin Li
2015 conf
CIT/IUCC/DASC/PICom
Borui Yang, Jianxin Li, Lu Liu, Yingjie Cao, Hua Wei, Peiyuan Sun, Nannan Wu, Bo Li
2014 conf
UIC/ATC/ScalCom
Tao Wu, Jianxin Li, Nannan Wu, Tao Ou, Borui Yang, Bo Li
2009 J jnl
Pattern Recognit.
Jie Zhou, Fanglin Chen, Nannan Wu, Chenyu Wu
2004 B conf
ICIP
Nannan Wu, Jie Zhou
redb/extractors/elf_extractor.py
← Index redb/extractors/elf_extractor.py python
import logging
from abc import ABCMeta, abstractmethod
import inspect

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

from redb.extractors.extractor import Extractor

logger = logging.getLogger(__name__)


@abstractmethod
class ELFExtractor(Extractor, metaclass=ABCMeta):

    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
        )
        # Store ELF object if provided, otherwise we'll create it per-operation for security
        self._provided_elf = elf
        self._elf_file_valid = None  # Cache validity check

    def _with_elf_file(self, operation):
        """Safely execute an operation with an ELF file using context manager.

        Args:
            operation: A callable that takes an ELFFile object and returns a result

        Returns:
            The result of the operation, or None if an error occurred
        """
        if self._provided_elf:
            try:
                return operation(self._provided_elf)
            except ELFError as e:
                if "String Table not found" in str(e):
                    self.log.warning(f"String table missing in ELF {self.hash.sha256}: {e}")
                    return None
                else:
                    self.log.error(f"ELF format error {self.hash.sha256} Full error: {e}")
                    return None
            except Exception as e:
                self.log.error(f"Error processing ELF file {self.hash.sha256} Full error: {e}")
                return None

        try:
            with open(self.filepath, 'rb') as f:
                elf = ELFFile(f)
                if not elf:
                    raise ELFError("Empty file?")
                return operation(elf)
        except ELFError as e:
            if "String Table not found" in str(e):
                self.log.warning(f"String table missing in ELF {self.hash.sha256}: {e}")
                return None
            else:
                self.log.error(f"ELF format error {self.hash.sha256} Full error: {e}")
                return None
        except Exception as e:
            self.log.error(f"Error reading ELF file {self.hash.sha256} Full error: {e}")
            return None

    def _is_elf_file(self):
        """Check if the file is a valid ELF binary."""
        if self._elf_file_valid is not None:
            return self._elf_file_valid

        def check_elf_validity(elf):
            # pyelftools ELFFile object existing means it's valid ELF
            # Just check that we can access the header
            header = elf.header
            return header is not None

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

    def _is_64bit(self):
        """Check if the ELF binary is 64-bit."""
        def check_64bit(elf):
            return elf.header.get('e_ident', {}).get('EI_CLASS') == 'ELFCLASS64'

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

    def _is_stripped(self):
        """Check if the ELF binary is stripped (no symbol table)."""
        def check_stripped(elf):
            # Look for symbol table sections
            for section in elf.iter_sections():
                if section.name in ['.symtab', '.strtab']:
                    return False
            return True

        try:
            result = self._with_elf_file(check_stripped)
            return result if result is not None else True
        except Exception as e:
            self.log.error(f"Error checking if ELF is stripped: {e}")
            return True

    def _has_debug_info(self):
        """Check if the ELF binary contains debug information."""
        def check_debug_info(elf):
            # Look for debug sections
            debug_sections = ['.debug_info', '.debug_line', '.debug_str', '.debug_abbrev']
            for section in elf.iter_sections():
                if section.name in debug_sections:
                    return True
            return False

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

    def _get_architecture(self):
        """Get the architecture of the ELF binary."""
        def get_arch(elf):
            machine = elf.header.get('e_machine', 'EM_NONE')

            # Map common machine types to readable names
            arch_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_RISCV': 'RISC-V'
            }

            return arch_map.get(machine, machine)

        try:
            result = self._with_elf_file(get_arch)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting architecture: {e}")
            return "unknown"

    def _get_endianness(self):
        """Get the endianness of the ELF binary."""
        def get_endian(elf):
            data_encoding = elf.header.get('e_ident', {}).get('EI_DATA')
            if data_encoding == 'ELFDATA2LSB':
                return "little"
            elif data_encoding == 'ELFDATA2MSB':
                return "big"
            return "unknown"

        try:
            result = self._with_elf_file(get_endian)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting endianness: {e}")
            return "unknown"

    def _get_file_type(self):
        """Get the file type of the ELF binary."""
        def get_file_type(elf):
            etype = elf.header.get('e_type', 'ET_NONE')

            # Map file types to readable names
            type_map = {
                'ET_NONE': 'none',
                'ET_REL': 'relocatable',
                'ET_EXEC': 'executable',
                'ET_DYN': 'shared_object',
                'ET_CORE': 'core_dump'
            }

            return type_map.get(etype, etype)

        try:
            result = self._with_elf_file(get_file_type)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting file type: {e}")
            return "unknown"

    def _is_pie(self):
        """Check if the ELF binary is position-independent executable."""
        def check_pie(elf):
            # PIE binaries are typically ET_DYN type
            etype = elf.header.get('e_type', 'ET_NONE')
            if etype == 'ET_DYN':
                # Check if it has an entry point (executable) vs library
                entry_point = elf.header.get('e_entry', 0)
                return entry_point > 0
            return False

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

    def _has_stack_protection(self):
        """Check if the binary has stack protection (canaries)."""
        def check_stack_protection(elf):
            # Look for stack protection symbols
            stack_symbols = ['__stack_chk_fail', '__stack_chk_guard']

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

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

    def _has_nx_bit(self):
        """Check if the binary has NX bit (non-executable stack)."""
        def check_nx_bit(elf):
            # Look for GNU_STACK segment
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_GNU_STACK':
                    flags = segment.header.get('p_flags', 0)
                    # Check if execute flag is NOT set (NX enabled)
                    return not (flags & 0x1)  # PF_X = 0x1
            return False

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

    def _has_relro(self):
        """Check if the binary has RELRO (Relocation Read-Only)."""
        def check_relro(elf):
            # Look for GNU_RELRO segment
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_GNU_RELRO':
                    return True
            return False

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

    def _get_build_id(self):
        """Extract build ID from notes section."""
        def get_build_id(elf):
            # Look for build ID in notes sections
            for section in elf.iter_sections():
                if section.name == '.note.gnu.build-id':
                    for note in section.iter_notes():
                        if note['n_type'] == 'NT_GNU_BUILD_ID':
                            # Convert bytes to hex string
                            build_id = note['n_desc']
                            if isinstance(build_id, bytes):
                                return build_id.hex()
                            return str(build_id)
            return None

        try:
            result = self._with_elf_file(get_build_id)
            return result
        except Exception as e:
            self.log.error(f"Error getting build ID: {e}")
            return None

    def _count_sections(self):
        """Count the number of sections in the ELF file."""
        def count_sections(elf):
            return elf.header.get('e_shnum', 0)

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

    def _count_segments(self):
        """Count the number of segments (program headers) in the ELF file."""
        def count_segments(elf):
            return elf.header.get('e_phnum', 0)

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

    def _count_symbols(self):
        """Count the total number of symbols in symbol tables."""
        def count_symbols(elf):
            symbol_count = 0
            for section in elf.iter_sections():
                if hasattr(section, 'iter_symbols'):
                    symbol_count += section.num_symbols()
            return symbol_count

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

    def _get_dependencies(self):
        """Get list of dynamic dependencies."""
        def get_dependencies(elf):
            dependencies = []
            dynamic_section = elf.get_section_by_name('.dynamic')
            if dynamic_section:
                for tag in dynamic_section.iter_tags():
                    if tag.entry.d_tag == 'DT_NEEDED':
                        dependencies.append(tag.needed)
            return dependencies

        try:
            result = self._with_elf_file(get_dependencies)
            return result if result is not None else []
        except Exception as e:
            self.log.error(f"Error getting dependencies: {e}")
            return []