James Pierce

73 papers A* 20A 23B 2Misc 3Journal 12Unranked 12
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Ronda Ringfort-Felner, Judith Dörrenbächer, Chris Elsden, James H. Auger, James Pierce, Richmond Y. Wong, Marc Hassenzahl
2025 A conf
Conference on Designing Interactive Systems
James Pierce, Claire Florence Weizenegger, Robyn Anderson, Hope Terpilowski, Wyatt Olson, Lian Bensadon, Faith Ong, Cobi Stancik
2025 A conf
Conference on Designing Interactive Systems (Companion Volume)
Hyungjun Cho, Jiyeon Amy Seo, Heekyoung Jung, Eunjeong Cheon, Woosuk Seo, Maria Luce Lupetti, James Pierce, Graham Dove
2025 A* conf
CHI
Wyatt Olson, James Pierce
2025 conf
CHI Extended Abstracts
Arne Berger, Stephan Hildebrandt, Albrecht Kurze, William Odom, Tom Jenkins, James Pierce, David J. Chatting, Doenja Oogjes, Sara Nabil, Andy Boucher, William W. Gaver
2025 A conf
Conference on Designing Interactive Systems
James Pierce, Gabrielle Queen, Kristin Tapang
2024 J jnl
CoRR
Richmond Y. Wong, Jason Caleb Valdez, Ashten Alexander, Ariel Chiang, Olivia Quesada, James Pierce
2024 Misc conf
OZCHI
Stephen Snow, Awais Hameed Khan, Ben Matthews, Inmaculada Rodríguez, Audrey Desjardins, Ayanna Seals, Omar Sosa-Tzec, Anh-Ton Tran, James Pierce, Xiangjun Peng, Stephen Viller
2023 A conf
Conference on Designing Interactive Systems
Richmond Y. Wong, Jason Caleb Valdez, Ashten Alexander, Ariel Chiang, Olivia Quesada, James Pierce
2023 conf
CHI Extended Abstracts
Matthew Lee-Smith, Jesse Josua Benjamin, Audrey Desjardins, Mathias Funk, William Odom, Doenja Oogjes, Young-Woo Park, James Pierce, Pedro Sanches, Vasiliki Tsaknaki
2023 A* conf
CHI
Brett A. Halperin, Gary Hsieh, Erin McElroy, James Pierce, Daniela K. Rosner
2023 A* conf
CHI
Jesse Josua Benjamin, Heidi Biggs, Arne Berger, Julija Rukanskaite, Michael B. Heidt, Nick Merrill, James Pierce, Joseph Lindley
2023 J jnl
CoRR
Jesse Josua Benjamin, Heidi Biggs, Arne Berger, Julija Rukanskaite, Michael Heidt, Nick Merrill, James Pierce, Joseph Lindley
2022 A conf
Conference on Designing Interactive Systems
James Pierce, Claire Weizenegger, Parag Nandi, Isha Agarwal, Gwenna Gram, Jade Hurrle, Hannah Liao, Betty Lo, Aaron Park, Aivy Phan, Mark Shumskiy, Grace Sturlaugson
2022 A* conf
CHI
Neilly H. Tan, Richmond Y. Wong, Audrey Desjardins, Sean A. Munson, James Pierce
2022 B conf
Creativity & Cognition
Paulina Yurman, Marie Louise Juul Søndergaard, James Pierce, Nadia Campo Woytuk, Anuradha Venugopal Reddy, Matt Malpass
2021 J jnl
AI Soc.
Anuradha Venugopal Reddy, Iohanna Nicenboim, James Pierce, Elisa Giaccardi
2021 A* conf
CHI
James Pierce
2021 A* conf
CHI
Jesse Josua Benjamin, Arne Berger, Nick Merrill, James Pierce
2021 J jnl
CoRR
Jesse Josua Benjamin, Arne Berger, Nick Merrill, James Pierce
2020 A conf
Conference on Designing Interactive Systems (Companion Volume)
James Pierce
2020 A conf
Conference on Designing Interactive Systems (Companion Volume)
Iohanna Nicenboim, Elisa Giaccardi, Marie Louise Juul Søndergaard, Anuradha Venugopal Reddy, Yolande A. A. Strengers, James Pierce, Johan Redström
2020 A conf
Conference on Designing Interactive Systems (Companion Volume)
James Pierce
2020 A conf
Conference on Designing Interactive Systems (Companion Volume)
Tom Jenkins, William Odom, James Pierce, Kristina Andersen, Andy Boucher, David J. Chatting, William W. Gaver
2020 A* conf
CHI
James Pierce, Richmond Y. Wong, Nick Merrill
2020 conf
CHI Extended Abstracts
Stephen Snow, Awais Hameed Khan, Stephen Viller, Ben Matthews, Scott Heiner, James Pierce, Ewa Luger, Richard Gomer, Dorota Filipczuk
2020 A conf
Conference on Designing Interactive Systems
Robert Soden, Perrine Hamel, David Lallemant, James Pierce
2019 conf
CHI Extended Abstracts
Kristina Andersen, Andy Boucher, David J. Chatting, Audrey Desjardins, Laura Devendorf, William W. Gaver, Tom Jenkins, William Odom, James Pierce, Anna Vallgårda
2019 A* conf
CHI
Laura Devendorf, Kristina Andersen, Daniela K. Rosner, Ron Wakkary, James Pierce
2019 B conf
Creativity & Cognition
James Pierce
2019 A* conf
CHI
James Pierce
2018 A* conf
CHI
James Pierce, Carl DiSalvo
2018 A conf
Conference on Designing Interactive Systems
James Pierce, Sarah E. Fox, Nick Merrill, Richmond Y. Wong, Carl DiSalvo
2018 J jnl
Interactions
William Odom, Tom Jenkins, Kristina Andersen, Bill Gaver, James Pierce, Anna Vallgårda, Andy Boucher, David J. Chatting, Janne van Kollenburg, Kevin Lefeuvre
2018 J jnl
Proc. ACM Hum. Comput. Interact.
James Pierce, Sarah E. Fox, Nick Merrill, Richmond Y. Wong
2018 conf
CHI Extended Abstracts
Kristina Andersen, Laura Devendorf, James Pierce, Ron Wakkary, Daniela K. Rosner
2017 A conf
Conference on Designing Interactive Systems
James Pierce, Carl DiSalvo
2017 J jnl
Proc. ACM Hum. Comput. Interact.
Richmond Y. Wong, Deirdre K. Mulligan, Ellen Van Wyk, James Pierce, John Chuang
2017 A conf
Conference on Designing Interactive Systems
Richmond Y. Wong, Ellen Van Wyk, James Pierce
2017 conf
CHI Extended Abstracts
Tom Jenkins, Kristina Andersen, William W. Gaver, William Odom, James Pierce, Anna Vallgårda
2016 conf
CHI Extended Abstracts
Tom Jenkins, Kristina Andersen, William W. Gaver, William Odom, James Pierce, Anna Vallgårda
2016 A conf
Conference on Designing Interactive Systems
James Pierce
2015 A* conf
CHI
James Pierce, Phoebe Sengers, Tad Hirsch, Tom Jenkins, William W. Gaver, Carl F. DiSalvo
2015 A* conf
CHI
James Pierce, Eric Paulos
2015
James Pierce
2014 A conf
Conference on Designing Interactive Systems
James Pierce, Eric Paulos
2014 A conf
Conference on Designing Interactive Systems
James Pierce
2014 A conf
Conference on Designing Interactive Systems
James Pierce, Eric Paulos
2014 J jnl
Interactions
James Pierce
2013 A* conf
CHI
James Pierce, Eric Paulos
2013 J jnl
ACM Trans. Comput. Hum. Interact.
James Pierce, Yolande A. A. Strengers, Phoebe Sengers, Susanne Bødker
2012 A* conf
CHI
James Pierce, Eric Paulos
2012 A conf
Conference on Designing Interactive Systems
Erik Stolterman, James Pierce
2012 A conf
Conference on Designing Interactive Systems
James Pierce, Eric Paulos
2012 A conf
Conference on Designing Interactive Systems
William Odom, Richard Banks, Abigail Durrant, David S. Kirk, James Pierce
2012 A* conf
CHI
Hrönn Brynjarsdóttir, Maria Håkansson, James Pierce, Eric P. S. Baumer, Carl F. DiSalvo, Phoebe Sengers
2012 A conf
Conference on Designing Interactive Systems
James Pierce, Eric Paulos
2012 A* conf
CHI
James Pierce
2012 conf
CHI Extended Abstracts
Eli Blevis, Elizabeth F. Churchill, William Odom, James Pierce, David Roedl, Ron Wakkary
2011 A* conf
CHI
James Pierce, Eric Paulos
2011 conf
HICSS
Eric Paulos, James Pierce
2011 conf
CHI Extended Abstracts
James Pierce, Hrönn Brynjarsdóttir, Phoebe Sengers, Yolande A. A. Strengers
2011 Misc conf
UbiComp
Stacey Kuznetsov, William Odom, James Pierce, Eric Paulos
2011 A* conf
CHI
James Pierce, Eric Paulos
2011 J jnl
IEEE Pervasive Comput.
Oliver Amft, Richard Medland, Marcus Foth, Petromil Petkov, Joana M. Abreu, Francisco Câmara Pereira, Philip M. Johnson, Robert S. Brewer, James Pierce, Eric Paulos
2010 J jnl
Interactions
Heekyoung Jung, Youngsuk L. Altieri, Jeffrey Bardzell, Jürgen Scheible, James Pierce, Eric Paulos, Ji-Dong Yim, Christopher D. Shaw
2010 A* conf
CHI
James Pierce, Diane J. Schiano, Eric Paulos
2010 A conf
Conference on Designing Interactive Systems
James Pierce, Eric Paulos
2010 A conf
Conference on Designing Interactive Systems
James Pierce, Chloe Fan, Derek Lomas, Gabriela Marcu, Eric Paulos
2009 conf
CHI Extended Abstracts
William Odom, James Pierce
2009 A* conf
CHI
William Odom, James Pierce, Erik Stolterman, Eli Blevis
2008 J jnl
Interactions
James Pierce, David Roedl
2008 Misc conf
OZCHI
James Pierce, William Odom, Eli Blevis
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"