Nelson Max

50 papers A* 2A 2B 1C 1Misc 1Journal 25Unranked 16
YearRankTypeTitle / Venue / Authors
2023 J jnl
Comput.
Nelson Max
2022 J jnl
Vis. Comput.
Nelson Max
2021 J jnl
Eng. Appl. Artif. Intell.
Shipin Yang, Nelson Max, Shengdong Xie, Lijuan Li, Tingting Zhao
2021 J jnl
Comput. Vis. Media
Namo Podee, Nelson Max, Kei Iwasaki, Yoshinori Dobashi
2019 conf
SIGGRAPH Posters
Namo Podee, Nelson Max, Kei Iwasaki, Yoshinori Dobashi
2018 J jnl
Vis. Comput.
Nelson Max, Tom Duff, Ben Mildenhall, Yajie Yan
2015 conf
CEIG
M. Scott Bishop, Nelson Max
2015 J jnl
Sensors
Thuy Tuong Nguyen, David C. Slaughter, Nelson Max, Julin N. Maloof, Neelima Sinha
2014 conf
Eurographics (Short Papers)
M. Scott Bishop, José Ferrer, Nelson Max
2014 conf
IVAPP
Matt Edmunds, Robert S. Laramee, Rami Malki, Ian Masters, Yingluo Wang, Guoning Chen, Eugene Zhang, Nelson Max
2012 conf
TPCG
Matt Edmunds, Robert S. Laramee, Guoning Chen, Eugene Zhang, Nelson Max
2012 J jnl
Comput. Graph.
Matt Edmunds, Robert S. Laramee, Guoning Chen, Nelson Max, Eugene Zhang, Colin Ware
2011 J jnl
Comput. Graph. Forum
Cheng-Kai Chen, Shi Yan, Hongfeng Yu, Nelson Max, Kwan-Liu Ma
2011 conf
Eurographics (Short Papers)
Matt Edmunds, Tony McLoughlin, Robert S. Laramee, Guoning Chen, Eugene Zhang, Nelson Max
2010 conf
PG (Poster Papers)
Noriaki Shinoyama, Nelson Max
2010 ch.
Scientific Visualization: Advanced Concepts
Nelson Max, Min Chen
2010 J jnl
Comput. Graph. Forum
Shi Yan, Nelson Max, Kwan-Liu Ma
2010 J jnl
IEEE Trans. Vis. Comput. Graph.
Hamish A. Carr, Nelson Max
2009 ch.
Topology-Based Methods in Visualization II
Nelson Max, Tino Weinkauf
2008 conf
SI3D
Antoine Bouthors, Fabrice Neyret, Nelson Max, Eric Bruneton, Cyril Crassin
2008 J jnl
Comput. Graph. Forum
Christian Hofsetz, Nelson Max, R. Bastos
2007 J jnl
J. Graph. Tools
Nelson Max
2007 J jnl
Signal Process. Image Commun.
George Chen, Yang Liu, Nelson Max
2006 J jnl
Comput. Graph. Forum
Yang Liu, George Chen, Nelson Max, Christian Hofsetz, Peter McGuinness
2005 A conf
IEEE Visualization
Hank Childs, Eric Brugger, Kathleen S. Bonnell, Jeremy S. Meredith, Mark C. Miller, Brad Whitlock, Nelson Max
2005 A conf
IEEE Visualization
Bai Xue, Nelson Max, Cristina Siegerist
2005 J jnl
J. Graph. Tools
Eric B. Lum, Kwan-Liu Ma, Nelson Max
2005 conf
SIBGRAPI
Christian Hofsetz, Nelson Max
2005 J jnl
Vis. Comput.
Nelson Max
2004 conf
WSCG
Nelson Max, Greg Schussman, Ryo Miyazaki, Kei Iwasaki, Tomoyuki Nishita
2004 J jnl
IEEE Computer Graphics and Applications
Christian Hofsetz, Kim C. Ng, George Chen, Peter McGuinness, Nelson Max, Yang Liu
2004 J jnl
Presence Teleoperators Virtual Environ.
Christian Hofsetz, George Chen, Nelson Max, Kim C. Ng, Yang Liu, Li Hong, Peter McGuinness
2004 C conf
CW
Koichi Onoue, Nelson Max, Tomoyuki Nishita
2004 conf
WSCG
Yang Liu, George Chen, Nelson Max, Christian Hofsetz, Peter McGuinness
2002 B conf
VRST
George Chen, Li Hong, Kim C. Ng, Peter McGuinness, Christian Hofsetz, Yang Liu, Nelson Max
2002 Misc conf
Visualization and Data Analysis
David F. Wiley, Henry R. Childs, Bernd Hamann, Kenneth I. Joy, Nelson Max
2001 J jnl
J. Graphics, GPU, & Game Tools
Nelson Max
2001 conf
VG
Greg Schussman, Nelson Max
1999 conf
Rendering Techniques
Nelson Max, Oliver Deussen, Brett Keating
1999 J jnl
J. Graphics, GPU, & Game Tools
Nelson Max
1998 J jnl
J. Graphics, GPU, & Game Tools
Nelson Max
1998 conf
SIGGRAPH Electronic Art and Animation Catalog
Nelson Max
1994 conf
CA
Nelson Max
1994 J jnl
IEEE Computer Graphics and Applications
Roger Crawfis, Nelson Max, Barry G. Becker
1993 J jnl
IEEE Computer Graphics and Applications
Nelson Max, Roger Crawfis, Dean Williams
1991 J jnl
CVGIP Graph. Model. Image Process.
Nelson Max
1990 conf
VVS
Nelson Max, Pat Hanrahan, Roger Crawfis
1990 J jnl
Comput. Animat. Virtual Worlds
Nelson Max, Nobuhiko Hayashi, Takeyuki Wakabayashi
1983 A* conf
SIGGRAPH
Charles A. Csuri, James F. Blinn, Julián Gómez, Nelson Max, William T. Reeves
1980 A* conf
SIGGRAPH
Nelson Max, John Blunden
redb/extractors/elf_extractors/elf_relocations.py
← Index redb/extractors/elf_extractors/elf_relocations.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 ELFRelocation


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

    def _get_relocation_type_string(self, reloc_type: int, machine_arch: str) -> str:
        """Convert relocation type number to human-readable string based on architecture."""
        # This is a simplified mapping - real implementation would need comprehensive
        # architecture-specific relocation type mappings

        common_types = {
            0: "R_NONE",
            1: "R_DIRECT",
            2: "R_PC_RELATIVE",
            3: "R_GOT",
            4: "R_PLT",
            5: "R_COPY",
            6: "R_GLOB_DAT",
            7: "R_JMP_SLOT",
            8: "R_RELATIVE"
        }

        # Architecture-specific mappings could be added here
        if machine_arch == "x86_64":
            x86_64_types = {
                1: "R_X86_64_64",
                2: "R_X86_64_PC32",
                3: "R_X86_64_GOT32",
                4: "R_X86_64_PLT32",
                5: "R_X86_64_COPY",
                6: "R_X86_64_GLOB_DAT",
                7: "R_X86_64_JUMP_SLOT",
                8: "R_X86_64_RELATIVE"
            }
            return x86_64_types.get(reloc_type, f"R_X86_64_{reloc_type}")
        elif machine_arch == "x86":
            i386_types = {
                1: "R_386_32",
                2: "R_386_PC32",
                3: "R_386_GOT32",
                4: "R_386_PLT32",
                5: "R_386_COPY",
                6: "R_386_GLOB_DAT",
                7: "R_386_JMP_SLOT",
                8: "R_386_RELATIVE"
            }
            return i386_types.get(reloc_type, f"R_386_{reloc_type}")

        return common_types.get(reloc_type, f"R_UNKNOWN_{reloc_type}")

    def _extract_relocation_data(self, relocation, section_name: str, machine_arch: str) -> Dict:
        """Extract data from a single relocation entry."""
        try:
            # Get relocation offset
            relocation_offset = relocation.entry.get('r_offset', 0)

            # Get relocation type
            relocation_type = relocation.entry.get('r_info_type', 0)

            # Get symbol index
            relocation_symbol_index = relocation.entry.get('r_info_sym', 0)

            # Get addend (only present in RELA sections)
            relocation_addend = None
            if hasattr(relocation.entry, 'r_addend'):
                relocation_addend = relocation.entry.get('r_addend', 0)

            # Get symbol name if available
            relocation_symbol_name = ""
            if hasattr(relocation, 'symbol') and relocation.symbol:
                relocation_symbol_name = relocation.symbol.name or f"<symbol_{relocation_symbol_index}>"
            else:
                relocation_symbol_name = f"<symbol_{relocation_symbol_index}>"

            # Get type string mapping
            relocation_type_str = self._get_relocation_type_string(relocation_type, machine_arch)

            return ELFRelocation(
                relocation_offset=relocation_offset,
                relocation_type=relocation_type,
                relocation_type_str=relocation_type_str,
                relocation_symbol_index=relocation_symbol_index,
                relocation_symbol_name=relocation_symbol_name,
                relocation_section=section_name,
                relocation_addend=relocation_addend
            )

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

    def _extract_relocations_from_section(self, section, machine_arch: str) -> List[Dict]:
        """Extract all relocations from a relocation section."""
        relocations = []

        try:
            if not hasattr(section, 'iter_relocations'):
                return relocations

            section_name = section.name or f"<unnamed_section>"

            for relocation in section.iter_relocations():
                reloc_data = self._extract_relocation_data(relocation, section_name, machine_arch)
                if reloc_data:
                    relocations.append(reloc_data)

        except Exception as e:
            self.log.error(f"Error extracting relocations from section {section.name}: {e}")

        return relocations

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

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

            def extract_data(elf):
                # Get architecture for relocation type mapping
                machine_arch = self._get_architecture()
                all_relocations = []

                # Iterate through all sections looking for relocation sections with per-section error handling
                for section_index, section in enumerate(elf.iter_sections()):
                    try:
                        # Check if this is a relocation section (.rel or .rela)
                        if (section.name and
                            (section.name.startswith('.rel') or section.name.startswith('.rela')) and
                            hasattr(section, 'iter_relocations')):

                            section_relocations = self._extract_relocations_from_section(section, machine_arch)
                            all_relocations.extend(section_relocations)
                            self.log.debug(f"Extracted {len(section_relocations)} relocations from section {section.name}")
                    except Exception as e:
                        section_name = getattr(section, 'name', f'section_{section_index}')
                        self.log.warning(f"Error processing relocation section {section_name}: {e}")
                        # Continue processing other sections

                return all_relocations

            if not self._is_elf_file():
                return None

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

            self.elf_relocations = result
            return self.elf_relocations

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

                # Prepare data arrays for all relocations
                data = []
                current_time = datetime.now(timezone.utc)
                for reloc in self.elf_relocations:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        reloc.relocation_offset,
                        reloc.relocation_type,
                        reloc.relocation_type_str,
                        reloc.relocation_symbol_index,
                        reloc.relocation_symbol_name,
                        reloc.relocation_addend,
                        reloc.relocation_section,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'relocation_offset', 'relocation_type', 'relocation_type_str',
                    'relocation_symbol_index', 'relocation_symbol_name',
                    'relocation_addend', 'relocation_section',
                    'analysis_date'
                ]

                if not data:
                    return None

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'UInt64', 'UInt32', 'LowCardinality(String)',
                    'UInt32', 'LowCardinality(String)',
                    'Nullable(Int64)', 'LowCardinality(String)',
                    'DateTime64(3, \'UTC\')'
                ]

                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_relocations"