Jan Ehrhardt

147 papers A* 2B 24Journal 28Unranked 91
YearRankTypeTitle / Venue / Authors
2026 conf
Bildverarbeitung für die Medizin
Joshua Niemeijer, Jan Ehrhardt, Heinz Handels, Hristina Uzunova
2026 J jnl
CoRR
Jan Boysen, Hristina Uzunova, Heinz Handels, Jan Ehrhardt
2026 conf
Bildverarbeitung für die Medizin
Dominik Hirsch, Jan Ehrhardt, Heinz Handels
2026 conf
Bildverarbeitung für die Medizin
Sofija Engelson, Jan Ehrhardt, Yannic Elser, Malte Maria Sieren, Julia Andresen, Stefanie Schierholz, Tobias Keck, Daniel Drömann, Jörg Barkhausen, Heinz Handels
2026 conf
Bildverarbeitung für die Medizin
Marc S. Seibel, Nele Sophie Brügge, Timo Kepp, Bennet Kahrs, Jan Ehrhardt, Heinz Handels
2025 conf
Bildverarbeitung für die Medizin
Joshua Niemeijer, Jan Ehrhardt, Hristina Uzunova, Heinz Handels
2025 conf
Bildverarbeitung für die Medizin
Marc S. Seibel, Timo Kepp, Hristina Uzunova, Jan Ehrhardt, Heinz Handels
2025 J jnl
Int. J. Comput. Vis.
Sudhanshu Mittal, Joshua Niemeijer, Özgün Çiçek, Maxim Tatarchenko, Jan Ehrhardt, Jörg P. Schäfer, Heinz Handels, Thomas Brox
2025 conf
Bildverarbeitung für die Medizin
Jan Boysen, Hristina Uzunova, Jan Ehrhardt, Heinz Handels
2025 conf
ICCVW
Joshua Niemeijer, Jan Ehrhardt, Heinz Handels, Hristina Uzunova
2025 J jnl
CoRR
Joshua Niemeijer, Jan Ehrhardt, Heinz Handels, Hristina Uzunova
2024 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Hristina Uzunova, Paul Kaftan, Julia Krüger, Roland Opfer, Heinz Handels
2024 conf
MIDL
Julia Andresen, Jan Ehrhardt, Claus von der Burchard, Ayse Tatli, Johann Roider, Heinz Handels, Hristina Uzunova
2024 J jnl
CoRR
Reuben Dorent, Roya Khajavi, Tagwa Idris, Erik Ziegler, Bhanusupriya Somarouthu, Heather Jacene, Ann S. LaCasce, Jonathan Deissler, Jan Ehrhardt, Sofija Engelson, Stefan M. Fischer, Yun Gu, Heinz Handels, Satoshi Kasai, Satoshi Kondo, Klaus H. Maier-Hein, Julia A. Schnabel, Guotai Wang, Litingyu Wang, Tassilo Wald, Guang-Zhong Yang, Hanxiao Zhang, Minghui Zhang, Steven D. Pieper, Gordon J. Harris, Ron Kikinis, Tina Kapur
2024 J jnl
CoRR
Sofija Engelson, Jan Ehrhardt, Timo Kepp, Joshua Niemeijer, Heinz Handels
2024 conf
SASHIMI@MICCAI
Joshua Niemeijer, Jan Ehrhardt, Hristina Uzunova, Heinz Handels
2024 J jnl
CoRR
Joshua Niemeijer, Jan Ehrhardt, Hristina Uzunova, Heinz Handels
2023 conf
MLMI@MICCAI (1)
Jan Ehrhardt, Heinz Handels
2023 conf
Computer-Aided Diagnosis
Joshua Niemeijer, Jan Ehrhardt, Timo Kepp, Jörg P. Schäfer, Heinz Handels
2022 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Hristina Uzunova, Matthias Wilms, Nils D. Forkert, Heinz Handels, Jan Ehrhardt
2022 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Heinz Handels, Jan Ehrhardt
2022 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Leonie Basso, Jan Ehrhardt, Heinz Handels
2022 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Julia Andresen, Timo Kepp, Jan Ehrhardt, Claus von der Burchard, Johann Roider, Heinz Handels
2022 conf
Bildverarbeitung für die Medizin
Timo Kepp, Julia Andresen, Helge Sudkamp, Claus von der Burchard, Johann Roider, Gereon Hüttmann, Jan Ehrhardt, Heinz Handels
2022 J jnl
IEEE Trans. Biomed. Eng.
Matthias Wilms, Jan Ehrhardt, Nils D. Forkert
2022 conf
MAD@MICCAI
Hristina Uzunova, Heinz Handels, Jan Ehrhardt
2022 conf
Computer-Aided Diagnosis
Hristina Uzunova, Leonie Basso, Jan Ehrhardt, Heinz Handels
2022 conf
WBIR
Julia Andresen, Timo Kepp, Jan Ehrhardt, Claus von der Burchard, Johann Roider, Heinz Handels
2022 conf
Bildverarbeitung für die Medizin
Julia Andresen, Timo Kepp, Michael Wang-Evers, Jan Ehrhardt, Dieter Manstein, Heinz Handels
2021 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Jan Ehrhardt, Heinz Handels
2021 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Jesse Kruse, Paul Kaftan, Matthias Wilms, Nils D. Forkert, Heinz Handels, Jan Ehrhardt
2021 conf
Bildverarbeitung für die Medizin
Insa Lange, Fabian Jacob, Alex Frydrychowicz, Heinz Handels, Jan Ehrhardt
2021 conf
MIDL
Hristina Uzunova, Heinz Handels, Jan Ehrhardt
2020 conf
MICCAI (4)
Matthias Wilms, Jan Ehrhardt, Nils D. Forkert
2020 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Jan Ehrhardt, Fabian Jacob, Alex Frydrychowicz, Heinz Handels
2020 conf
MICCAI (4)
Hristina Uzunova, Jan Ehrhardt, Heinz Handels
2020 J jnl
CoRR
Hristina Uzunova, Jan Ehrhardt, Heinz Handels
2020 J jnl
Comput. Medical Imaging Graph.
Hristina Uzunova, Jan Ehrhardt, Heinz Handels
2020 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Paul Kaftan, Matthias Wilms, Nils D. Forkert, Heinz Handels, Jan Ehrhardt
2020 J jnl
Comput. Vis. Image Underst.
Julia Krüger, Sandra Schultz, Heinz Handels, Jan Ehrhardt
2019 B conf
Image Processing
Julia Krüger, Jan Ehrhardt, Sandra Schultz, Heinz Handels
2019 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Jan Ehrhardt, Timo Kepp, Heinz Handels
2019 B conf
Image Processing
Sandra Schultz, Julia Krüger, Heinz Handels, Jan Ehrhardt
2019 conf
Bildverarbeitung für die Medizin
Nassim Bouteldja, Dorit Merhof, Jan Ehrhardt, Mattias P. Heinrich
2019 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Sandra Schultz, Heinz Handels, Jan Ehrhardt
2019 B conf
Image Processing
Hristina Uzunova, Jan Ehrhardt, Timo Kepp, Heinz Handels
2019 conf
MICCAI (6)
Hristina Uzunova, Jan Ehrhardt, Fabian Jacob, Alex Frydrychowicz, Heinz Handels
2019 J jnl
CoRR
Hristina Uzunova, Jan Ehrhardt, Fabian Jacob, Alex Frydrychowicz, Heinz Handels
2019 conf
ISBI
Timo Kepp, Jan Ehrhardt, Mattias P. Heinrich, Gereon Hüttmann, Heinz Handels
2019 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Hristina Uzunova, Sandra Schultz, Heinz Handels, Jan Ehrhardt
2018 B conf
Image Processing
Sandra Schultz, Heinz Handels, Jan Ehrhardt
2018 conf
Bildverarbeitung für die Medizin
Julia Krüger, Jan Ehrhardt, Heinz Handels
2018 J jnl
IEEE J. Biomed. Health Informatics
Avan Suinesiaputra, Pierre Ablin, Xènia Albà, Martino Alessandrini, Jack Allen, Wenjia Bai, Serkan Çimen, Peter Claes, Brett R. Cowan, Jan D'hooge, Nicolas Duchateau, Jan Ehrhardt, Alejandro F. Frangi, Ali Gooya, Vicente Grau, Karim Lekadir, Allen Lu, Anirban Mukhopadhyay, Ilkay Öksüz, Nripesh Parajuli, Xavier Pennec, Marco Pereañez, Catarina Pinto, Paolo Piras, Marc-Michel Rohé, Daniel Rueckert, Dennis Säring, Maxime Sermesant, Kaleem Siddiqi, Mahdi Tabassian, Luciano Teresi, Sotirios A. Tsaftaris, Matthias Wilms, Alistair A. Young, Xingyu Zhang, Pau Medrano-Gracia
2018 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Heinz Handels, Jan Ehrhardt
2017 conf
Bildverarbeitung für die Medizin
Matthias Wilms, Heinz Handels, Jan Ehrhardt
2017 conf
Bildverarbeitung für die Medizin
Matthias Wilms, Heinz Handels, Jan Ehrhardt
2017 conf
Bildverarbeitung für die Medizin
Nassim Bouteldja, Matthias Wilms, Heinz Handels, Dennis Säring, Jan Ehrhardt
2017 J jnl
Medical Image Anal.
Matthias Wilms, Heinz Handels, Jan Ehrhardt
2017 conf
MICCAI (1)
Matthias Wilms, Heinz Handels, Jan Ehrhardt
2017 conf
Bildverarbeitung für die Medizin
Hristina Uzunova, Heinz Handels, Jan Ehrhardt
2017 J jnl
Medical Image Anal.
Julia Krüger, Jan Ehrhardt, Heinz Handels
2017 conf
MICCAI (1)
Hristina Uzunova, Matthias Wilms, Heinz Handels, Jan Ehrhardt
2017 conf
Bildverarbeitung für die Medizin
Marja Fleitmann, Ole Käferlein, Matthias Wilms, Dennis Säring, Heinz Handels, Jan Ehrhardt
2016 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Fabian Jacob, Heinz Handels, Alex Frydrychowicz
2016 B conf
Image Processing
Julia Krüger, Jan Ehrhardt, Heinz Handels
2016 conf
ECCV (4)
Jan Ehrhardt, Matthias Wilms, Heinz Handels
2015 conf
STACOM@MICCAI
Jan Ehrhardt, Matthias Wilms, Heinz Handels, Dennis Säring
2015 conf
Computer-Aided Diagnosis
Matthias Wilms, Julia Krüger, Mirko Marx, Jan Ehrhardt, Arpad Bischof, Heinz Handels
2015 conf
Bildverarbeitung für die Medizin
Timo Kepp, Jan Ehrhardt, Heinz Handels
2015 A* conf
ICCV
Julia Krüger, Jan Ehrhardt, Heinz Handels
2015 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Alexander Schmidt-Richberg, René Werner, Heinz Handels
2014 B conf
Image Processing
Jan Ehrhardt, Timo Kepp, Alexander Schmidt-Richberg, Heinz Handels
2014 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Julia Krüger, Jan Ehrhardt, Arpad Bischof, Heinz Handels
2014 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Mirko Marx, Jan Ehrhardt, René Werner, Heinz-Peter Schlemmer, Heinz Handels
2014 conf
Image-Guided Procedures
Matthias Wilms, Jan Ehrhardt, René Werner, Mirko Marx, Heinz Handels
2014 B conf
Image Processing
Jan Ehrhardt, Julia Krüger, Heinz Handels
2013 conf
Bildverarbeitung für die Medizin
Mirko Marx, Jan Ehrhardt, René Werner, Heinz-Peter Schlemmer, Heinz Handels
2013 B conf
Image Processing
René Werner, Christine Duscha, Alexander Schmidt-Richberg, Jan Ehrhardt, Heinz Handels
2013 B conf
Image Processing
Julia Krüger, Jan Ehrhardt, Arpad Bischof, Heinz Handels
2013 conf
Bildverarbeitung für die Medizin
Julia Krüger, Jan Ehrhardt, Arpad Bischof, Heinz Handels
2013 B conf
Image Processing
Matthias Wilms, René Werner, Jan Ehrhardt, Alexander Schmidt-Richberg, Maximilian Blendowski, Heinz Handels
2012 conf
MICCAI (2)
Matthias Wilms, Jan Ehrhardt, Heinz Handels
2012 conf
GI-Jahrestagung
René Werner, Jan Ehrhardt, Alexander Schmidt-Richberg, Matthias Wilms, Maximilian Blendowski, Heinz Handels
2012 B conf
Image Processing
Jan Ehrhardt, Julia Krüger, Arpad Bischof, Jörg Barkhausen, Heinz Handels
2012 conf
Bildverarbeitung für die Medizin
Julia Krüger, Jan Ehrhardt, Arpad Bischof, Jörg Barkhausen, Heinz Handels
2012 J jnl
Medical Image Anal.
Alexander Schmidt-Richberg, René Werner, Heinz Handels, Jan Ehrhardt
2012 conf
Bildverarbeitung für die Medizin
Alexander Schmidt-Richberg, Jan Ehrhardt, Matthias Wilms, René Werner, Heinz Handels
2012 conf
WBIR
Alexander Schmidt-Richberg, Jan Ehrhardt, René Werner, Heinz Handels
2012 conf
MICCAI (2)
Alexander Schmidt-Richberg, Jan Ehrhardt, René Werner, Heinz Handels
2012 conf
Image-Guided Procedures
René Werner, Jan Ehrhardt, Alexander Schmidt-Richberg, Heinz Handels
2012 conf
GI-Jahrestagung
Matthias Wilms, Jan Ehrhardt, Heinz Handels
2012 B conf
Image Processing
Alexander Schmidt-Richberg, Jan Ehrhardt, Matthias Wilms, René Werner, Heinz Handels
2011 conf
Bildverarbeitung für die Medizin
Matthias Wilms, Jan Ehrhardt, Heinz Handels
2011 ed.
Bildverarbeitung für die Medizin
Heinz Handels, Jan Ehrhardt, Thomas Martin Deserno, Hans-Peter Meinzer, Thomas Tolxdorff
2011 conf
Bildverarbeitung für die Medizin
Stefan Köhnen, Jan Ehrhardt, Alexander Schmidt-Richberg, Heinz Handels
2011 B conf
Image Processing
Nils Daniel Forkert, Dennis Säring, Till Illies, Jens Fiehler, Jan Ehrhardt, Heinz Handels, Alexander Schmidt-Richberg
2011 J jnl
IEEE Trans. Medical Imaging
Keelin Murphy, Bram van Ginneken, Joseph M. Reinhardt, Sven Kabus, Kai Ding, Xiang Deng, Kunlin Cao, Kaifang Du, Gary E. Christensen, Vincent Garcia, Tom Vercauteren, Nicholas Ayache, Olivier Commowick, Grégoire Malandain, Ben Glocker, Nikos Paragios, Nassir Navab, Vladlena Gorbunova, Jon Sporring, Marleen de Bruijne, Xiao Han, Mattias P. Heinrich, Julia A. Schnabel, Mark Jenkinson, Cristian Lorenz, Marc Modat, Jamie McClelland, Sébastien Ourselin, Sascha E. A. Muenzing, Max A. Viergever, Dante De Nigris, D. Louis Collins, Tal Arbel, Marta Peroni, Rui Li, Gregory C. Sharp, Alexander Schmidt-Richberg, Jan Ehrhardt, René Werner, Dirk Smeets, Dirk Loeckx, Gang Song, Nicholas J. Tustison, Brian B. Avants, James C. Gee, Marius Staring, Stefan Klein, Berend C. Stoel, Martin Urschler, Manuel Werlberger, Jef Vandemeulebroucke, Simon Rit, David Sarrut, Josien P. W. Pluim
2011 B conf
Image Processing
Alexander Schmidt-Richberg, René Werner, Jan Ehrhardt, Jan-Christoph Wolf, Heinz Handels
2011 conf
Bildverarbeitung für die Medizin
Jan-Christoph Wolf, Alexander Schmidt-Richberg, René Werner, Jan Ehrhardt, Heinz Handels
2011 J jnl
IEEE Trans. Medical Imaging
Jan Ehrhardt, René Werner, Alexander Schmidt-Richberg, Heinz Handels
2011 conf
Bildverarbeitung für die Medizin
Nils Daniel Forkert, Alexander Schmidt-Richberg, Jan Ehrhardt, Jens Fiehler, Heinz Handels, Dennis Säring
2010 B conf
Image Processing
Jan Ehrhardt, René Werner, Alexander Schmidt-Richberg, Heinz Handels
2010 conf
Bildverarbeitung für die Medizin
René Werner, Jan-Christoph Wolf, Jan Ehrhardt, Alexander Schmidt-Richberg, Heinz Handels
2010 B conf
Image Processing
Heike Hufnagel, Jan Ehrhardt, Xavier Pennec, Alexander Schmidt-Richberg, Heinz Handels
2010 B conf
Image Processing
Alexander Schmidt-Richberg, Jan Ehrhardt, René Werner, Heinz Handels
2010 J jnl
Int. J. Comput. Assist. Radiol. Surg.
René Werner, Jan Ehrhardt, Alexander Schmidt-Richberg, Anabell Heiß, Heinz Handels
2009 conf
Bildverarbeitung für die Medizin
Michael Schwenke, Matthias Färber, Jan Ehrhardt, Andreas Plaß, Heinz Handels
2009 conf
Bildverarbeitung für die Medizin
René Werner, Jan Ehrhardt, Alexander Schmidt-Richberg, Florian Cremers, Heinz Handels
2009 conf
Bildverarbeitung für die Medizin
Alexander Schmidt-Richberg, Jan Ehrhardt, René Werner, Heinz Handels
2009 conf
MICCAI (1)
Alexander Schmidt-Richberg, Jan Ehrhardt, René Werner, Heinz Handels
2009 B conf
Image Processing
René Werner, Jan Ehrhardt, Alexander Schmidt-Richberg, Heinz Handels
2008 conf
Bildverarbeitung für die Medizin
Heike Hufnagel, Xavier Pennec, Jan Ehrhardt, Nicholas Ayache, Heinz Handels
2008 B conf
Image Processing
Heike Hufnagel, Xavier Pennec, Jan Ehrhardt, Nicholas Ayache, Heinz Handels
2008 conf
Bildverarbeitung für die Medizin
René Werner, Jan Ehrhardt, Rainer Schmidt, Heinz Handels
2008 conf
VCBM
Jan Ehrhardt, René Werner, Alexander Schmidt-Richberg, Benny Schulz, Heinz Handels
2008 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Heike Hufnagel, Xavier Pennec, Jan Ehrhardt, Nicholas Ayache, Heinz Handels
2008 B conf
Image Processing
Jan Ehrhardt, Alexander Schmidt-Richberg, Heinz Handels
2008 conf
Bildverarbeitung für die Medizin
Alexander Schmidt-Richberg, Jan Ehrhardt, Heinz Handels
2007 J jnl
Int. J. Medical Informatics
Heinz Handels, René Werner, Rainer Schmidt, Thorsten Frenzel, Wei Lu, Daniel Low, Jan Ehrhardt
2007 A* conf
ICCV
Jan Ehrhardt, Alexander Schmidt-Richberg, Heinz Handels
2007 B conf
Image Processing
Jan Ehrhardt, René Werner, Thorsten Frenzel, Wei Lu, Daniel Low, Heinz Handels
2007 conf
Bildverarbeitung für die Medizin
Kai Bestmann, Jan Ehrhardt, Daniel Briem, Johannes Rüger, Stefan Müller, Heinz Handels
2007 J jnl
Comput. Medical Imaging Graph.
Matthias Färber, Jan Ehrhardt, Heinz Handels
2007 conf
Bildverarbeitung für die Medizin
Heike Hufnagel, Xavier Pennec, Jan Ehrhardt, Heinz Handels, Nicholas Ayache
2007 conf
MICCAI (1)
Heike Hufnagel, Xavier Pennec, Jan Ehrhardt, Heinz Handels, Nicholas Ayache
2006 conf
Bildverarbeitung für die Medizin
Dennis Säring, Jan Ehrhardt, Alexander Stork, M. Bansmann, Gunnar Lund, Heinz Handels
2006 ed.
Bildverarbeitung für die Medizin
Heinz Handels, Jan Ehrhardt, Alexander Horsch, Hans-Peter Meinzer, Thomas Tolxdorff
2006 conf
MIE
Heinz Handels, René Werner, Thorsten Frenzel, Dennis Säring, Wei Lu, Daniel Low, Jan Ehrhardt
2006 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Dennis Säring, Heinz Handels
2006 B conf
Image Processing
Jan Ehrhardt, Dennis Säring, Heinz Handels
2006 B conf
Image Processing
Jan Ehrhardt, René Werner, Thorsten Frenzel, Dennis Säring, Wei Lu, Daniel Low, Heinz Handels
2006 conf
Bildverarbeitung für die Medizin
René Werner, Jan Ehrhardt, Thorsten Frenzel, Dennis Säring, Daniel Low, Heinz Handels
2005 conf
Bildverarbeitung für die Medizin
Matthias Färber, Jan Ehrhardt, Siegfried J. Pöppl, Heinz Handels
2004 conf
Bildverarbeitung für die Medizin
Dennis Säring, Jan Ehrhardt, Heinz Handels, Siegfried J. Pöppl
2003 conf
MICCAI (1)
Jan Ehrhardt, Heinz Handels, Bernd Strathmann, Thomas Malina, Werner Plötz, Siegfried J. Pöppl
2003 conf
CARS
Jan Ehrhardt, Heinz Handels, Siegfried J. Pöppl
2003 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Heinz Handels, Siegfried J. Pöppl
2003 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Thomas Malina, Heinz Handels, Bernd Strathmann, Werner Plötz, Siegfried J. Pöppl
2002 conf
Bildverarbeitung für die Medizin
Ute von Jan, Jan Ehrhardt, Stefan Maas, Heinrich M. Overhoff
2001 conf
CARS
Heinz Handels, Jan Ehrhardt, Bernd Strathmann, Werner Plötz, Siegfried J. Pöppl
2001 J jnl
Int. J. Medical Informatics
Jan Ehrhardt, Heinz Handels, Thomas Malina, Bernd Strathmann, Werner Plötz, Siegfried J. Pöppl
2001 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Heinz Handels, Thomas Malina, Bernd Strathmann, Werner Plötz, Siegfried J. Pöppl
2000 conf
Bildverarbeitung für die Medizin
Jan Ehrhardt, Heinz Handels, Werner Plötz, Siegfried J. Pöppl
2000 J jnl
Int. J. Medical Informatics
Heinz Handels, Jan Ehrhardt, Werner Plötz, Siegfried J. Pöppl
1999 B conf
Image Processing
Heinrich Martin Overhoff, André Mastmeyer, Jan Ehrhardt
1999 conf
MIE
Heinz Handels, Jan Ehrhardt, Werner Plötz, Siegfried J. Pöppl
1999 conf
Bildverarbeitung für die Medizin
Heinz Handels, Jan Ehrhardt, P. Peters, Werner Plötz, Siegfried J. Pöppl
redb/extractors/elf_extractors/elf_features.py
← Index redb/extractors/elf_extractors/elf_features.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

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 ELFFeatures


