Vijay A. Saraswat

110 papers A* 17A 12B 18C 1Misc 2Journal 31Unranked 25
YearRankTypeTitle / Venue / Authors
2019 J jnl
ACM Trans. Program. Lang. Syst.
David Grove, Sara S. Hamouda, Benjamin Herta, Arun Iyengar, Kiyokuni Kawachiya, Josh Milthorpe, Vijay A. Saraswat, Avraham Shinnar, Mikio Takeuchi, Olivier Tardieu
2019 J jnl
Comput. Linguistics
Jianpeng Cheng, Siva Reddy, Vijay A. Saraswat, Mirella Lapata
2017 B conf
CoNLL
Abulhair Saparov, Vijay A. Saraswat, Tom M. Mitchell
2017 conf
AAAI Workshops
Cristina Cornelio, Vijay A. Saraswat
2017 conf
ACL (1)
Jianpeng Cheng, Siva Reddy, Vijay A. Saraswat, Mirella Lapata
2017 J jnl
CoRR
Jianpeng Cheng, Siva Reddy, Vijay A. Saraswat, Mirella Lapata
2017 J jnl
CoRR
Jianpeng Cheng, Siva Reddy, Vijay A. Saraswat, Mirella Lapata
2016 J jnl
Ann. Math. Artif. Intell.
Umberto Grandi, Andrea Loreggia, Francesca Rossi, Vijay A. Saraswat
2016 A* conf
AAAI
Andrea Loreggia, Yuri Malitsky, Horst Samulowitz, Vijay A. Saraswat
2016 J jnl
IBM J. Res. Dev.
Matthew Arnold, David Grove, Benjamin Herta, Michael Hind, Martin Hirzel, Arun Iyengar, Louis Mandel, Vijay A. Saraswat, Avraham Shinnar, Jérôme Siméon, Mikio Takeuchi, Olivier Tardieu, Wei Zhang
2016 J jnl
ACM Trans. Parallel Comput.
Olivier Tardieu, Benjamin Herta, David Cunningham, David Grove, Prabhanjan Kambadur, Vijay A. Saraswat, Avraham Shinnar, Mikio Takeuchi, Mandana Vaziri, Wei Zhang
2015 conf
IPDPS Workshops
Sara S. Hamouda, Josh Milthorpe, Peter E. Strazdins, Vijay A. Saraswat
2015 J jnl
CoRR
Cristina Cornelio, Andrea Loreggia, Vijay A. Saraswat
2015 A* conf
AAAI
Danny Munera, Daniel Diaz, Salvador Abreu, Francesca Rossi, Vijay A. Saraswat, Philippe Codognet
2014 A conf
CP
Vijay A. Saraswat
2014 Misc conf
ISAIM
Umberto Grandi, Andrea Loreggia, Francesca Rossi, Vijay A. Saraswat
2014 conf
PPAA@PPoPP
Wei Zhang, Olivier Tardieu, David Grove, Benjamin Herta, Tomio Kamada, Vijay A. Saraswat, Mikio Takeuchi
2014 B conf
CPAIOR
David Bergman, André A. Ciré, Ashish Sabharwal, Horst Samulowitz, Vijay A. Saraswat, Willem Jan van Hoeve
2014 B conf
PPoPP
David Cunningham, David Grove, Benjamin Herta, Arun Iyengar, Kiyokuni Kawachiya, Hiroki Murata, Vijay A. Saraswat, Mikio Takeuchi, Olivier Tardieu
2014 A conf
ECOOP
Silvia Crafa, David Cunningham, Vijay A. Saraswat, Avraham Shinnar, Olivier Tardieu
2014 conf
Horizons of the Mind
Vijay A. Saraswat, Vineet Gupta, Radha Jagadeesan
2014 B conf
PPoPP
Olivier Tardieu, Benjamin Herta, David Cunningham, David Grove, Prabhanjan Kambadur, Vijay A. Saraswat, Avraham Shinnar, Mikio Takeuchi, Mandana Vaziri
2013 B conf
PPoPP
Tomofumi Yuki, Paul Feautrier, Sanjay V. Rajopadhye, Vijay A. Saraswat
2013 J jnl
CoRR
Tomofumi Yuki, Paul Feautrier, Sanjay V. Rajopadhye, Vijay A. Saraswat
2013 J jnl
CoRR
Wei Zhang, Olivier Tardieu, David Grove, Benjamin Herta, Tomio Kamada, Vijay A. Saraswat, Mikio Takeuchi
2013 conf
X10@PLDI
Mikio Takeuchi, David Cunningham, David Grove, Vijay A. Saraswat
2013 J jnl
CoRR
Silvia Crafa, David Cunningham, Vijay A. Saraswat, Avraham Shinnar, Olivier Tardieu
2013 J jnl
CoRR
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
2012 A conf
OOPSLA
Olivier Tardieu, Nathaniel Nystrom, Igor Peshansky, Vijay A. Saraswat
2012 J jnl
CoRR
Avraham Shinnar, David Cunningham, Benjamin Herta, Vijay A. Saraswat
2012 J jnl
Proc. VLDB Endow.
Avraham Shinnar, David Cunningham, Benjamin Herta, Vijay A. Saraswat
2012 A conf
ECOOP
Yoav Zibin, David Cunningham, Igor Peshansky, Vijay A. Saraswat
2012 A conf
SAT
Bard Bloom, David Grove, Benjamin Herta, Ashish Sabharwal, Horst Samulowitz, Vijay A. Saraswat
2011 B conf
PPoPP
Vijay A. Saraswat, Prabhanjan Kambadur, Sreedhar B. Kodali, David Grove, Sriram Krishnamoorthy
2010 conf
SPLASH/OOPSLA Companion
Vijay A. Saraswat, Doug Lea
2010 conf
SPLASH/OOPSLA Companion
Vijay A. Saraswat, Kim Bruce
2010 A conf
SC
Guojing Cong, George Almási, Vijay A. Saraswat
2010 ed.
PGAS
José E. Moreira, Costin Iancu, Vijay A. Saraswat
2009 conf
OOPSLA Companion
Guy L. Steele Jr., Vijay A. Saraswat
2009 B conf
PPoPP
Ganesh Bikshandi, José G. Castaños, Sreedhar B. Kodali, V. Krishna Nandivada, Igor Peshansky, Vijay A. Saraswat, Sayantan Sur, Pradeep Varma, Tong Wen
2009 B conf
PPoPP
Maged M. Michael, Martin T. Vechev, Vijay A. Saraswat
2008 A conf
OOPSLA
Nathaniel Nystrom, Vijay A. Saraswat, Jens Palsberg, Christian Grothoff
2008 B conf
ICPP
Guojing Cong, Sreedhar B. Kodali, Sriram Krishnamoorthy, Doug Lea, Vijay A. Saraswat, Tong Wen
2008 B conf
PPoPP
Satish Chandra, Vijay A. Saraswat, Vivek Sarkar, Rastislav Bodík
2007 B conf
PPoPP
Vijay A. Saraswat, Radha Jagadeesan, Maged M. Michael, Christoph von Praun
2007 A* conf
PLDI
Armando Solar-Lezama, Gilad Arnold, Liviu Tancau, Rastislav Bodík, Vijay A. Saraswat, Sanjit A. Seshia
2007 B conf
APLAS
Vijay A. Saraswat
2007 B conf
PPoPP
Vijay A. Saraswat, Vivek Sarkar, Christoph von Praun
2006 A* conf
ASPLOS
Armando Solar-Lezama, Liviu Tancau, Rastislav Bodík, Sanjit A. Seshia, Vijay A. Saraswat
2006 A* conf
LICS
Catuscia Palamidessi, Vijay A. Saraswat, Frank D. Valencia, Björn Victor
2005 B conf
CONCUR
Vijay A. Saraswat, Radha Jagadeesan
2005 conf
FSTTCS
Radha Jagadeesan, Gopalan Nadathur, Vijay A. Saraswat
2005 C conf
PPDP
Radha Jagadeesan, Will Marrero, Corin Pitcher, Vijay A. Saraswat
2005 A conf
OOPSLA
Philippe Charles, Christian Grothoff, Vijay A. Saraswat, Christopher Donawa, Allan Kielstra, Kemal Ebcioglu, Christoph von Praun, Vivek Sarkar
2004 conf
ASIAN
Vijay A. Saraswat
2003 ed.
ASIAN
Vijay A. Saraswat
2003 Misc conf
EPIA
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
2002 J jnl
Theor. Comput. Sci.
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
2000 A* conf
STOC
Rajeev Motwani, Rina Panigrahy, Vijay A. Saraswat, Suresh Venkatasubramanian
1999 J jnl
Artif. Intell.
Markus P. J. Fromherz, Vijay A. Saraswat, Daniel G. Bobrow
1998 J jnl
Sci. Comput. Program.
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1998 J jnl
J. Log. Program.
Pascal Van Hentenryck, Vijay A. Saraswat, Yves Deville
1998 J jnl
INFORMS J. Comput.
Rajeev Motwani, Vijay A. Saraswat, Eric Torng
1997 J jnl
Constraints An Int. J.
Vijay A. Saraswat
1997 J jnl
Constraints An Int. J.
Pascal Van Hentenryck, Vijay A. Saraswat
1997 J jnl
Constraints An Int. J.
Vijay A. Saraswat, Pascal Van Hentenryck
1997 B conf
CONCUR
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1997 J jnl
J. Log. Lang. Inf.
Mary Dalrymple, John Lamping, Fernando C. N. Pereira, Vijay A. Saraswat
1996 J jnl
ACM Comput. Surv.
Vijay A. Saraswat
1996 B conf
CONCUR
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1996 J jnl
ACM Comput. Surv.
Pascal Van Hentenryck, Vijay A. Saraswat
1996 J jnl
J. Symb. Comput.
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1996 B conf
CONCUR
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1995 A* conf
POPL
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1995 conf
Hybrid Systems
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1995 J jnl
CoRR
Mary Dalrymple, John Lamping, Fernando C. N. Pereira, Vijay A. Saraswat
1995 A conf
CP
Markus P. J. Fromherz, Vijay A. Saraswat
1995 A* conf
IJCAI
Yumi Iwasaki, Adam Farquhar, Vijay A. Saraswat, Daniel G. Bobrow, Vineet Gupta
1995 J jnl
CoRR
Mary Dalrymple, John Lamping, Fernando C. N. Pereira, Vijay A. Saraswat
1995 A conf
CP
Vijay A. Saraswat
1995 J jnl
CoRR
Andrew Kehler, Mary Dalrymple, John Lamping, Vijay A. Saraswat
1995 A conf
EACL
Andrew Kehler, Mary Dalrymple, John Lamping, Vijay A. Saraswat
1994 J jnl
CoRR
Mary Dalrymple, John Lamping, Fernando C. N. Pereira, Vijay A. Saraswat
1994 conf
PPCP
Ugo Montanari, Francesca Rossi, Vijay A. Saraswat
1994 conf
Constraint Programming
Pascal Van Hentenryck, Vijay A. Saraswat, Yves Deville
1994 A* conf
LICS
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1994 J jnl
CoRR
Mary Dalrymple, John Lamping, Fernando C. N. Pereira, Vijay A. Saraswat
1994 conf
Hybrid Systems
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat, Daniel G. Bobrow
1993 book
Concurrent constraint programming.
Vijay A. Saraswat
1993 A* conf
IJCAI
Olivier Raiman, Johan de Kleer, Vijay A. Saraswat
1993 A conf
EACL
Mary Dalrymple, John Lamping, Vijay A. Saraswat
1993 conf
NATO ASI CP
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1992 conf
REX Workshop
Prakash Panangaden, Vijay A. Saraswat, Philip J. Scott, Robert A. G. Seely
1992 A* conf
LICS
Vijay A. Saraswat
1991 A* conf
AAAI
Olivier Raiman, Johan de Kleer, Vijay A. Saraswat, Mark Shirley
1991 ed.
ILPS
Vijay A. Saraswat, Kazunori Ueda
1991 conf
GI Jahrestagung
Kenneth M. Kahn, Vijay A. Saraswat, Volker Haarslev
1991 A* conf
POPL
Vijay A. Saraswat, Martin C. Rinard, Prakash Panangaden
1990 conf
OOPSLA/ECOOP
Kenneth M. Kahn, Vijay A. Saraswat
1990 conf
LPE
Kenneth M. Kahn, Vijay A. Saraswat
1990 conf
VL
Kenneth M. Kahn, Vijay A. Saraswat
1990 A* conf
POPL
Vijay A. Saraswat, Martin C. Rinard
1990 conf
NACLP
Vijay A. Saraswat, Kenneth M. Kahn, Jacob Levy
1990 B conf
ICLP
Vijay A. Saraswat
1988 conf
ICLP/SLP
Vijay A. Saraswat
1988 A* conf
PODC
Vijay A. Saraswat, Kenneth M. Kahn, David Weinbaum
1987 A* conf
AAAI
Vijay A. Saraswat
1987 conf
SLP
Vijay A. Saraswat
1987 A* conf
POPL
Vijay A. Saraswat
1985 conf
FSTTCS
Vijay A. Saraswat
redb/extractors/elf_extractors/elf_segments.py
← Index redb/extractors/elf_extractors/elf_segments.py python
import inspect
import hashlib
import math
from collections import Counter
from datetime import datetime, timezone
from typing import Any, List, Dict

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 ELFSegment


