X. Chen

69 papers A 1B 4C 4Misc 2Journal 35Unranked 23
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Robotics Autom. Lett.
Harry Robertshaw, Nikola Fischer, Lennart Karstensen, Benjamin Jackson, X. Chen, S. M. Hadi Sadati, Christos Bergeles, Alejandro Granados, Thomas C. Booth
2024 conf
BCICTS
X. Chen, Ajay Mistry, A. El Sayed, C. Williams, Lorenzo Iotti, A. Atef, Kishore Padmaraju, M. Malinowski, D. Che, Rafid A. Sukkar, Rick Younce, Alexandre Horth, Yury Dziashko, H. Guan, R. Shi, D. Gill, A. Seyoum, C. Marsh, M. Schmidt, G. Burrell, J. Basak, D. Chapman, A. Mikami, Alexander V. Rylyakov, A. Leven, Nicolas A. F. Jaeger
2023 conf
DRC
Chunguang Wang, Jeffry Victor, Atanu K. Saha, X. Chen, M. Si, T. Sharma, K. Roy, Peide D. Ye, Sumeet Kumar Gupta
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Baojian Liu, Wei Wan, Guoqiang Tang, Huan Li, Zhizhou Guo, X. Chen, Yang Hong
2021 J jnl
Expert Syst. Appl.
X. Chen, Jos van Hillegersberg, Engin Topan, S. Smith, M. Roberts
2021 J jnl
CoRR
M. K. Mudunuru, E. L. D. Cromwell, H. Wang, X. Chen
2021 J jnl
CoRR
Maruti Kumar Mudunuru, K. Son, P. Jiang, X. Chen
2019 conf
ICAC
Eustaquio García Plaza, X. Chen, L. A. Ouarab
2019 J jnl
J. Comput. Phys.
Christian Soize, Roger G. Ghanem, Cosmin Safta, Xun Huan, Zachary P. Vane, Joseph C. Oefelein, Guilhem Lacaze, Habib N. Najm, Qi Tang, X. Chen
2017 J jnl
CoRR
X. Chen, Yorai Wardi, Sudhakar Yalamanchili
2016 C conf
VCIP
Qiwei Xie, X. Chen, Liming Zhang, An Jiang, Feng Cui
2016 conf
OFC
David Z. Chen, X. S. Yao, Changjiang Wei, Hongxin Chen, X. Chen, Z. Li
2016 conf
ICTC
Y. F. Tang, S. L. Kan, A. Achache, A. Bouiedya, X. Chen
2016 J jnl
Trans. Emerg. Telecommun. Technol.
Xiaojin Ding, Tiecheng Song, Yulong Zou, X. Chen
2016 B conf
WCNC
Xiaojin Ding, Tiecheng Song, Yulong Zou, X. Chen
2016 conf
ICC
Xiaojin Ding, Tiecheng Song, Yulong Zou, X. Chen
2016 conf
ICC
Steven Kisseleff, X. Chen, Ian F. Akyildiz, Wolfgang H. Gerstacker
2015 conf
Earth Observing Systems
Aisheng Wu, X. Chen, Amit Angal, Yonghong Li, Xiaoxiong Xiong
2015 J jnl
J. Circuits Syst. Comput.
L. B. Wang, C. X. Mao, Dan Wang, J. M. Lu, J. F. Zhang, X. Chen
2015 conf
IRPS
Chandrasekharan Kothandaraman, X. Chen, Dan Moy, Dallas Lea, Sami Rosenblatt, Faraz Khan, Derek Leu, Toshiaki Kirihata, D. Ioannou, Giuseppe La Rosa, Jeffrey B. Johnson, Norman Robson, Subramanian S. Iyer
2015 Misc conf
HiPC
X. Chen, H. Xiao, Yorai Wardi, Sudhakar Yalamanchili
2015 J jnl
Astron. Comput.
Hao Shan, X. Wang, X. Chen, Jianping Yuan, J. Nie, H. Zhang, N. Liu, Na Wang
2014 conf
ACSC
X. Chen, A. Y. Wang, Ewan D. Tempero
2014 conf
ESSCIRC
Shahrzad Tadjpour, Paolo Rossi, Luca Romanò, Ramesh Chokkalingam, Hamid Firouzkouhi, Feng Shi, M. Leroux, Danilo Gerna, A. Venca, John Vasa, Bala Ramachandran, Brian Brunn, Alberto Pirola, Daniele Ottini, A. Milani, Enrico Sacchi, M. Behera, X. Chen, U. Decanis, Marika Tedeschi, S. DalToso, W. Eyssa, C. Cakir, C. Prakash, Yong He, Nader Damavandi, R. Srinivasan, Dan Shum, X. Fan, C. Yu, Engin Pehlivanoglu, Hossein Zarei, Aravind Loke, Gregory Uehara, Rinaldo Castello, Y. Song
2014 J jnl
Int. J. Ad Hoc Ubiquitous Comput.
J. Li, X. Chen, H. Tian, Chong Gao
2014 conf
ICIQ
L. Sun, D. Xu, X. Chen
2013 C conf
ICICS
Z. G. Zhang, S. C. Chan, X. Chen
2013 conf
OFC/NFOEC
X. Chen, A. Li, Di Che, Qian Hu, Y. Wang, J. He, William Shieh
2013 B conf
ICIP
Qiwei Xie, Qian Long, Seiichi Mita, Zheng Liu, X. Chen
2013 J jnl
Comput. Vis. Image Underst.
X. Chen, Huiguang He, Guangyu Zou, Xiaopeng Zhang, Xianfeng Gu, Jing Hua
2012 J jnl
IEEE Trans. Aerosp. Electron. Syst.
X. Chen, Ratnasingham Tharmarasa, Michel Pelletier, Thia Kirubarajan
2012 J jnl
CoRR
B. Wang, X. Chen, L. Wang
2012 J jnl
IEICE Electron. Express
F. Xu, X. Chen, Xin-An Wang
2011 conf
ICDMA
X. Chen, J. Y. Zhu
2011 J jnl
CoRR
X. Chen, M. Chen, B. Li, Y. Zhao, Y. Wu, J. Li
2011 conf
ICAC
A. O. Oluwajobi, X. Chen
2010 J jnl
Fuzzy Optim. Decis. Mak.
X. Chen, B. Liu
2008 J jnl
Int. J. Comput. Integr. Manuf.
Yan Wang, Allan Hodgson, X. Chen, Nazeh Gindy
2008 J jnl
J. Exp. Theor. Artif. Intell.
F. Jiang, W. Gao, H. Yao, D. Zhao, X. Chen
2008 C conf
IAS
X. Chen, Zi-Qiang Zhu, David Howe
2008 J jnl
Ann. GIS
A. Charoenpanyanet, X. Chen
2007 A conf
ICDAR
X. Chen, X. Liu, Y. Jia
2007 J jnl
Int. J. Comput. Integr. Manuf.
Q. X. Chen, X. Chen, Wing Bun Lee
2007 J jnl
Environ. Model. Softw.
Isaac W. Wong, R. Bloom, Don K. McNicol, Philip Fong, R. Russell, X. Chen
2006 J jnl
Nucleic Acids Res.
Ze-Rong Li, Honghuang Lin, Lianyi Han, L. Jiang, X. Chen, Yuzong Chen
2005 J jnl
Int. J. Imaging Syst. Technol.
John L. Barron, Robert E. Mercer, X. Chen, Paul Joe
2005 conf
ITCC (1)
Catherine H. Gebotys, C. C. Tiu, X. Chen
2005 J jnl
Microelectron. Reliab.
Joy Y. Liao, G. L. Woods, X. Chen, Howard L. Marks
2004 conf
CSB
Zhengchang Su, PhuongAn Dam, X. Chen, Victor Olman, Tao Jiang, Ying Xu
2003 C conf
SEKE
S. L. Kendal, Kate Ashton, X. Chen
2003 J jnl
Softw. Pract. Exp.
Shuang-Hua Yang, X. Chen, Lili Yang
2003 J jnl
Nucleic Acids Res.
Zhi Liang Ji, X. Chen, C. J. Zheng, L. X. Yao, Lianyi Han, Wee Kiang Yeo, P. C. Chung, H. S. Puy, Y. T. Tay, A. Muhammad, Yuzong Chen
2003 J jnl
Nucleic Acids Res.
Congzhong Cai, Lianyi Han, Zhi Liang Ji, X. Chen, Yuzong Chen
2002 J jnl
Comput. Chem.
X. Chen, Zhi Liang Ji, D. G. Zhi, Yuzong Chen
2002 conf
Probabilistic Graphical Models
Y. Xiang, X. Chen
2002 B conf
COMPSAC
Shuang-Hua Yang, L. S. Tan, X. Chen
2002 J jnl
Nucleic Acids Res.
X. Chen, Zhi Liang Ji, Yuzong Chen
2001 conf
ICIP (3)
X. Chen, John L. Barron, Robert E. Mercer, Paul Joe
2001 J jnl
Future Gener. Comput. Syst.
Vicki H. Allan, X. Chen
2001 conf
CDC
Mustapha Ait Rami, X. Chen, Xun Yu Zhou
2001 conf
ICSM
Hussein Zedan, Shikun Zhou, N. Sampat, X. Chen, Antonio Cau, Hongji Yang
2000 J jnl
Appl. Math. Comput.
Michael M. Kostreva, X. Chen
1999 Misc conf
PDPTA
Sherali Zeadally, X. Chen, Weiyou Cui
1998 B conf
ICCCN
Jun Bi, Jianping Wu, X. Chen
1998 conf
TOOLS (27)
Wanghong Yuan, X. Chen, Tao Xie, Hong Mei, Fuqing Yang
1997 conf
ISER
Vincent Hayward, Pedro Gregorio, Oliver R. Astley, Stephanie Greenish, Michel Doyon, L. Lessard, John McDougall, Ian Sinclair, S. Boelen, X. Chen, J.-G. Demers, J. Poulin, I. Benguigui, N. Almey, B. Makuc, X. Zhang
1992 J jnl
Comput. Graph. Forum
X. Chen, Pascal Lienhardt
1990 J jnl
J. Softw. Maintenance Res. Pract.
S. Chen, K. G. Heisler, Wei-Tek Tsai, X. Chen, E. Leung
1982 J jnl
IEEE Trans. Computers
X. Chen, Stanley L. Hurst
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 []