class ELFFeaturesExtractor(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_features = None
        self.elastic_index = self.index_prefix + "-elf_features"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _extract_header_data(self):
        """Extract ELF header data using pyelftools."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        def extract_header(elf):
            # Initialize result with safe defaults
            result = {
                'ei_class': 0, 'ei_data': 0, 'ei_version': 0, 'ei_osabi': 0, 'ei_abiversion': 0,
                'e_type': 0, 'e_machine': 0, 'e_version': 0, 'e_entry': 0, 'e_flags': 0,
                'ei_class_str': 'unknown', 'ei_data_str': 'unknown', 'ei_osabi_str': 'unknown',
                'e_type_str': 'unknown', 'e_machine_str': 'unknown'
            }

            # Try to get the main header - if this fails, we can't extract anything
            try:
                header = elf.header
            except Exception as e:
                self.log.warning(f"Could not access ELF header: {e}")
                return result

            # Try to get e_ident section
            ident = None
            try:
                ident = header.get('e_ident', {})
            except Exception as e:
                self.log.warning(f"Could not access e_ident: {e}")

            # Extract EI_CLASS (32/64 bit)
            try:
                if ident:
                    ei_class_raw = ident.get('EI_CLASS', 'ELFCLASSNONE')
                    result['ei_class'] = 2 if ei_class_raw == 'ELFCLASS64' else 1 if ei_class_raw == 'ELFCLASS32' else 0
                    result['ei_class_str'] = '64-bit' if ei_class_raw == 'ELFCLASS64' else '32-bit' if ei_class_raw == 'ELFCLASS32' else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_CLASS: {e}")

            # Extract EI_DATA (endianness)
            try:
                if ident:
                    ei_data_raw = ident.get('EI_DATA', 'ELFDATANONE')
                    result['ei_data'] = 1 if ei_data_raw == 'ELFDATA2LSB' else 2 if ei_data_raw == 'ELFDATA2MSB' else 0
                    result['ei_data_str'] = 'Little-endian' if ei_data_raw == 'ELFDATA2LSB' else 'Big-endian' if ei_data_raw == 'ELFDATA2MSB' else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_DATA: {e}")

            # Extract EI_VERSION
            try:
                if ident:
                    ei_version_raw = ident.get('EI_VERSION', 0)
                    # Convert string like 'EV_CURRENT' to integer
                    if isinstance(ei_version_raw, str):
                        version_map = {'EV_NONE': 0, 'EV_CURRENT': 1}
                        result['ei_version'] = version_map.get(ei_version_raw, 1)
                    else:
                        result['ei_version'] = ei_version_raw
            except Exception as e:
                self.log.warning(f"Could not extract EI_VERSION: {e}")

            # Extract EI_OSABI
            try:
                if ident:
                    ei_osabi_raw = ident.get('EI_OSABI', 'ELFOSABI_SYSV')
                    osabi_map = {
                        'ELFOSABI_SYSV': 0, 'ELFOSABI_HPUX': 1, 'ELFOSABI_NETBSD': 2,
                        'ELFOSABI_LINUX': 3, 'ELFOSABI_SOLARIS': 6, 'ELFOSABI_FREEBSD': 9
                    }
                    result['ei_osabi'] = osabi_map.get(ei_osabi_raw, 0)
                    result['ei_osabi_str'] = ei_osabi_raw.replace('ELFOSABI_', '') if ei_osabi_raw and ei_osabi_raw.startswith('ELFOSABI_') else str(ei_osabi_raw) if ei_osabi_raw else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract EI_OSABI: {e}")

            # Extract EI_ABIVERSION
            try:
                if ident:
                    result['ei_abiversion'] = ident.get('EI_ABIVERSION', 0)
            except Exception as e:
                self.log.warning(f"Could not extract EI_ABIVERSION: {e}")

            # Extract e_type (file type)
            try:
                e_type_raw = header.get('e_type', 'ET_NONE')
                type_map = {
                    'ET_NONE': 0, 'ET_REL': 1, 'ET_EXEC': 2, 'ET_DYN': 3, 'ET_CORE': 4
                }
                result['e_type'] = type_map.get(e_type_raw, 0)
                result['e_type_str'] = e_type_raw.replace('ET_', '') if e_type_raw and e_type_raw.startswith('ET_') else str(e_type_raw) if e_type_raw else 'unknown'
            except Exception as e:
                self.log.warning(f"Could not extract e_type: {e}")

            # Extract e_machine (architecture)
            try:
                e_machine_raw = header.get('e_machine', 0)
                # Map machine strings to integers and human-readable names
                # https://github.com/eliben/pyelftools/blob/main/elftools/elf/enums.py
                # https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf-em.h
                # https://refspecs.linuxfoundation.org/elf/elf.pdf
                machine_int_map = {
                    'EM_NONE': 0, 'EM_M32': 1, 'EM_SPARC': 2, 'EM_386': 3,
                    'EM_68K': 4, 'EM_88K': 5, 'EM_860': 7, 'EM_MIPS': 8,
                    'EM_S370': 9, 'EM_MIPS_RS3_LE': 10, 'EM_PARISC': 15,
                    'EM_VPP500': 17, 'EM_SPARC32PLUS': 18, 'EM_960': 19,
                    'EM_PPC': 20, 'EM_PPC64': 21, 'EM_S390': 22, 'EM_V800': 36,
                    'EM_FR20': 37, 'EM_RH32': 38, 'EM_RCE': 39, 'EM_ARM': 40,
                    'EM_ALPHA': 41, 'EM_SH': 42, 'EM_SPARCV9': 43, 'EM_TRICORE': 44,
                    'EM_ARC': 45, 'EM_H8_300': 46, 'EM_H8_300H': 47, 'EM_H8S': 48,
                    'EM_H8_500': 49, 'EM_IA_64': 50, 'EM_MIPS_X': 51, 'EM_COLDFIRE': 52,
                    'EM_68HC12': 53, 'EM_X86_64': 62, 'EM_AARCH64': 183, 'EM_RISCV': 243,
                }
                machine_str_map = {
                    'EM_386': 'x86', 'EM_X86_64': 'x86_64', 'EM_ARM': 'ARM', 'EM_AARCH64': 'ARM64',
                    'EM_MIPS': 'MIPS', 'EM_PPC': 'PowerPC', 'EM_PPC64': 'PowerPC64',
                    'EM_SPARC': 'SPARC', 'EM_SPARCV9': 'SPARC64', 'EM_RISCV': 'RISC-V',
                    'EM_IA_64': 'IA-64', 'EM_S390': 'S390', 'EM_SH': 'SuperH',
                }
                if isinstance(e_machine_raw, str):
                    result['e_machine'] = machine_int_map.get(e_machine_raw, 0)
                    result['e_machine_str'] = machine_str_map.get(e_machine_raw, e_machine_raw.replace('EM_', '') if e_machine_raw.startswith('EM_') else e_machine_raw)
                else:
                    result['e_machine'] = e_machine_raw
                    result['e_machine_str'] = str(e_machine_raw)
            except Exception as e:
                self.log.warning(f"Could not extract e_machine: {e}")

            # Extract e_version
            try:
                e_version_raw = header.get('e_version', 0)
                # Convert string like 'EV_CURRENT' to integer
                if isinstance(e_version_raw, str):
                    version_map = {'EV_NONE': 0, 'EV_CURRENT': 1}
                    result['e_version'] = version_map.get(e_version_raw, 1)
                else:
                    result['e_version'] = e_version_raw
            except Exception as e:
                self.log.warning(f"Could not extract e_version: {e}")

            # Extract e_entry (entry point)
            try:
                result['e_entry'] = header.get('e_entry', 0)
            except Exception as e:
                self.log.warning(f"Could not extract e_entry: {e}")

            # Extract e_flags
            try:
                result['e_flags'] = header.get('e_flags', 0)
            except Exception as e:
                self.log.warning(f"Could not extract e_flags: {e}")

            return result

        try:
            return self._with_elf_file(extract_header)
        except Exception as e:
            self.log.error(f"Error extracting header data {self.hash.sha256}: {e}")
            return None

    def _count_dynamic_symbols(self):
        """Count symbols in dynamic symbol table."""
        def count_dynsym(elf):
            dynsym_section = elf.get_section_by_name('.dynsym')
            if dynsym_section and hasattr(dynsym_section, 'num_symbols'):
                return dynsym_section.num_symbols()
            return 0

        try:
            result = self._with_elf_file(count_dynsym)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting dynamic symbols: {e}")
            return 0

    def _count_relocations(self):
        """Count total relocations across all sections."""
        def count_relocs(elf):
            reloc_count = 0
            for section in elf.iter_sections():
                if hasattr(section, 'iter_relocations'):
                    try:
                        reloc_count += section.num_relocations()
                    except:
                        # Some sections might not support num_relocations()
                        for _ in section.iter_relocations():
                            reloc_count += 1
            return reloc_count

        try:
            result = self._with_elf_file(count_relocs)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting relocations: {e}")
            return 0

    def _has_gnu_hash(self):
        """Check if GNU hash table is present."""
        def check_gnu_hash(elf):
            gnu_hash_section = elf.get_section_by_name('.gnu.hash')
            return gnu_hash_section is not None

        try:
            result = self._with_elf_file(check_gnu_hash)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking GNU hash: {e}")
            return False

    def _has_fortify(self):
        """Check if binary has fortify source protection."""
        def check_fortify(elf):
            # Look for fortified function symbols
            fortify_symbols = ['__printf_chk', '__sprintf_chk', '__snprintf_chk',
                             '__strcpy_chk', '__strcat_chk', '__memcpy_chk']

            for section in elf.iter_sections():
                if hasattr(section, 'iter_symbols'):
                    for symbol in section.iter_symbols():
                        if symbol.name in fortify_symbols:
                            return True
            return False

        try:
            result = self._with_elf_file(check_fortify)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking fortify: {e}")
            return False

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

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

            # 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

            # Extract header data (now always returns a result, even with defaults)
            header_data = self._extract_header_data()
            if not header_data:
                self.log.error(f"Complete failure to extract any header data for {self.hash.sha256}")
                return None

            # Extract binary properties
            is_64bit = 1 if self._is_64bit() else 0
            is_stripped = 1 if self._is_stripped() else 0
            is_pie = 1 if self._is_pie() else 0
            has_canary = 1 if self._has_stack_protection() else 0
            has_nx = 1 if self._has_nx_bit() else 0
            has_relro = 1 if self._has_relro() else 0
            has_fortify = 1 if self._has_fortify() else 0

            # Extract counts
            number_of_segments = self._count_segments()
            number_of_sections = self._count_sections()
            number_of_symbols = self._count_symbols()
            number_of_dynamic_symbols = self._count_dynamic_symbols()
            number_of_relocations = self._count_relocations()
            number_of_dependencies = len(self._get_dependencies())

            # Extract build information
            build_id = self._get_build_id()
            gnu_hash_present = 1 if self._has_gnu_hash() else 0
            has_debug_info = 1 if self._has_debug_info() else 0

            self.elf_features = ELFFeatures(
                # ELF Header data
                ei_class=header_data['ei_class'],
                ei_data=header_data['ei_data'],
                ei_version=header_data['ei_version'],
                ei_osabi=header_data['ei_osabi'],
                ei_abiversion=header_data['ei_abiversion'],
                e_type=header_data['e_type'],
                e_machine=header_data['e_machine'],
                e_version=header_data['e_version'],
                e_entry=header_data['e_entry'],
                e_flags=header_data['e_flags'],
                # Human readable values
                ei_class_str=header_data['ei_class_str'],
                ei_data_str=header_data['ei_data_str'],
                ei_osabi_str=header_data['ei_osabi_str'],
                e_type_str=header_data['e_type_str'],
                e_machine_str=header_data['e_machine_str'],
                # Binary properties
                is_64bit=is_64bit,
                is_stripped=is_stripped,
                is_pie=is_pie,
                has_canary=has_canary,
                has_nx=has_nx,
                has_relro=has_relro,
                has_fortify=has_fortify,
                # Counts
                number_of_segments=number_of_segments,
                number_of_sections=number_of_sections,
                number_of_symbols=number_of_symbols,
                number_of_dynamic_symbols=number_of_dynamic_symbols,
                number_of_relocations=number_of_relocations,
                number_of_dependencies=number_of_dependencies,
                # Build information
                build_id=build_id,
                gnu_hash_present=gnu_hash_present,
                has_debug_info=has_debug_info,
            )

            return self.elf_features

        except Exception as e:
            self.log.error(f"Error extracting ELF features {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_features
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_features:
                    return None

                # Prepare data array matching the schema
                data = [[
                    self.sha256,
                    self.md5,
                    self.sha1,

                    # ELF Header data
                    self.elf_features.ei_class,
                    self.elf_features.ei_data,
                    self.elf_features.ei_version,
                    self.elf_features.ei_osabi,
                    self.elf_features.ei_abiversion,
                    self.elf_features.e_type,
                    self.elf_features.e_machine,
                    self.elf_features.e_version,
                    self.elf_features.e_entry,
                    self.elf_features.e_flags,

                    # Human readable values
                    self.elf_features.ei_class_str,
                    self.elf_features.ei_data_str,
                    self.elf_features.ei_osabi_str,
                    self.elf_features.e_type_str,
                    self.elf_features.e_machine_str,

                    # Binary properties
                    self.elf_features.is_64bit,
                    self.elf_features.is_stripped,
                    self.elf_features.is_pie,
                    self.elf_features.has_canary,
                    self.elf_features.has_nx,
                    self.elf_features.has_relro,
                    self.elf_features.has_fortify,

                    # Counts
                    self.elf_features.number_of_segments,
                    self.elf_features.number_of_sections,
                    self.elf_features.number_of_symbols,
                    self.elf_features.number_of_dynamic_symbols,
                    self.elf_features.number_of_relocations,
                    self.elf_features.number_of_dependencies,

                    # Build information
                    self.elf_features.build_id,
                    self.elf_features.gnu_hash_present,
                    self.elf_features.has_debug_info,

                    # Analysis metadata
                    datetime.now(timezone.utc)
                ]]

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'ei_class', 'ei_data', 'ei_version', 'ei_osabi', 'ei_abiversion',
                    'e_type', 'e_machine', 'e_version', 'e_entry', 'e_flags',
                    'ei_class_str', 'ei_data_str', 'ei_osabi_str', 'e_type_str', 'e_machine_str',
                    'is_64bit', 'is_stripped', 'is_pie', 'has_canary', 'has_nx', 'has_relro', 'has_fortify',
                    'number_of_segments', 'number_of_sections', 'number_of_symbols',
                    'number_of_dynamic_symbols', 'number_of_relocations', 'number_of_dependencies',
                    'build_id', 'gnu_hash_present', 'has_debug_info',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('32-bit'=1, '64-bit'=2)",
                    "Enum8('Little-endian'=1, 'Big-endian'=2)",
                    'UInt8',
                    "Enum8('SYSV'=0, 'HPUX'=1, 'NETBSD'=2, 'LINUX'=3, 'SOLARIS'=6, 'FREEBSD'=9)",
                    'UInt8',
                    "Enum8('NONE'=0, 'REL'=1, 'EXEC'=2, 'DYN'=3, 'CORE'=4)",
                    'UInt16', 'UInt32', 'UInt64', 'UInt32',
                    'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)',
                    'LowCardinality(String)', 'LowCardinality(String)',
                    'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8', 'UInt8',
                    'UInt16', 'UInt16', 'UInt32', 'UInt32', 'UInt32', 'UInt16',
                    'Nullable(String)', 'UInt8', '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_features"