class ELFSegmentExtractor(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_segments = []
        self.elastic_index = self.index_prefix + "-elf_segments"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _is_empty_result(self, extracted_data) -> bool:
        """
        Override: Empty segments is an ERROR, not a valid empty case.
        A valid ELF file must have segments (program headers).
        """
        # Always return False - empty segments should be treated as an error
        return False

    def _calculate_entropy(self, data: bytes) -> float:
        """Calculate Shannon entropy of data."""
        if not data:
            return 0.0

        try:
            # Count frequency of each byte
            byte_counts = Counter(data)
            data_len = len(data)

            # Calculate entropy
            entropy = 0.0
            for count in byte_counts.values():
                if count > 0:
                    frequency = count / data_len
                    entropy -= frequency * math.log2(frequency)

            return entropy
        except Exception as e:
            self.log.error(f"Error calculating entropy: {e}")
            return 0.0

    def _map_segment_type(self, p_type_str: str) -> int:
        """Map segment type string to enum value."""
        type_map = {
            'PT_NULL': 0,
            'PT_LOAD': 1,
            'PT_DYNAMIC': 2,
            'PT_INTERP': 3,
            'PT_NOTE': 4,
            'PT_SHLIB': 5,
            'PT_PHDR': 6,
            'PT_TLS': 7
        }
        return type_map.get(p_type_str, 0)

    def _decode_segment_flags(self, flags: int) -> List[str]:
        """Decode segment flags to human-readable strings."""
        flag_strings = []

        if flags & 0x1:  # PF_X
            flag_strings.append('EXECUTE')
        if flags & 0x2:  # PF_W
            flag_strings.append('WRITE')
        if flags & 0x4:  # PF_R
            flag_strings.append('READ')

        return flag_strings if flag_strings else ['NONE']

    def _extract_segment_data(self, segment) -> ELFSegment:
        """Extract data from a single segment with granular error handling."""
        # Initialize with safe defaults
        segment_type = 0
        segment_type_str = 'unknown'
        segment_flags = 0
        segment_flags_str = ['NONE']
        segment_offset = 0
        segment_vaddr = 0
        segment_paddr = 0
        segment_filesz = 0
        segment_memsz = 0
        segment_align = 0
        segment_entropy = 0.0
        segment_sha256 = ""
        segment_md5 = ""

        # Try to get segment header
        header = None
        try:
            header = segment.header
        except Exception as e:
            self.log.warning(f"Could not access segment header: {e}")
            return ELFSegment(
                segment_type=segment_type, segment_type_str=segment_type_str,
                segment_flags=segment_flags, segment_flags_str=segment_flags_str,
                segment_offset=segment_offset, segment_vaddr=segment_vaddr,
                segment_paddr=segment_paddr, segment_filesz=segment_filesz,
                segment_memsz=segment_memsz, segment_align=segment_align,
                segment_entropy=segment_entropy, segment_sha256=segment_sha256,
                segment_md5=segment_md5
            )

        # Extract segment type
        try:
            p_type_str = header.get('p_type', 'PT_NULL')
            segment_type = self._map_segment_type(p_type_str)
            segment_type_str = p_type_str.replace('PT_', '') if p_type_str.startswith('PT_') else p_type_str
        except Exception as e:
            self.log.warning(f"Could not extract segment type: {e}")

        # Extract segment flags
        try:
            segment_flags = header.get('p_flags', 0)
            segment_flags_str = self._decode_segment_flags(segment_flags)
        except Exception as e:
            self.log.warning(f"Could not extract segment flags: {e}")

        # Extract segment addresses and sizes
        try:
            segment_offset = header.get('p_offset', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment offset: {e}")

        try:
            segment_vaddr = header.get('p_vaddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment vaddr: {e}")

        try:
            segment_paddr = header.get('p_paddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment paddr: {e}")

        try:
            segment_filesz = header.get('p_filesz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment filesz: {e}")

        try:
            segment_memsz = header.get('p_memsz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment memsz: {e}")

        try:
            segment_align = header.get('p_align', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment align: {e}")

        # Calculate entropy and hashes for segment data (most likely to fail)
        try:
            if segment_filesz > 0:
                segment_data = segment.data()
                if segment_data:
                    # Calculate entropy
                    segment_entropy = self._calculate_entropy(segment_data)

                    # Calculate hashes
                    segment_sha256 = hashlib.sha256(segment_data).hexdigest()
                    segment_md5 = hashlib.md5(segment_data).hexdigest()
        except Exception as e:
            self.log.warning(f"Could not read segment data for hashing: {e}")
            # Keep defaults (0.0, "", "")

        return ELFSegment(
            segment_type=segment_type,
            segment_type_str=segment_type_str,
            segment_flags=segment_flags,
            segment_flags_str=segment_flags_str,
            segment_offset=segment_offset,
            segment_vaddr=segment_vaddr,
            segment_paddr=segment_paddr,
            segment_filesz=segment_filesz,
            segment_memsz=segment_memsz,
            segment_align=segment_align,
            segment_entropy=segment_entropy,
            segment_sha256=segment_sha256,
            segment_md5=segment_md5
        )

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

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

            def extract_segments(elf):
                segments_data = []

                # Iterate through all segments with per-segment error handling
                for segment_index, segment in enumerate(elf.iter_segments()):
                    try:
                        segment_data = self._extract_segment_data(segment)
                        if segment_data:
                            segments_data.append(segment_data)
                        else:
                            self.log.warning(f"Failed to extract data for segment {segment_index}")
                    except Exception as e:
                        self.log.warning(f"Error processing segment {segment_index}: {e}")
                        # Continue processing other segments

                return segments_data

            # 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

            segments_data = self._with_elf_file(extract_segments)
            if segments_data is None:
                return None

            self.elf_segments = segments_data
            return self.elf_segments

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

                # Prepare data arrays for all segments
                data = []
                current_time = datetime.now(timezone.utc)
                for segment in self.elf_segments:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        segment.segment_type,
                        segment.segment_type_str,
                        segment.segment_flags,
                        segment.segment_flags_str,
                        segment.segment_offset,
                        segment.segment_vaddr,
                        segment.segment_paddr,
                        segment.segment_filesz,
                        segment.segment_memsz,
                        segment.segment_align,
                        segment.segment_entropy,
                        segment.segment_sha256,
                        segment.segment_md5,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'segment_type', 'segment_type_str', 'segment_flags', 'segment_flags_str',
                    'segment_offset', 'segment_vaddr', 'segment_paddr',
                    'segment_filesz', 'segment_memsz', 'segment_align',
                    'segment_entropy', 'segment_sha256', 'segment_md5',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('NULL'=0, 'LOAD'=1, 'DYNAMIC'=2, 'INTERP'=3, 'NOTE'=4, 'SHLIB'=5, 'PHDR'=6, 'TLS'=7)",
                    'LowCardinality(String)',
                    'UInt32',
                    'Array(LowCardinality(String))',
                    'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64',
                    'Float64',
                    'FixedString(64)', 'FixedString(32)',
                    '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_segments"