Han Ren

110 papers A 1B 2C 2Misc 1Journal 68Unranked 36
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Gui-Bin Bian, Xiang-Rong Tang, Ruichen Ma, Qiang Ye, Zhen Li, Ming-Yang Zhang, Han Ren, Yu-Peng Zhai
2025 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Kai Wu, Ming Tang, Han Ren
2025 J jnl
Neurocomputing
Han Ren, Xiaona Chang, Xia Li
2025 conf
NAACL (Long Papers)
Hai Wang, Yuzhi Liang, Han Ren
2025 J jnl
Discuss. Math. Graph Theory
Mingyuan Ma, Han Ren
2025 J jnl
Discret. Math.
Mingyuan Ma, Han Ren
2025 J jnl
Graphs Comb.
Mingyuan Ma, Han Ren
2025 J jnl
Discuss. Math. Graph Theory
Fayun Cao, Han Ren
2025 conf
ACL (Findings)
Han Ren, Minna Peng
2024 A conf
IROS
Gui-Bin Bian, Ming-Yang Zhang, Qiang Ye, Han Ren, Yu-Peng Zhai, Ruichen Ma, Zhen Li
2024 conf
NLPCC (5)
Han Ren, Minna Peng, Jing Wan
2024 J jnl
PeerJ Comput. Sci.
Han Ren, Yajie Zhao, Yong Zhang, Wei Sun
2024 J jnl
Discuss. Math. Graph Theory
Dengju Ma, Mingyuan Ma, Han Ren
2024 J jnl
PeerJ Comput. Sci.
Wei Sun, Chang Guo, Jing Wan, Han Ren
2023 J jnl
CoRR
Xiao Sun, Bo Zhang, Chenrui Zhang, Han Ren, Mingchen Cai
2023 conf
ICCMS
Han Ren, Haihua Xie, Rujiang Guo, Huijie Liu
2023 J jnl
Int. J. Bifurc. Chaos
Hao Zhang, Wei Liu, Xiaojin Wan, Han Ren, Yuan Zhang
2023 J jnl
IEEE Access
Haihua Xie, Han Ren, Yangyang Zhang, Rujiang Guo, Huijie Liu
2023 conf
EMNLP (Findings)
Han Ren, Hai Wang, Yajie Zhao, Yafeng Ren
2023 J jnl
Graphs Comb.
Shude Long, Han Ren
2022 J jnl
J. Sensors
Han Ren, Huijie Liu, Rujiang Guo
2022 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Zhiming Mei, Zengshan Yin, Xinwei Kong, Long Wang, Han Ren
2022 J jnl
Int. J. Bifurc. Chaos
Hao Zhang, Han Ren, Donggang Cui
2022 J jnl
Graphs Comb.
Shude Long, Han Ren
2022 J jnl
Graphs Comb.
Ting Li, Han Ren
2022 J jnl
Appl. Math. Comput.
Ting Li, Han Ren
2021 J jnl
Graphs Comb.
Shude Long, Han Ren
2021 conf
ICICT (2)
Jing Wan, Han Ren
2021 J jnl
IEEE Access
Bowen Zheng, Han Ren, Sensong An, Hong Tang, Hang Li, Mohammad Haerinia, Yunxi Dong, Clayton Fowler, Hualiang Zhang
2020 J jnl
Ars Math. Contemp.
Shude Long, Han Ren
2020 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Han Ren, Mi Zhou, Yixin Gu, Bayaner Arigong
2020 conf
NLPCC (2)
Wenhe Feng, Xi Huang, Han Ren
2020 J jnl
Discuss. Math. Graph Theory
Weihua Lu, Han Ren, Chao Yang
2020 J jnl
IEEE Trans. Circuits Syst.
Han Ren, Peizhao Li, Yixin Gu, Bayaner Arigong
2019 J jnl
Ind. Robot
Hao Wang, Guohua Gao, QiXiao Xia, Han Ren, LianShi Li, Yuhang Zheng
2019 J jnl
Graphs Comb.
Weihua Lu, Han Ren
2019 J jnl
Appl. Math. Comput.
Fayun Cao, Han Ren, Hanlin Chen
2019 J jnl
Discuss. Math. Graph Theory
Han Ren, Chao Yang
2019 J jnl
Adv. Robotics
Guohua Gao, Hao Wang, Jinwei Fan, QiXiao Xia, LianShi Li, Han Ren
2019 J jnl
Ars Math. Contemp.
Dengju Ma, Han Ren
2018 conf
CLSW
Wenhe Feng, Haifang Guo, Dengxia Cao, Han Ren
2018 J jnl
Graphs Comb.
Chao Yang, Han Ren, Erling Wei
2018 conf
CLSW
Han Ren, Jing Wan, Yafeng Ren, Wenhe Feng
2018 J jnl
Graphs Comb.
Fayun Cao, Yujiao Luo, Han Ren
2018 J jnl
Neurocomputing
Yafeng Ren, Donghong Ji, Han Ren
2018 J jnl
Ars Comb.
Erling Wei, Jiangtao Liu, Han Ren
2018 conf
BIBM
Yafeng Ren, Hao Fei, Han Ren
2018 J jnl
Ind. Robot
Guohua Gao, Han Ren, QiXiao Xia, Hao Wang, LianShi Li
2018 J jnl
J. Graph Theory
Shude Long, Han Ren
2017 J jnl
Discret. Math.
Han Ren, Chao Yang, Tian-xiao Zhao
2017 conf
CLSW
Wenhe Feng, Han Ren, Xia Li, Haifang Guo
2017 conf
NLPCC
Maofu Liu, Yan Yu, Qiaosong Qi, Huijun Hu, Han Ren
2017 J jnl
Graphs Comb.
Weihua Lu, Han Ren, Fugang Chao, Ni Cao
2017 conf
CCL
Han Ren, Yafeng Ren, Xia Li, Wenhe Feng, Maofu Liu
2017 conf
CLSW
Han Ren, Xia Li, Wenhe Feng, Jing Wan
2017 conf
NTCIR
Han Ren, Yafeng Ren, Jing Wan
2017 J jnl
Ars Comb.
Dengju Ma, Han Ren
2017 conf
NTCIR
Maofu Liu, Yifan Guo, Yan Yu, Han Ren
2016 J jnl
Inf. Process. Lett.
Chao Yang, Bing Yao, Han Ren
2016 J jnl
Ars Comb.
Chao Yang, Han Ren, Bing Yao
2016 J jnl
Graphs Comb.
Fugang Chao, Han Ren, Ni Cao
2016 J jnl
Appl. Math. Comput.
Han Ren, Fugang Chao
2016 conf
NLPCC/ICCPOL
Maofu Liu, Qiaosong Qi, Huijun Hu, Han Ren
2016 conf
NLPCC/ICCPOL
Wenhe Feng, Yi Yang, Yancui Li, Xia Li, Han Ren
2016 J jnl
Ars Comb.
Ni Cao, Han Ren
2016 conf
NTCIR
Maofu Liu, Limin Wang, Xiaoyi Xiao, Lei Cai, Han Ren
2016 conf
NTCIR
Maofu Liu, Yifan Guo, Yang Wu, Limin Wang, Han Ren
2015 J jnl
Appl. Math. Comput.
Fugang Chao, Han Ren, Ni Cao
2015 J jnl
Ars Comb.
Dengju Ma, Han Ren, Damei Lv
2015 conf
ICIC (3)
Lei Han, Dong-Hong Ji, Han Ren
2015 J jnl
Ind. Robot
Guohua Gao, Yue Liu, Hao Wang, Mingyang Song, Han Ren
2014 conf
RWS
Mi Zhou, Jin Shao, Bayaner Arigong, Han Ren, Rongguo Zhou, Hualiang Zhang
2014 conf
CLSW
Yu Chen, Han Ren, Jing Wan, Donghong Ji, Guozheng Xiao
2014 J jnl
Electron. J. Comb.
Shude Long, Han Ren
2014 conf
MWSCAS
Jin Shao, David Poe, Han Ren, Bayaner Arigong, Mi Zhou, Jun Ding, Rongguo Zhou, Hyoung Soo Kim, Hualiang Zhang
2014 conf
MWSCAS
Mi Zhou, Han Ren, Jin Shao, Bayaner Arigong, Jun Ding, Hualiang Zhang
2014 conf
NTCIR
Han Ren, Hongmiao Wu, Xiwen Tan, Pengyuan Wang, Donghong Ji, Jing Wan
2013 conf
RWS
Han Ren, Jin Shao, Rongguo Zhou, Bayaner Arigong, Hyoung Soo Kim, Changzhi Li, Hualiang Zhang
2013 J jnl
Ars Comb.
Guanghua Dong, Han Ren, Ning Wang, Yuanqiu Huang
2013 J jnl
Ars Comb.
Zhaoxiang Li, Han Ren, Bingfeng Si
2013 conf
NTCIR
Han Ren, Hongmiao Wu, Chen Lv, Donghong Ji, Jing Wan
2012 J jnl
Graphs Comb.
Ni Cao, Han Ren
2012 J jnl
Comb. Probab. Comput.
Guantao Chen, Han Ren, Songling Shan
2012 J jnl
CoRR
Guanghua Dong, Ning Wang, Yuanqiu Huang, Han Ren, Yanpei Liu
2011 conf
AIRS
Han Ren, Dong-Hong Ji, Chong Teng, Jing Wan
2011 J jnl
Graphs Comb.
Han Ren, Yanbo Gao
2011 conf
NTCIR
Han Ren, Chen Lv, Donghong Ji
2010 J jnl
Graphs Comb.
Zhicheng Gao, Han Ren
2010 Misc conf
ICNC
Lei Han, Dong-Hong Ji, Han Ren
2010 conf
NTCIR
Han Ren, Donghong Ji, Jing Wan
2009 C conf
PACLIC
Han Ren, Dong-Hong Ji, Jing Wan, Chong Teng
2009 conf
IALP
Jing Wan, Han Ren
2009 conf
CoNLL Shared Task
Han Ren, Donghong Ji, Jing Wan, Mingyao Zhang
2009 conf
TAC
Han Ren, Donghong Ji, Jing Wan
2008 B conf
LREC
Han Ren, Dong-Hong Ji, Lei Han
2008 B conf
CoNLL
Han Ren, Donghong Ji, Jing Wan, Lei Han
2008 conf
NTCIR
Chong Teng, Yanxiang He, Donghong Ji, Han Ren, Lingpeng Yang, Wei Xiong
2008 conf
NTCIR
Han Ren, Donghong Ji, Yanxiang He, Chong Teng, Jing Wan
2008 J jnl
J. Syst. Sci. Complex.
Dengju Ma, Han Ren
2007 J jnl
Discret. Math.
Han Ren, Mo Deng
2006 C conf
ADMA
Tingting He, Guozhong Qu, Siwei Li, Xinhui Tu, Yong Zhang, Han Ren
2005 J jnl
Discret. Math.
Dengju Ma, Han Ren, Junjie Lu
2004 J jnl
Eur. J. Comb.
Han Ren, Yanpei Liu, D. J. Ma, J. J. Lu
2002 J jnl
Eur. J. Comb.
Han Ren, Yanpei Liu, Zhaoxiang Li
2002 J jnl
Discret. Math.
Han Ren, Yanpei Liu
2002 J jnl
J. Comb. Theory B
Han Ren, Yanpei Liu
2001 J jnl
J. Comb. Theory B
Han Ren, Yanpei Liu
2001 J jnl
Discret. Appl. Math.
Han Ren, Yanpei Liu
2000 J jnl
Discret. Math.
Han Ren, Yanpei Liu
1999 J jnl
Discret. Math.
Han Ren
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 []