Oliver Grau

54 papers A* 3A 2B 2C 6Journal 14Unranked 21
YearRankTypeTitle / Venue / Authors
2024 J jnl
Commun. ACM
Alejandro Bellogín, Oliver Grau, Stefan Larsson, Gerhard Schimpf, Biswa Sengupta, Gürkan Solmaz
2023 conf
CSCS
Oliver Grau, Korbinian Hagn
2023 J jnl
CoRR
Oliver Grau, Korbinian Hagn
2022 conf
CSCS
Korbinian Hagn, Oliver Grau
2022 conf
ECCV Workshops (5)
Korbinian Hagn, Oliver Grau
2021 conf
CSCS
Korbinian Hagn, Oliver Grau
2020 conf
CSCS
Syed Sha Qutub, Oliver Grau, Korbinian Hagn
2017 conf
3DTV-Conference
Jonas Scheer, Carlos Fernandez de Tejada Quemada, Oliver Grau
2017 C conf
FedCSIS
Daniel Pohl, Daniel Jungmann, Bartosz Taudul, Richard Membarth, Harini Hariharan, Thorsten Herfet, Oliver Grau
2016 B conf
VRST
Daniel Pohl, Oliver Grau
2016 B conf
VRST
Daniel Pohl, Xucong Zhang, Andreas Bulling, Oliver Grau
2016 conf
GCPR
Jonas Scheer, Mario Fritz, Oliver Grau
2016 conf
ECCV Workshops (3)
Abhishek Sharma, Oliver Grau, Mario Fritz
2016 J jnl
CoRR
Abhishek Sharma, Oliver Grau, Mario Fritz
2015 J jnl
Int. J. Comput. Sci. Appl.
Daniel Pohl, Bartosz Taudul, Richard Membarth, Stefan Nickels, Oliver Grau
2015 book
Digital Representations of the Real World
Marcus Andreas Magnor, Oliver Grau, Olga Sorkine-Hornung, Christian Theobalt
2015 A conf
BMVC
Farshad Einabadi, Oliver Grau
2015 conf
CVMP
Jonas Trottnow, Kai Götz, Stefan Seibert, Simon Spielmann, Volker Helzle, Farshad Einabadi, Clemens K. H. Sielaff, Oliver Grau
2015 A* conf
VR
Daniel Pohl, Timo Bolkart, Stefan Nickels, Oliver Grau
2015 ch.
Digital Representations of the Real World
Volker Helzle, Oliver Grau, Thomas Knop
2014 C conf
FedCSIS
Daniel Pohl, Stefan Nickels, Ram Nalla, Oliver Grau
2014 A conf
BMVC
Walon Wei-Chen Chiu, Gregory Johnson, Daniel McCulley, Oliver Grau, Mario Fritz
2013 J jnl
IEEE Multim.
Darren Cosker, Peter Eisert, Oliver Grau, Peter J. B. Hancock, Jonathan McKinnell, Eng-Jon Ong
2013 conf
SIGGRAPH ASIA Posters
Jeni Maleshkova, Matthew Purver, Oliver Grau, Julien Pansiot
2013 J jnl
Dagstuhl Reports
Oliver Grau, Marcus A. Magnor, Olga Sorkine-Hornung, Christian Theobalt
2012 ed.
CVMP
Oliver Grau
2012 J jnl
Comput. Graph. Forum
Miguel Granados, James Tompkin, Kwang In Kim, Oliver Grau, Jan Kautz, Christian Theobalt
2012 conf
CVMP
Oliver Grau, Julien Pansiot
2011 J jnl
IEEE Trans. Broadcast.
Adrian Hilton, Jean-Yves Guillemaut, Joe Kilner, Oliver Grau, Graham A. Thomas
2011 J jnl
IEEE Trans. Broadcast.
Oliver Grau, Thierry Borel, Peter Kauff, Aljoscha Smolic, Ralf Tanger
2011 J jnl
IEEE Trans. Broadcast.
Bogumil Bartczak, Patrick Vandewalle, Oliver Grau, Gérard Briand, Jérôme Fournier, Paul Kerbiriou, Michael Murdoch, Marcus Müller, Rocco Goris, Reinhard Koch, René J. van der Vleuten
2011 conf
ICCV Workshops
Oliver Grau
2011 ch.
Visual Analysis of Humans
Oliver Grau
2011 A* conf
ISMAR
Oliver Grau
2010 J jnl
J. Virtual Real. Broadcast.
Oliver Grau, Jim Easterbrook
2010 ch.
Image and Geometry Processing for 3-D Cinematography
Adrian Hilton, Jean-Yves Guillemaut, Joe Kilner, Oliver Grau, Graham A. Thomas
2010 J jnl
J. Virtual Real. Broadcast.
Peter Stroia-Williams, Adrian Hilton, Oliver Grau
2010 conf
EVA
Oliver Grau
2009 J jnl
Computer
Graham A. Thomas, Oliver Grau
2007 conf
3DIM
Jean-Yves Guillemaut, Adrian Hilton, Jonathan Starck, Joe Kilner, Oliver Grau
2007 conf
3DIM
Joe Kilner, Jonathan Starck, Adrian Hilton, Oliver Grau
2006 conf
DAGM-Symposium
Oliver Grau
2004 C conf
MMSP
Oliver Grau
2004 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Oliver Grau, T. Pullen, Graham A. Thomas
2003 A* conf
SIGGRAPH
Oliver Grau, M. Price, Graham A. Thomas
2003 C conf
VCIP
Oliver Grau
2003
Oliver Grau
2002 conf
3DPVT
Graham A. Thomas, Oliver Grau
2002 conf
3DPVT
Giovanni Bazzoni, Enrico Bianchi, Oliver Grau, Alec Knox, Reinhard Koch, Fabio Lavagetto, Alex Parkinson, Federico Pedersini, Augusto Sarti, Graham A. Thomas, Stefano Tubaro
1998 C conf
Computer Graphics International
Oliver Grau
1997 conf
3DIM
Oliver Grau
1995 conf
DAGM-Symposium
Oliver Grau
1995 C conf
CAIP
Claus-E. Liedtke, Oliver Grau, Stefan Growe
1991 conf
DAGM-Symposium
Oliver Grau, Thomas Gahm
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOExport


class MachOExportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_exports"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_EXPORT.value

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'UInt32', 'Array(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def get_clickhouse_table(self) -> str:
        return "redb_macho_exports"