Vijay S. Mookerjee

93 papers A* 1B 1C 8Journal 81Unranked 2
YearRankTypeTitle / Venue / Authors
2025 J jnl
Inf. Syst. Res.
Wangsheng Zhu, Shaojie Tang, Vijay S. Mookerjee
2024 J jnl
Inf. Syst. Res.
Wangsheng Zhu, Subodha Kumar, Vijay S. Mookerjee
2024 J jnl
Inf. Syst. Res.
Manmohan Aseri, Amit Mehra, Vijay S. Mookerjee, Hong Xu
2024 J jnl
Inf. Syst. Res.
Jayarajan Samuel, Zhiqiang (Eric) Zheng, Vijay S. Mookerjee
2024 J jnl
Inf. Syst. Res.
Leila Hosseini, Shaojie Tang, Vijay S. Mookerjee
2023 J jnl
MIS Q.
Mingwen Yang, Zhiqiang (Eric) Zheng, Vijay S. Mookerjee, Hongyu Chen
2023 J jnl
Digit.
Michael Max Bühler, Igor Calzada, Isabel Cane, Thorsten Jelinek, Astha Kapoor, Morshed Mannan, Sameer Mehta, Vijay S. Mookerjee, Konrad Nübel, Alex Pentland, Trebor Scholz, Divya Siddarth, Julian Tait, Bapu Vaitla, Jianguo Zhu
2022 J jnl
Manag. Sci.
Mingwen Yang, Zhiqiang (Eric) Zheng, Vijay S. Mookerjee
2021 J jnl
Inf. Syst. Res.
Sameer Mehta, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2021 J jnl
J. Manag. Inf. Syst.
Abhijeet Ghoshal, Vijay S. Mookerjee, Sumit Sarkar
2021 J jnl
Inf. Syst. Res.
Mingwen Yang, Zhiqiang (Eric) Zheng, Vijay S. Mookerjee
2020 J jnl
Inf. Syst. Res.
Leila Hosseini, Shaojie Tang, Vijay S. Mookerjee, Chelliah Sriskandarajah
2020 J jnl
Inf. Syst. Res.
Manmohan Aseri, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2020 J jnl
Inf. Syst. Res.
Jyotishka Ray, Syam Menon, Vijay S. Mookerjee
2020 J jnl
Inf. Syst. Res.
Dengpan Liu, Subodha Kumar, Vijay S. Mookerjee
2020 B conf
MobiHoc
Shaojie Tang, Jing Yuan, Vijay S. Mookerjee
2020 J jnl
Inf. Syst. Res.
Sameer Mehta, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2020 J jnl
Inf. Syst. Res.
Reza Mousavi, Monica S. Johar, Vijay S. Mookerjee
2019 J jnl
Inf. Syst. Frontiers
Tridib Bandyopadhyay, Vijay S. Mookerjee
2019 J jnl
INFORMS J. Comput.
Zhen Sun, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2019 A* conf
EC
Sameer Mehta, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2019 J jnl
Inf. Syst. Res.
Mingwen Yang, Zhiqiang (Eric) Zheng, Vijay S. Mookerjee
2018 J jnl
Data Inf. Manag.
John Zhang, Ming Fan, Bin Gu, Vijay S. Mookerjee, Bin Zhang, J. Leon Zhao
2018 J jnl
Manag. Sci.
Manmohan Aseri, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2018 J jnl
Inf. Syst. Res.
Dengpan Liu, Yong Tan, Vijay S. Mookerjee
2017 J jnl
INFORMS J. Comput.
Yuanfeng Cai, Zhengrui Jiang, Vijay S. Mookerjee
2017 J jnl
Inf. Syst. Res.
Zhen Sun, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2017 J jnl
Oper. Res.
Radha V. Mookerjee, Subodha Kumar, Vijay S. Mookerjee
2016 J jnl
Manag. Sci.
Liying Mu, Milind Dawande, Xianjun Geng, Vijay S. Mookerjee
2016 J jnl
MIS Q.
Zhen Sun, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2016 J jnl
Inf. Syst. Res.
Yonghua Ji, Subodha Kumar, Vijay S. Mookerjee
2015 J jnl
J. Manag. Inf. Syst.
Abhijeet Ghoshal, Subodha Kumar, Vijay S. Mookerjee
2015 C conf
ICIS
Manmohan Aseri, Milind Dawande, Ganesh Janakiraman, Vijay S. Mookerjee
2015 J jnl
Inf. Syst. Frontiers
Monica S. Johar, Vijay S. Mookerjee, Suresh P. Sethi
2014 J jnl
Inf. Syst. Frontiers
Tridib Bandyopadhyay, Dengpan Liu, Vijay S. Mookerjee, Allen Wilhite
2014 J jnl
Inf. Syst. Res.
Ritu Agarwal, Vijay S. Mookerjee
2014 J jnl
MIS Q.
Wael Jabr, Radha V. Mookerjee, Yong Tan, Vijay S. Mookerjee
2014 C conf
ICIS
Zhen Sun, Vijay S. Mookerjee, Milind Dawande, Ganesh Janakiraman
2014 J jnl
Manag. Sci.
Yasin Ceran, Milind Dawande, Dengpan Liu, Vijay S. Mookerjee
2014 J jnl
INFORMS J. Comput.
Hao Xia, Milind Dawande, Vijay S. Mookerjee
2014 J jnl
Inf. Syst. Res.
Monica S. Johar, Vijay S. Mookerjee, Sumit Sarkar
2013 J jnl
Manuf. Serv. Oper. Manag.
Milind Dawande, Srinagesh Gavirneni, Mili Mehrotra, Vijay S. Mookerjee
2012 J jnl
Inf. Syst. Res.
Dengpan Liu, Subodha Kumar, Vijay S. Mookerjee
2012 J jnl
Inf. Syst. Res.
Brian L. Dos Santos, Zhiqiang (Eric) Zheng, Vijay S. Mookerjee, Hongyu Chen
2012 J jnl
Inf. Syst. Res.
Monica S. Johar, Nanda Kumar, Vijay S. Mookerjee
2012 C conf
ICIS
Yuanfeng Cai, Zhengrui Jiang, Vijay S. Mookerjee
2012 J jnl
MIS Q.
Amit Mehra, Vijay S. Mookerjee
2012 J jnl
INFORMS J. Comput.
Milind Dawande, Vijay S. Mookerjee, Chelliah Sriskandarajah, Yunxia Zhu
2012 J jnl
Interfaces
Radha V. Mookerjee, Subodha Kumar, Vijay S. Mookerjee
2011 J jnl
Inf. Syst. Res.
Monica S. Johar, Syam Menon, Vijay S. Mookerjee
2011 J jnl
IEEE Trans. Knowl. Data Eng.
Debabrata Dey, Vijay S. Mookerjee, Dengpan Liu
2011 C conf
ICIS
Yasin Ceran, Harpreet Singh, Vijay S. Mookerjee
2011 J jnl
Decis. Support Syst.
Dengpan Liu, Yonghua Ji, Vijay S. Mookerjee
2011 J jnl
Inf. Syst. Res.
Kutsal Dogan, Yonghua Ji, Vijay S. Mookerjee, Suresh Radhakrishnan
2011 J jnl
MIS Q.
Param Vir Singh, Yong Tan, Vijay S. Mookerjee
2011 J jnl
Inf. Syst. Res.
Vijay S. Mookerjee, Radha V. Mookerjee, Alain Bensoussan, Wei T. Yue
2010 J jnl
Manag. Sci.
Milind Dawande, Mili Mehrotra, Vijay S. Mookerjee, Chelliah Sriskandarajah
2009 J jnl
Decis. Support Syst.
Cuneyd C. Kaya, Guoying Zhang, Yong Tan, Vijay S. Mookerjee
2009 C conf
ICIS
Abhijeet Ghoshal, Vijay S. Mookerjee, Sumit Sarkar
2009 J jnl
Manag. Sci.
Alain Bensoussan, Radha V. Mookerjee, Vijay S. Mookerjee, Wei T. Yue
2009 J jnl
Eur. J. Oper. Res.
Subodha Kumar, Kaushik Dutta, Vijay S. Mookerjee
2009 conf
PACIS
Narayan Ramasubbu, Amit Mehra, Vijay S. Mookerjee
2009 J jnl
Commun. ACM
Tridib Bandyopadhyay, Vijay S. Mookerjee, Ram C. Rao
2008 J jnl
Inf. Syst. Res.
Milind Dawande, Monica S. Johar, Subodha Kumar, Vijay S. Mookerjee
2008 C conf
ICIS
Brian L. Dos Santos, Zhiqiang Zheng, Vijay S. Mookerjee, Hongyu Chen
2008 J jnl
Manag. Sci.
Milind Dawande, Subodha Kumar, Vijay S. Mookerjee, Chelliah Sriskandarajah
2007 J jnl
IEEE Trans. Knowl. Data Eng.
Subodha Kumar, Milind Dawande, Vijay S. Mookerjee
2007 C conf
ICIS
Yong Tan, Vijay S. Mookerjee, Param Vir Singh
2006 J jnl
Oper. Res.
Yong Tan, I. Robert Chiang, Vijay S. Mookerjee
2006 J jnl
INFORMS J. Comput.
Yong Tan, Yonghua Ji, Vijay S. Mookerjee
2006 J jnl
Eur. J. Oper. Res.
Qi Feng, Vijay S. Mookerjee, Suresh P. Sethi
2005 J jnl
Manag. Sci.
Yong Tan, Vijay S. Mookerjee
2005 conf
AMCIS
Dengpan Liu, Subodha Kumar, Vijay S. Mookerjee
2005 J jnl
IEEE Trans. Software Eng.
Yong Tan, Vijay S. Mookerjee
2005 J jnl
Inf. Syst. Res.
Zhengrui Jiang, Vijay S. Mookerjee, Sumit Sarkar
2005 J jnl
INFORMS J. Comput.
Yong Tan, Kamran Moinzadeh, Vijay S. Mookerjee
2005 J jnl
Inf. Syst. Res.
Yonghua Ji, Vijay S. Mookerjee, Suresh P. Sethi
2004 J jnl
Inf. Syst. Res.
I. Robert Chiang, Vijay S. Mookerjee
2004 J jnl
Commun. ACM
I. Robert Chiang, Vijay S. Mookerjee
2002 J jnl
IEEE Trans. Software Eng.
Vijay S. Mookerjee, I. Robert Chiang
2002 J jnl
Oper. Res.
Vijay S. Mookerjee, Yong Tan
2002 J jnl
Eur. J. Oper. Res.
Vijay S. Mookerjee
2002 J jnl
IEEE Trans. Knowl. Data Eng.
Michael V. Mannino, Vijay S. Mookerjee
2002 C conf
ICIS
Yonghua Ji, Vijay S. Mookerjee, Suresh Radhakrishnan
2001 J jnl
IEEE Trans. Knowl. Data Eng.
Vijay S. Mookerjee
2000 J jnl
Inf. Syst. Res.
Vijay S. Mookerjee, Michael V. Mannino
1999 J jnl
INFORMS J. Comput.
Michael V. Mannino, Vijay S. Mookerjee
1997 J jnl
Inf. Syst. Res.
Vijay S. Mookerjee, Michael V. Mannino
1997 J jnl
IEEE Trans. Knowl. Data Eng.
Vijay S. Mookerjee, Michael V. Mannino
1995 J jnl
Inf. Syst. Res.
Vijay S. Mookerjee, Michael V. Mannino, Robert Gilson
1995 J jnl
Inf. Syst. Res.
Murlidhar V. Koushik, Vijay S. Mookerjee
1993 J jnl
Inf. Syst. Res.
Vijay S. Mookerjee, Brian L. Dos Santos
1993 J jnl
Decis. Support Syst.
Brian L. Dos Santos, Vijay S. Mookerjee
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 []