Oliver Beuing

43 papers B 1Journal 26Unranked 16
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Negar Chabi, Alfredo Illanes, Oliver Beuing, Daniel Behme, Bernhard Preim, Sylvia Saalfeld
2022 conf
Bildverarbeitung für die Medizin
Annika Niemann, Bernhard Preim, Oliver Beuing, Sylvia Saalfeld
2022 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Negar Chabi, Domenico Iuso, Oliver Beuing, Bernhard Preim, Sylvia Saalfeld
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Sarah Mittenentzwei, Oliver Beuing, Belal Neyazi, I. Erol Sandalcioglu, Naomi Larsen, Bernhard Preim, Sylvia Saalfeld
2021 J jnl
Comput. Methods Programs Biomed.
Lisa Schneider, Annika Niemann, Oliver Beuing, Bernhard Preim, Sylvia Saalfeld
2021 conf
EuroVis (Dirk Bartz Prize)
Benjamin Behrendt, Wito Engelke, Philipp Berg, Oliver Beuing, Ingrid Hotz, Bernhard Preim, Sylvia Saalfeld
2020 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Lena Spitz, Uli Niemann, Oliver Beuing, Belal Neyazi, I. Erol Sandalcioglu, Bernhard Preim, Sylvia Saalfeld
2020 J jnl
CoRR
Lisa Schneider, Annika Niemann, Oliver Beuing, Bernhard Preim, Sylvia Saalfeld
2020 conf
Bildverarbeitung für die Medizin
Benjamin Behrendt, Samuel Voß, Oliver Beuing, Bernhard Preim, Philipp Berg, Sylvia Saalfeld
2019 J jnl
IEEE Trans. Vis. Comput. Graph.
Monique Meuschke, Steffen Oeltze-Jafra, Oliver Beuing, Bernhard Preim, Kai Lawonn
2019 conf
VCBM
Benjamin Behrendt, Wito Engelke, Philipp Berg, Oliver Beuing, Bernhard Preim, Ingrid Hotz, Sylvia Saalfeld
2019 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Sylvia Saalfeld, Samuel Voß, Oliver Beuing, Bernhard Preim, Philipp Berg
2019 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Philipp Berg, Samuel Voß, Gábor Janiga, Sylvia Saalfeld, Aslak Wigdahl Bergersen, Kristian Valen-Sendstad, Jan Brüning, Leonid Goubergrits, Andreas Spuler, Tin Lok Chiu, Anderson Chun On Tsang, Gabriele Copelli, Benjamin Csippa, György Paál, Gábor Závodszky, Felicitas J. Detmer, Bong Jae Chung, Juan R. Cebral, Soichiro Fujimura, Hiroyuki Takao, Christof Karmonik, Saba Elias, Nicole M. Cancelliere, Mehdi Najafi, David A. Steinman, Vitor Mendes Pereira, Senol Piskin, Ender A. Finol, Mariya Pravdivtseva, Prasanth Velvaluri, Hamidreza Rajabzadeh-Oghaz, Nikhil Paliwal, Hui Meng, Santhosh Seshadhri, Sreenivas Venguru, Masaaki Shojima, Sergey Sindeev, Sergey Frolov, Yi Qian, Yu-An Wu, Kent D. Carlson, David F. Kallmes, Dan Dragomir-Daescu, Oliver Beuing
2019 J jnl
Comput. Biol. Medicine
Samuel Voß, Oliver Beuing, Gábor Janiga, Philipp Berg
2018 conf
EMBC
Philipp Berg, Livia Radtke, Samuel Voß, Steffen Serowy, Gábor Janiga, Bernhard Preim, Oliver Beuing, Sylvia Saalfeld
2018 J jnl
IEEE Trans. Medical Imaging
Shiras Abdurahman, Robert Frysch, Richard Bismark, Steffen Melnik, Oliver Beuing, Georg Rose
2018 J jnl
Comput. Graph. Forum
Benjamin Behrendt, Philipp Berg, Oliver Beuing, Bernhard Preim, Sylvia Saalfeld
2018 conf
Bildverarbeitung für die Medizin
Samuel Voß, Patrick Saalfeld, Sylvia Saalfeld, Oliver Beuing, Gábor Janiga, Bernhard Preim
2018 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Philipp Berg, Oliver Beuing
2018 B conf
CBMS
Uli Niemann, Philipp Berg, Annika Niemann, Oliver Beuing, Bernhard Preim, Myra Spiliopoulou, Sylvia Saalfeld
2018 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Sylvia Saalfeld, Philipp Berg, Annika Niemann, Maria Luz, Bernhard Preim, Oliver Beuing
2017 conf
Bildverarbeitung für die Medizin
Monique Meuschke, Wito Engelke, Oliver Beuing, Bernhard Preim, Kai Lawonn
2017 J jnl
IEEE Trans. Vis. Comput. Graph.
Monique Meuschke, Samuel Voß, Oliver Beuing, Bernhard Preim, Kai Lawonn
2017 J jnl
Comput. Graph. Forum
Monique Meuschke, Samuel Voß, Oliver Beuing, Bernhard Preim, Kai Lawonn
2017 conf
Eurographics (Dirk Bartz Prize)
Patrick Saalfeld, Steffen Oeltze-Jafra, Sylvia Saalfeld, Uta Preim, Oliver Beuing, Bernhard Preim
2017 J jnl
Comput. Graph.
Patrick Saalfeld, Sylvia Glaßer, Oliver Beuing, Bernhard Preim
2016 conf
3DUI
Patrick Saalfeld, Sylvia Glaßer, Oliver Beuing, Mandy Grundmann, Bernhard Preim
2016 conf
EMBC
Philipp Berg, Samuel Voß, Mathias Becker, Steffen Serowy, Thomas Redel, Gábor Janiga, Martin Skalej, Oliver Beuing
2016 conf
Bildverarbeitung für die Medizin
Sylvia Glaßer, Jan Hirsch, Philipp Berg, Patrick Saalfeld, Oliver Beuing, Gábor Janiga, Bernhard Preim
2016 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Thomas Hoffmann, Sylvia Glaßer, Axel Boese, Knut Brandstädter, Thomas Kalinski, Oliver Beuing, Martin Skalej
2016 J jnl
Comput. Math. Methods Medicine
Samuel Voß, Sylvia Glaßer, Thomas Hoffmann, Oliver Beuing, Simon Weigand, Katja Jachau, Bernhard Preim, Dominique Thévenin, Gábor Janiga, Philipp Berg
2014 conf
CURAC
Antje Hübler, Christian Hansen, Oliver Beuing, Martin Skalej, Bernhard Preim
2013 J jnl
Comput. Graph. Forum
Mathias Neugebauer, Kai Lawonn, Oliver Beuing, Philipp Berg, Gábor Janiga, Bernhard Preim
2013 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Mathias Neugebauer, Kai Lawonn, Oliver Beuing, Bernhard Preim
2013 conf
Eurographics (Dirk Bartz Prize)
Mathias Neugebauer, Rocco Gasteiger, Gábor Janiga, Oliver Beuing, Bernhard Preim
2013 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Axel Boese, Sebastian Gugel, Steffen Serowy, Jonas Purmann, Georg Rose, Oliver Beuing, Martin Skalej, Yiannis Kyriakou, Yu Deuerling-Zheng
2012 conf
ISBI
Clemens M. Hentschke, Klaus D. Tönnies, Oliver Beuing, Rosa Nickl
2012 J jnl
IEEE Trans. Vis. Comput. Graph.
Rocco Gasteiger, Dirk J. Lehmann, Roy van Pelt, Gábor Janiga, Oliver Beuing, Anna Vilanova, Holger Theisel, Bernhard Preim
2012 conf
Computer-Aided Diagnosis
Clemens M. Hentschke, Oliver Beuing, Rosa Nickl, Klaus D. Tönnies
2011 J jnl
Comput. Graph. Forum
Mathias Neugebauer, Gábor Janiga, Oliver Beuing, Martin Skalej, Bernhard Preim
2011 J jnl
IEEE Trans. Vis. Comput. Graph.
Rocco Gasteiger, Mathias Neugebauer, Oliver Beuing, Bernhard Preim
2010 conf
CURAC
Rocco Gasteiger, Mathias Neugebauer, Bernhard Preim, Volker Diehl, Oliver Beuing
2009 J jnl
Comput. Graph. Forum
Mathias Neugebauer, Rocco Gasteiger, Oliver Beuing, Volker Diehl, Martin Skalej, Bernhard Preim
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"