James D. Foley

95 papers A* 23A 5B 2Journal 29Unranked 33
YearRankTypeTitle / Venue / Authors
2023 conf
SIGGRAPH Panels
James F. Blinn, James D. Foley, Donald P. Greenberg, Alvy Ray Smith, Andries van Dam, John Turner Whitted
2019 J jnl
IEEE Computer Graphics and Applications
Boris Dalstein, James D. Foley
2018 A conf
ICER
Barbara J. Ericson, James D. Foley, Jochen Rick
2014 book
John F. Hughes, Andries van Dam, Morgan McGuire, David F. Sklar, James D. Foley, Steven K. Feiner, Kurt Akeley
2012 J jnl
IEEE Secur. Priv.
Mischel Kwon, Michael J. Jacobs, David Cullinane, Christopher G. Ipsen, James D. Foley
2009 conf
JCDL
Edward Clarkson, Shamkant B. Navathe, James D. Foley
2009 J jnl
IEEE Trans. Vis. Comput. Graph.
Edward Clarkson, Krishna Desai, James D. Foley
2007 J jnl
Bull. IEEE Tech. Comm. Digit. Libr.
Edward Clarkson, James D. Foley
2006 conf
CHI Extended Abstracts
Edward Clarkson, Jason A. Day, James D. Foley
2006 conf
JCDL
Edward Clarkson, James D. Foley
2006 conf
CHI Extended Abstracts
James D. Foley, Jenny Preece
2006 J jnl
IEEE Trans. Educ.
Jason A. Day, James D. Foley
2006 conf
CHI Extended Abstracts
Jason A. Day, James D. Foley
2005 conf
CHI Extended Abstracts
James D. Foley, Michel Beaudouin-Lafon, Jonathan Grudin, James D. Hollan, Scott E. Hudson, Judy Olson, Bill Verplank
2000 J jnl
IEEE Computer Graphics and Applications
James D. Foley
1999 ed.
SI3D
Jarek Rossignac, Jessica K. Hodgins, James D. Foley
1998 conf
VVS
James D. Foley
1997 A conf
IUI
James D. Foley
1997 A* conf
ACM Symposium on User Interface Software and Technology
Robert J. K. Jacob, Steven Feiner, James D. Foley, Jock D. Mackinlay, Dan R. Olsen
1996 J jnl
Commun. ACM
James D. Foley
1996 conf
CHI Conference Companion
Ellen Isaacs, John C. Tang, James D. Foley, Jeff A. Johnson, Allan Kuchinsky, Jean Scholtz, John Bennett
1996 conf
CHI Conference Companion
Nahum D. Gershon, Keith Andrews, Stephen G. Eick, James D. Foley, William Ruh
1995 A conf
Symposium on Designing Interactive Systems
Martin R. Frank, Piyawadee Noi Sukaviriya, James D. Foley
1995 conf
DS-6
James D. Foley
1995 conf
Workshop on Database Issues for Data Visualization
Sougata Mukherjea, James D. Foley
1995 conf
CHI 95 Conference Companion
Sougata Mukherjea, James D. Foley
1995 A* conf
CHI
Sougata Mukherjea, James D. Foley, Scott E. Hudson
1995 A* conf
SIGGRAPH
Nahum D. Gershon, Bran Ferren, James D. Foley, Joseph Hardin, Frank Kappe, William Ruh
1995 J jnl
Comput. Networks ISDN Syst.
Sougata Mukherjea, James D. Foley
1994 conf
DSV-IS
Piyawadee Noi Sukaviriya, Jeyakumar Muthukumarasamy, Martin R. Frank, James D. Foley
1994 A* conf
ACM Symposium on User Interface Software and Technology
Martin R. Frank, James D. Foley
1994 A* conf
CHI
Michael D. Byrne, Scott D. Wood, James D. Foley, David E. Kieras, Piyawadee Noi Sukaviriya
1994 conf
CHI Conference Companion
Michael D. Byrne, Scott D. Wood, Piyawadee Noi Sukaviriya, James D. Foley, David E. Kieras
1994 conf
DSV-IS
James D. Foley, Piyawadee Noi Sukaviriya
1994 B conf
Advanced Visual Interfaces
James D. Foley
1994 conf
ECHT
Sougata Mukherjea, James D. Foley, Scott E. Hudson
1994 A* conf
ACM Symposium on User Interface Software and Technology
Piyawadee Noi Sukaviriya, Srdjan Kovacevic, James D. Foley, Brad A. Myers, Dan R. Olsen, Matthias Schneider-Hufschmidt
1994 conf
CHI Conference Companion
Sougata Mukherjea, James D. Foley
1994 J jnl
IEEE Computer Graphics and Applications
José L. Encarnação, James D. Foley, Steve Bryson, Steven K. Feiner, Nahum D. Gershon
1993 conf
INTERCHI
Piyawadee Noi Sukaviriya, James D. Foley, Todd Griffith
1993 conf
INTERCHI Adjunct Proceedings
Thomas Kühme, Uwe Malinowski, James D. Foley
1993 A conf
IUI
Robert Neches, James D. Foley, Pedro A. Szekely, Piyawadee Noi Sukaviriya, Ping Luo, Srdjan Kovacevic, Scott E. Hudson
1993 conf
INTERCHI Adjunct Proceedings
Martin R. Frank, James D. Foley
1993 A* conf
ACM Symposium on User Interface Software and Technology
Martin R. Frank, James D. Foley
1993 A* ed.
UIST
Scott E. Hudson, Randy Pausch, Brad T. Vander Zanden, James D. Foley
1993 conf
INTERCHI
Won Chul Kim, James D. Foley
1993 J jnl
Behav. Inf. Technol.
Dan R. Olsen Jr., James D. Foley, Scott E. Hudson, James Miller, Brad A. Myers
1993 A conf
IUI
Piyawadee Noi Sukaviriya, James D. Foley
1992 A* conf
CHI
Martin R. Frank, J. J. de Graaff, Daniel F. Gieskens, James D. Foley
1992 A* conf
CHI
Daniel F. Gieskens, James D. Foley
1992 A* conf
CHI
Dennis J. M. J. de Baar, James D. Foley, Kevin E. Mullet
1992 A* conf
CHI
James D. Foley, Christine M. Mitchell, Neff Walker
1991 conf
COOCS
James D. Foley
1991 conf
GI Jahrestagung
James D. Foley
1990 book
Computer graphics - principles and practice, 2nd Edition.
James D. Foley, Andries van Dam, Steven Feiner, John F. Hughes
1990 A* conf
UIST
Piyawadee Noi Sukaviriya, James D. Foley
1990 A* conf
UIST
Won Chul Kim, James D. Foley
1990 J jnl
Int. J. High Perform. Comput. Appl.
James D. Foley
1990 B conf
INTERACT
Jakob Nielsen, Susan M. Dray, James D. Foley, Paul Walsh, Peter C. Wright
1989 J jnl
IEEE Softw.
James D. Foley, Won Chul Kim, Srdjan Kovacevic, Kevin Murray
1989 conf
SIGGRAPH (Panels)
Lloyd A. Treinish, James D. Foley, William J. Campbell, Robert B. Haber, Robert F. Gurwitz
1988 J jnl
Int. J. Man Mach. Stud.
Woodrow Barfield, James Sandford, James D. Foley
1987 J jnl
IEEE Computer Graphics and Applications
James D. Foley, Won Chul Kim
1987 conf
COMPCON
James D. Foley
1986 J jnl
IEEE Computer Graphics and Applications
James D. Foley, Charles F. McMath
1986 J jnl
ACM Trans. Graph.
James D. Foley
1986 J jnl
ACM Trans. Graph.
James D. Foley
1986 J jnl
ACM Trans. Graph.
James D. Foley
1985 J jnl
Comput. Graph.
Mei-Cheng Hu, James D. Foley
1984 J jnl
IEEE Computer Graphics and Applications
James D. Foley, Victor L. Wallace, Peggy Chan
1983 A* conf
SIGGRAPH
James D. Foley, Alfred Bork, Maxine D. Brown, Robin King, Andries van Dam, Michael J. Wozny
1982 A* conf
SIGGRAPH
James Acquah, James D. Foley, John L. Sibert, Patricia A. Wenner
1982 J jnl
ACM Trans. Graph.
Michael T. Garrett, James D. Foley
1982 J jnl
ACM SIGCSE Bull.
James D. Foley
1982 A* conf
CHI
James D. Foley
1982 J jnl
ACM SIGCSE Bull.
James D. Foley
1982 A* conf
CHI
Teresa W. Bleser, James D. Foley
1981 A* conf
SIGGRAPH
James D. Foley, Patricia A. Wenner
1980 conf
IFIP Congress
James D. Foley
1979 A* conf
SIGGRAPH
James D. Foley, James N. Templeman, Dara Dastyar
1978 J jnl
ACM Comput. Surv.
R. Daniel Bergeron, Peter R. Bono, James D. Foley
1978 J jnl
ACM Comput. Surv.
James C. Michener, James D. Foley
1976 J jnl
Computer
James D. Foley
1976 conf
ACM Symposium on Graphic Languages
James D. Foley
1976 conf
UODIGS
James D. Foley
1976 A* conf
SIGGRAPH
James D. Foley
1975 conf
ACM Annual Conference
James D. Foley, W. V. Wright
1975 A* conf
SIGGRAPH
Griffith Hamlin Jr., James D. Foley
1974 A* conf
SIGMETRICS
James D. Foley, John W. McInroy
1974 conf
AFIPS National Computer Conference
Lawrence Rosler, James D. Foley, John B. Macdonald, H. G. Marsh
1974 conf
AFIPS National Computer Conference
Phillip P. Damon, James D. Foley, Arthur D. Hughes, Carl Machover, Sol Sherr, Robert H. Stotz, Luis Villalobos
1973 J jnl
Comput. Graph. Image Process.
James D. Foley, Stephen M. Pizer
1973 conf
ACM Annual Conference
James D. Foley
1971 J jnl
Commun. ACM
James D. Foley
1967 J jnl
Commun. ACM
James D. Foley
redb/extractors/elf_extractors/elf_symbols.py
← Index redb/extractors/elf_extractors/elf_symbols.py python
import inspect
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 ELFSymbol


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

    def _map_symbol_type(self, st_type_str: str) -> int:
        """Map symbol type string to enum value."""
        type_map = {
            'STT_NOTYPE': 0,
            'STT_OBJECT': 1,
            'STT_FUNC': 2,
            'STT_SECTION': 3,
            'STT_FILE': 4,
            'STT_COMMON': 5,
            'STT_TLS': 6
        }
        return type_map.get(st_type_str, 0)

    def _map_symbol_bind(self, st_bind_str: str) -> int:
        """Map symbol binding string to enum value."""
        bind_map = {
            'STB_LOCAL': 0,
            'STB_GLOBAL': 1,
            'STB_WEAK': 2
        }
        return bind_map.get(st_bind_str, 0)

    def _map_symbol_visibility(self, st_vis_str: str) -> int:
        """Map symbol visibility string to enum value."""
        vis_map = {
            'STV_DEFAULT': 0,
            'STV_INTERNAL': 1,
            'STV_HIDDEN': 2,
            'STV_PROTECTED': 3
        }
        return vis_map.get(st_vis_str, 0)

    def _extract_symbol_data(self, symbol, is_dynamic: bool = False) -> Dict:
        """Extract data from a single symbol."""
        try:
            # Get symbol name (handle empty names)
            symbol_name = symbol.name if symbol.name else f"<unnamed_{symbol.entry.get('st_name', 0)}>"

            # Get symbol properties
            symbol_value = symbol.entry.get('st_value', 0)
            symbol_size = symbol.entry.get('st_size', 0)

            # Handle section index - can be integer or special string like 'SHN_UNDEF'
            st_shndx_raw = symbol.entry.get('st_shndx', 0)
            if isinstance(st_shndx_raw, str):
                # Map special section index strings to integers
                shndx_map = {
                    'SHN_UNDEF': 0,
                    'SHN_ABS': 65521,  # 0xFFF1
                    'SHN_COMMON': 65522,  # 0xFFF2
                    'SHN_XINDEX': 65535,  # 0xFFFF
                }
                symbol_section_index = shndx_map.get(st_shndx_raw, 0)
                symbol_section_index_str = st_shndx_raw.replace('SHN_', '') if st_shndx_raw.startswith('SHN_') else st_shndx_raw
            else:
                symbol_section_index = st_shndx_raw
                symbol_section_index_str = str(st_shndx_raw)

            # Get symbol type and map to enum
            st_type_str = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
            symbol_type_enum = self._map_symbol_type(st_type_str)
            symbol_type_str = st_type_str.replace('STT_', '') if st_type_str.startswith('STT_') else st_type_str

            # Get symbol binding and map to enum
            st_bind_str = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')
            symbol_bind_enum = self._map_symbol_bind(st_bind_str)
            symbol_bind_str = st_bind_str.replace('STB_', '') if st_bind_str.startswith('STB_') else st_bind_str

            # Get symbol visibility and map to enum
            st_vis_str = symbol.entry.get('st_other', {}).get('visibility', 'STV_DEFAULT')
            symbol_visibility_enum = self._map_symbol_visibility(st_vis_str)
            symbol_visibility_str = st_vis_str.replace('STV_', '') if st_vis_str.startswith('STV_') else st_vis_str

            return ELFSymbol(
                symbol_name=symbol_name,
                symbol_value=symbol_value,
                symbol_size=symbol_size,
                symbol_type=symbol_type_enum,
                symbol_type_str=symbol_type_str,
                symbol_bind=symbol_bind_enum,
                symbol_bind_str=symbol_bind_str,
                symbol_visibility=symbol_visibility_enum,
                symbol_visibility_str=symbol_visibility_str,
                symbol_section_index=symbol_section_index,
                symbol_section_index_str=symbol_section_index_str,
                is_dynamic=1 if is_dynamic else 0
            )

        except Exception as e:
            self.log.error(f"Error extracting symbol data: {e}")
            return None

    def _extract_symbols_from_section(self, elf, section_name: str, is_dynamic: bool = False) -> List[Dict]:
        """Extract symbols from a specific symbol table section."""
        symbols = []

        try:
            section = elf.get_section_by_name(section_name)
            if not section:
                self.log.debug(f"No {section_name} section found")
                return symbols

            if not hasattr(section, 'iter_symbols'):
                self.log.debug(f"Section {section_name} is not a symbol table")
                return symbols

            # Iterate through symbols in the section with per-symbol error handling
            for symbol_index, symbol in enumerate(section.iter_symbols()):
                try:
                    symbol_data = self._extract_symbol_data(symbol, is_dynamic)
                    if symbol_data:
                        symbols.append(symbol_data)
                except Exception as e:
                    self.log.warning(f"Error processing symbol {symbol_index} in {section_name}: {e}")
                    # Continue with other symbols

        except Exception as e:
            self.log.error(f"Error extracting symbols from {section_name}: {e}")

        return symbols

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

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

            def extract_data(elf):
                all_symbols = []

                # Extract static symbols from .symtab with individual error handling
                try:
                    static_symbols = self._extract_symbols_from_section(elf, '.symtab', is_dynamic=False)
                    all_symbols.extend(static_symbols)
                    self.log.debug(f"Extracted {len(static_symbols)} static symbols from .symtab")
                except Exception as e:
                    self.log.warning(f"Error extracting static symbols from .symtab: {e}")

                # Extract dynamic symbols from .dynsym with individual error handling
                try:
                    dynamic_symbols = self._extract_symbols_from_section(elf, '.dynsym', is_dynamic=True)
                    all_symbols.extend(dynamic_symbols)
                    self.log.debug(f"Extracted {len(dynamic_symbols)} dynamic symbols from .dynsym")
                except Exception as e:
                    self.log.warning(f"Error extracting dynamic symbols from .dynsym: {e}")

                return all_symbols

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_symbols = result
            return self.elf_symbols

        except Exception as e:
            self.log.error(f"Error extracting ELF symbols {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_symbols
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no symbols (e.g., stripped binary)
                # None is reserved for actual errors

                # Prepare data arrays for all symbols
                data = []
                current_time = datetime.now(timezone.utc)
                for symbol in self.elf_symbols:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        symbol.symbol_name,
                        symbol.symbol_value,
                        symbol.symbol_size,
                        symbol.symbol_type,
                        symbol.symbol_type_str,
                        symbol.symbol_bind,
                        symbol.symbol_bind_str,
                        symbol.symbol_visibility,
                        symbol.symbol_visibility_str,
                        symbol.symbol_section_index,
                        symbol.symbol_section_index_str,
                        symbol.is_dynamic,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'symbol_name', 'symbol_value', 'symbol_size',
                    'symbol_type', 'symbol_type_str',
                    'symbol_bind', 'symbol_bind_str',
                    'symbol_visibility', 'symbol_visibility_str',
                    'symbol_section_index', 'symbol_section_index_str', 'is_dynamic',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt64', 'UInt64',
                    "Enum8('NOTYPE'=0, 'OBJECT'=1, 'FUNC'=2, 'SECTION'=3, 'FILE'=4, 'COMMON'=5, 'TLS'=6)",
                    'LowCardinality(String)',
                    "Enum8('LOCAL'=0, 'GLOBAL'=1, 'WEAK'=2)",
                    'LowCardinality(String)',
                    "Enum8('DEFAULT'=0, 'INTERNAL'=1, 'HIDDEN'=2, 'PROTECTED'=3)",
                    'LowCardinality(String)',
                    'UInt16', 'LowCardinality(String)', 'UInt8',
                    '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_symbols"