Rainer Martin

170 papers A 15C 4Misc 45Journal 44Unranked 60
YearRankTypeTitle / Venue / Authors
2025 conf
WASPAA
Luca Becker, Rainer Martin
2025 J jnl
EURASIP J. Adv. Signal Process.
Willem Alexander Klatt, Rainer Martin
2025 J jnl
CoRR
Mareike Daeglau, Stephan Getzmann, Moritz Bender, Janina Fels, Rainer Martin, Alexander Raake, Isabel S. Schiller, Sabine J. Schlittmeier, Katrin Schoenenberg, Felix Stärz, Leon O. H. Kroczek
2025 conf
EUSIPCO
Willem Alexander Klatt, Rainer Martin
2024 conf
SLT
Luca Becker, Philip Pracht, Peter Sertdal, Jil Uboreck, Alexander Bendel, Rainer Martin
2024 C conf
RoboCup
Diana Kleingarn, Dominik Brämer, Rainer Martin
2024 conf
EUSIPCO
Willem Alexander Klatt, Michael Bürger, Rainer Martin, Henning Puder
2024 conf
IWAENC
Maurice Oberhag, Yan Zeng, Rainer Martin
2024 J jnl
IEEE Trans. Signal Process.
Christian Gruber, Gerald Enzner, Rainer Martin
2024 C conf
MMSP
Timm Koppelmann, Rainer Martin
2024 conf
IWAENC
Luca Becker, Kamel Naame, Rainer Martin
2024 conf
MLSP
Rene Glitza, Luca Becker, Rainer Martin
2024 conf
IWAENC
Benjamin Lentz, Rainer Martin
2023 conf
EUSIPCO
Rene Glitza, Luca Becker, Alexandru Nelus, Rainer Martin
2023 A conf
INTERSPEECH
Alan Archer-Boyd, Rainer Martin
2023 A conf
INTERSPEECH
Timm Koppelmann, Semih Agcaer, Rainer Martin
2023 A conf
INTERSPEECH
Maurice Oberhag, Daniel Neudek, Rainer Martin, Tobias Rosenkranz, Henning Puder
2023 J jnl
EURASIP J. Audio Speech Music. Process.
Walter Kellermann, Rainer Martin, Nobutaka Ono
2022 conf
IWAENC
Christian Gruber, Gerald Enzner, Rainer Martin
2022 conf
IWAENC
Luca Becker, Alexandru Nelus, Rene Glitza, Rainer Martin
2022 A conf
INTERSPEECH
Timm Koppelmann, Luca Becker, Alexandru Nelus, Rene Glitza, Lea Schönherr, Rainer Martin
2022 conf
IWAENC
Stefan Thaleiser, Aleksej Chinaev, Rainer Martin, Gerald Enzner
2022 J jnl
IEEE Signal Process. Lett.
Jalal Taghia, Daniel Neudek, Tobias Rosenkranz, Henning Puder, Rainer Martin
2022 Misc conf
ICASSP
Benjamin Lentz, Rainer Martin, Kirsten Oberländer, Christiane Völter
2022 conf
EUSIPCO
Gerald Enzner, Christoph Urbanietz, Rainer Martin
2022 J jnl
Speech Commun.
Benjamin Lentz, Christiane Völter, Rainer Martin
2021 Misc conf
ICASSP
Shengyi Chen, Jalal Taghia, Tai Fei, Uwe Kühnau, Nils Pohl, Rainer Martin
2021 conf
EUSIPCO
Johannes Gauer, Diana Kleingarn, Rainer Martin
2021 Misc conf
ICASSP
Alexandru Nelus, Rene Glitza, Rainer Martin
2021 J jnl
CoRR
Alexandru Nelus, Rene Glitza, Rainer Martin
2021 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Alexandru Nelus, Rainer Martin
2021 A conf
Interspeech
Timm Koppelmann, Alexandru Nelus, Lea Schönherr, Dorothea Kolossa, Rainer Martin
2021 conf
EUSIPCO
Alexandru Nelus, Rene Glitza, Rainer Martin
2021 J jnl
CoRR
Alexandru Nelus, Rene Glitza, Rainer Martin
2020 Misc conf
ICASSP
Luca Becker, Alexandru Nelus, Johannes Gauer, Lars Rudolph, Rainer Martin
2020 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Mehdi Zohourian, Rainer Martin
2020 Misc conf
ICASSP
Benjamin Lentz, Anil M. Nagathil, Johannes Gauer, Rainer Martin
2019 Misc conf
ICASSP
Mehdi Zohourian, Rainer Martin
2019 J jnl
IEEE Signal Process. Mag.
Waldo Nogueira, Anil M. Nagathil, Rainer Martin
2019 conf
EUSIPCO
Semih Agcaer, Rainer Martin
2019 A conf
INTERSPEECH
Alexandru Nelus, Silas Rech, Timm Koppelmann, Henrik Biermann, Rainer Martin
2019 A conf
INTERSPEECH
Alexandru Nelus, Janek Ebbers, Reinhold Haeb-Umbach, Rainer Martin
2019 Misc conf
ICASSP
Alexandru Nelus, Rainer Martin
2019 conf
EUSIPCO
Johannes Gauer, Ekaterina A. Krymova, Denis Belomestny, Rainer Martin
2018 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Dianna Yee, A. Homayoun Kamkar-Parsi, Rainer Martin, Henning Puder
2018 conf
ITG Symposium on Speech Communication
Dianna Yee, Homayoun Kamkar-Parsi, Rainer Martin, Henning Puder
2018 J jnl
CoRR
Semih Agcaer, Rainer Martin
2018 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Mehdi Zohourian, Gerald Enzner, Rainer Martin
2018 Misc conf
ICASSP
Johannes Gauer, Anil M. Nagathil, Rainer Martin
2018 Misc conf
ICASSP
Mehdi Zohourian, Rainer Martin
2018 conf
ITG Symposium on Speech Communication
Alexandru Nelus, Rainer Martin
2018 conf
IWAENC
Sebastian Gergen, Rainer Martin, Nilesh Madhu
2018 conf
ITG Symposium on Speech Communication
Sebastian Gergen, Rainer Martin, Nilesh Madhu
2018 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Hong Yu, Zheng-Hua Tan, Zhanyu Ma, Rainer Martin, Jun Guo
2017 J jnl
EURASIP J. Audio Speech Music. Process.
Klaus Friedrichs, Nadja Bauer, Rainer Martin, Claus Weihs
2017 Misc conf
ICASSP
Anil M. Nagathil, Jan-Willem Schlattmann, Katrin Neumann, Rainer Martin
2017 C conf
MMSP
Alexandru Nelus, Sebastian Gergen, Rainer Martin
2017 conf
EUSIPCO
Mehdi Zohourian, Rainer Martin, Nilesh Madhu
2017 Misc conf
ICASSP
Ekaterina A. Krymova, Anil M. Nagathil, Denis Belomestny, Rainer Martin
2016 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Jalal Taghia, Rainer Martin
2016 conf
ITG Symposium on Speech Communication
Dianna Yee, A. Homayoun Kamkar-Parsi, Rainer Martin, Henning Puder
2016 Misc conf
ICASSP
Dianna Yee, A. Homayoun Kamkar-Parsi, Henning Puder, Rainer Martin
2016 conf
IWAENC
Jalal Taghia, Dorothea Kolossa, Rainer Martin
2016 Misc conf
ICASSP
Mehdi Zohourian, Rainer Martin
2016 Misc conf
ICASSP
Alexander Schasse, Rainer Martin, Ulrich Kornagel, Eghart Fischer, Henning Puder
2016 conf
ITG Symposium on Speech Communication
Sebastian Gergen, Rainer Martin
2016 conf
ITG Symposium on Speech Communication
Mehdi Zohourian, Gerald Enzner, Rainer Martin
2016 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Anil M. Nagathil, Claus Weihs, Rainer Martin
2016 conf
ITG Symposium on Speech Communication
Alexandru Nelus, Sebastian Gergen, Jalal Taghia, Rainer Martin
2015 Misc conf
ICASSP
Rainer Martin, Masoumeh Azarpour, Gerald Enzner
2015 J jnl
Signal Process.
Sebastian Gergen, Anil M. Nagathil, Rainer Martin
2015 Misc conf
ICASSP
Mehdi Zohourian, Alan Archer-Boyd, Rainer Martin
2015 conf
EUSIPCO
Semih Agcaer, Anton Schlesinger, Falk-Martin Hoffmann, Rainer Martin
2015 A conf
INTERSPEECH
Sebastian Gergen, Anil M. Nagathil, Rainer Martin
2015 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Alexander Schasse, Timo Gerkmann, Rainer Martin, Wolfgang Sörgel, Thomas Pilgrim, Henning Puder
2014 conf
HSCMA
Nilesh Madhu, Rainer Martin, Heinz-Werner Rehn, Sebastian Gergen, A. Fischer
2014 Misc conf
ICASSP
Jalal Taghia, Rainer Martin
2014 Misc conf
ICASSP
Masoumeh Azarpour, Gerald Enzner, Rainer Martin
2014 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Alexander Schasse, Rainer Martin
2014 conf
ITG Symposium on Speech Communication
Sebastian Gergen, Rainer Martin
2014 Misc conf
ICASSP
Zhanyu Ma, Rainer Martin, Jun Guo, Honggang Zhang
2014 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Jalal Taghia, Rainer Martin
2014 J jnl
Signal Process.
Yuheng He, Rainer Martin, Attila Michael Bilgic
2014 Misc conf
ACSSC
Gerald Enzner, Rainer Martin, Peter Vary
2014 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Dominic Schmid, Gerald Enzner, Sarmad Malik, Dorothea Kolossa, Rainer Martin
2013 Misc conf
ICASSP
Masoumeh Azarpour, Gerald Enzner, Rainer Martin
2013 Misc conf
ICASSP
Sebastian Gergen, Anil M. Nagathil, Rainer Martin
2013 J jnl
IEEE Trans. Speech Audio Process.
Robert M. Nickel, Ramón Fernandez Astudillo, Dorothea Kolossa, Rainer Martin
2013 Misc conf
ICASSP
Jalal Taghia, Rainer Martin, Jalil Taghia, Arne Leijon
2013 conf
WASPAA
Anil M. Nagathil, Rainer Martin
2013 Misc conf
ICASSP
Aleksej Chinaev, Reinhold Haeb-Umbach, Jalal Taghia, Rainer Martin
2013 J jnl
Comput. Speech Lang.
Ramón Fernandez Astudillo, Dorothea Kolossa, Alberto Abad, Steffen Zeiler, Rahim Saeidi, Pejman Mowlaee, João Paulo da Silva Neto, Rainer Martin
2013 conf
WASPAA
DeLiang Wang, Rainer Martin, Peter Vary, Paris Smaragdis
2013 Misc conf
ICASSP
Alexander Schasse, Rainer Martin
2013 C conf
EMO
Igor Vatolkin, Anil M. Nagathil, Wolfgang M. Theimer, Rainer Martin
2013 J jnl
IEEE Signal Process. Lett.
Nasser Mohammadiha, Rainer Martin, Arne Leijon
2013 conf
WASPAA
Rainer Martin
2012 conf
ITG Conference on Speech Communication
Jalal Taghia, Rainer Martin, Jalil Taghia, Arne Leijon
2012 conf
EUSIPCO
Rajyalakshmi Dokku, Rainer Martin
2012 conf
IWAENC
Masoumeh Azarpour, Gerald Enzner, Rainer Martin
2012 conf
ITG Conference on Speech Communication
Alexander Schasse, Rainer Martin, Wolfgang Sörgel, Thomas Pilgrim, Henning Puder
2012 A conf
INTERSPEECH
Dorothea Kolossa, Robert M. Nickel, Steffen Zeiler, Rainer Martin
2012 Misc conf
ICASSP
Robert M. Nickel, Ramón Fernandez Astudillo, Dorothea Kolossa, Steffen Zeiler, Rainer Martin
2012 conf
LVA/ICA
Pejman Mowlaee, Rahim Saeidi, Rainer Martin
2012 conf
IWAENC
Pejman Mowlaee, Rainer Martin
2012 Misc conf
ICASSP
Jalal Taghia, Rainer Martin, Richard C. Hendriks
2012 Misc conf
ICASSP
Christian Borß, Rainer Martin
2012 Misc conf
ICASSP
Anil M. Nagathil, Rainer Martin
2012 A conf
INTERSPEECH
Pejman Mowlaee, Rahim Saeidi, Rainer Martin
2012 conf
IWAENC
Alexander Schasse, Christian Tendyck, Rainer Martin
2012 Misc conf
ICASSP
Pejman Mowlaee, Rahim Saeidi, Mads Græsbøll Christensen, Rainer Martin
2012 ch.
Techniques for Noise Robustness in Automatic Speech Recognition
Rainer Martin, Dorothea Kolossa
2011 J jnl
IEEE Trans. Speech Audio Process.
Nilesh Madhu, Rainer Martin
2011 Misc conf
ICASSP
Václav Bouse, Rainer Martin
2011 Misc conf
ICASSP
Jalal Taghia, Jalil Taghia, Nasser Mohammadiha, Jinqiu Sang, Václav Bouse, Rainer Martin
2011 J jnl
IEEE Trans. Speech Audio Process.
Colin Breithaupt, Rainer Martin
2011 Misc conf
ICASSP
Anil M. Nagathil, Peter Gottel, Rainer Martin
2011 J jnl
IEEE Signal Process. Mag.
Holger Blume, Bernd Bischl, Martin Botteck, Christian Igel, Rainer Martin, Günther Rötter, Günter Rudolph, Wolfgang M. Theimer, Igor Vatolkin, Claus Weihs
2011 conf
EUSIPCO
Robert M. Nickel, Rainer Martin
2010 conf
Sprachkommunikation
Sebastian Gergen, Rainer Martin, Nilesh Madhu
2010 conf
ISSPIT
Yuheng He, Rainer Martin, Attila Michael Bilgic
2010 conf
Sprachkommunikation
Alexander Schasse, Rainer Martin
2010 conf
Sprachkommunikation
Timo Gerkmann, Rainer Martin
2010 conf
EUSIPCO
Alexander Schasse, Rainer Martin
2010 conf
EUSIPCO
Anil M. Nagathil, Timo Gerkmann, Rainer Martin
2010 Misc conf
ICASSP
Dirk Mauler, Rainer Martin
2010 conf
Sprachkommunikation
Václav Bouse, Rainer Martin
2010 Misc conf
ICASSP
Timo Gerkmann, Martin Krawczyk, Rainer Martin
2009 Misc conf
ICASSP
Rainer Martin, Anil M. Nagathil
2009 J jnl
EURASIP J. Adv. Signal Process.
Dirk Mauler, Rainer Martin
2009 Misc conf
ICASSP
Timo Gerkmann, Rainer Martin, Derya Dalga
2009 J jnl
IEEE Trans. Signal Process.
Timo Gerkmann, Rainer Martin
2008 Misc conf
ICASSP
Colin Breithaupt, Timo Gerkmann, Rainer Martin
2008 J jnl
IEEE Trans. Speech Audio Process.
Timo Gerkmann, Colin Breithaupt, Rainer Martin
2008 conf
Mobile HCI
Christian Borß, Rainer Martin
2008 Misc conf
ICASSP
Colin Breithaupt, Martin Krawczyk, Rainer Martin
2008 Misc conf
ICASSP
Nilesh Madhu, Colin Breithaupt, Rainer Martin
2007 conf
EUSIPCO
Dirk Mauler, Rainer Martin
2007 J jnl
IEEE Signal Process. Lett.
Colin Breithaupt, Timo Gerkmann, Rainer Martin
2007 J jnl
IEEE Trans. Speech Audio Process.
Richard C. Hendriks, Rainer Martin
2007 A conf
INTERSPEECH
Dirk Mauler, Anil M. Nagathil, Rainer Martin
2006 J jnl
EURASIP J. Adv. Signal Process.
Sharon Gannot, Jacob Benesty, Jörg Bitzer, Israel Cohen, Simon Doclo, Rainer Martin, Sven Nordholm
2006 J jnl
Signal Process.
Rainer Martin
2006 A conf
INTERSPEECH
Timo Gerkmann, Rainer Martin
2006 A conf
INTERSPEECH
Colin Breithaupt, Rainer Martin
2005 A conf
INTERSPEECH
Nilesh Madhu, Rainer Martin
2005 J jnl
IEEE Trans. Speech Audio Process.
Rainer Martin
2004 J jnl
EURASIP J. Adv. Signal Process.
Rainer Martin, David Malah, Richard V. Cox, Anthony J. Accardi
2003 conf
ICASSP (1)
Colin Breithaupt, Rainer Martin
2002 J jnl
IEEE Trans. Speech Audio Process.
Stefan Gustafsson, Rainer Martin, Peter Jax, Peter Vary
2002 J jnl
Eur. Trans. Telecommun.
Gerald Enzner, Rainer Martin, Peter Vary
2002 Misc conf
ICASSP
Rainer Martin
2002 Misc conf
ICASSP
Gerald Enzner, Rainer Martin, Peter Vary
2001 Misc conf
ICASSP
Rainer Martin, Carsten Hoelper, Ingo Wittke
2001 J jnl
IEEE Trans. Speech Audio Process.
Rainer Martin
2001 A conf
INTERSPEECH
Rainer Martin, Alexey Petrovsky, Thomas Lotter
2001 ch.
Microphone Arrays
Rainer Martin
2000 conf
KONVENS
Peter Jax, Rainer Martin, Peter Vary, Marc Adrat, Imre Varga, Walter A. Frank, Marc Ihle
2000 Misc conf
ICASSP
Rainer Martin, Ingo Wittke, Peter Jax
1999 conf
EUROSPEECH
Rainer Martin, Hong-Goo Kang, Richard V. Cox
1998 J jnl
Signal Process.
Stefan Gustafsson, Rainer Martin, Peter Vary
1997 conf
EUROSPEECH
Stefan Gustafsson, Rainer Martin
1996 conf
EUSIPCO
Rainer Martin, Stefan Gustafsson
1996 conf
EUSIPCO
Rainer Martin, Peter Vary
1996 J jnl
Speech Commun.
Rainer Martin, Stefan Gustafsson
1995 Misc conf
ICASSP
Rainer Martin, Jan Altenhöner
1995 conf
EUROSPEECH
Rainer Martin
1993 conf
EUROSPEECH
Rainer Martin
1988 conf
Simulationstechnik
Reinhold Gebhardt, Rainer Martin, Walter Ameling
1987 conf
ASST
Reinhold Gebhardt, Erik A. Penner, Rainer Martin, Walter Ameling
redb/extractors/pe_extractors/pe_dotnet.py
← Index redb/extractors/pe_extractors/pe_dotnet.py python
import inspect
import pefile
from dotnetfile import DotNetPE

import base64
from hashlib import md5
from pprint import pprint

import magic
import pefile

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PEDotNet
from datetime import datetime, timezone
import json
from typing import Any


class PEDotNetExtractor(PEExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        # self.pe_features = None
        self.elastic_index = self.index_prefix + "-pe_dotnet"
        self.dotnet, self.error = self._generate_dotnetfile_object()
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _decode_assembly_flags(self, flag_value):
        self.log.debug(inspect.currentframe().f_code.co_name)
        ASSEMBLY_FLAGS = {
            0x00000001: "COMIMAGE_FLAGS_ILONLY",
            0x00000002: "COMIMAGE_FLAGS_32BITREQUIRED",
            0x00000004: "COMIMAGE_FLAGS_IL_LIBRARY",
            0x00000008: "COMIMAGE_FLAGS_STRONGNAMESIGNED",
            0x00000010: "COMIMAGE_FLAGS_NATIVE_ENTRYPOINT",
            0x00010000: "COMIMAGE_FLAGS_TRACKDEBUGDATA",
            0x00020000: "COMIMAGE_FLAGS_32BITPREFERRED",
        }
        flags = []
        for bit, name in ASSEMBLY_FLAGS.items():
            if flag_value & bit:
                flags.append(name)
        return flags

    def _normalize_data(self, data):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if isinstance(data, str):
            return {"value": data}
        return data

    def _compute_md5(self, data):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if isinstance(data, str):
            # If it's a string, encode it to first
            return md5(data.encode("raw_unicode_escape")).hexdigest()
        elif not isinstance(data, bytes):
            # If it's neither string nor bytes, convert it to string and then to bytes
            return md5(str(data).encode("raw_unicode_escape")).hexdigest()
        else:
            return md5(data).hexdigest()

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

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        metadata = {}

        if self.error:
            metadata["Corrupted"] = self.error.args[0]
            dotnet = PEDotNet(metadata)
            self.dotnet = dotnet  # Store for later use in prepare_export_data
            return dotnet  # Return the extracted data instead of exporting directly

        metadata["info"] = {}
        try:
            available_tables = self.dotnet.existent_metadata_tables()
        except Exception as e:
            self.log.error(f"Error getting metadata tables for {self.hash.sha256}: {e}")
            available_tables = []
            metadata["info"]["PotentiallyCorrupted"] = True

        # GUID extraction
        try:
            input_string = self.dotnet.guid_stream_guids[0].string_representation
            
            formatted_uuid = (
                f"{input_string[6:8]}{input_string[4:6]}{input_string[2:4]}{input_string[0:2]}"
                f"-{input_string[10:12]}{input_string[8:10]}"
                f"-{input_string[14:16]}{input_string[12:14]}"
                f"-{input_string[16:20]}"
                f"-{input_string[20:]}"
            )
            metadata["info"]["ModuleVersionID"] = formatted_uuid
        except Exception as e:
            self.log.error(f"Error extracting GUID for {self.hash.sha256}: {e}")

        # CLR Version
        try:
            metadata["info"]["CLRversion"] = self.dotnet.get_runtime_target_version()
        except Exception as e:
            self.log.error(f"Error getting CLR version for {self.hash.sha256}: {e}")

        # Module information
        try:
            if self.dotnet.metadata_table_exists("Module"):
                metadata["info"]["AssemblyModuleName"] = self.dotnet.Module.get_module_name()
        except Exception as e:
            self.log.error(f"Error getting module info for {self.hash.sha256}: {e}")

        # Basic properties
        try:
            metadata["info"].update({
                "IsNativeNgenImage": self.dotnet.is_native_image(),
                "IsMixedAssembly": self.dotnet.is_mixed_assembly(),
                "IsWindowsFormsApp": self.dotnet.is_windows_forms_app(),
                "EntryPointToken": self.dotnet.clr_header.EntryPointToken.value,
                "HasNativeEntryPoint": self.dotnet.has_native_entry_point(),
            })
        except Exception as e:
            self.log.error(f"Error getting basic properties for {self.hash.sha256}: {e}")

        # Assembly flags
        try:
            metadata["info"]["AssemblyFlags"] = self._decode_assembly_flags(
                self.dotnet.clr_header.Flags.value
            )
        except Exception as e:
            self.log.error(f"Error getting assembly flags for {self.hash.sha256}: {e}")

        # More Metadata/Info CLR Header
        try:
            metadata["info"]["NumOfStreams"] = self.dotnet.get_number_of_streams()
            # [TODO] The following two on VT are "RVA entry point"
            #  and "Resources va" respectively. To verify.
            metadata["info"][
                "ResourcesDirectoryAddress"
            ] = self.dotnet.clr_header.ResourcesDirectoryAddress.value
            metadata["info"][
                "ResourcesDirectorySize"
            ] = self.dotnet.clr_header.ResourcesDirectorySize.value
            metadata["info"][
                "StrongNameSignatureAddress"
            ] = self.dotnet.clr_header.StrongNameSignatureAddress.value
            metadata["info"][
                "StrongNameSignatureSize"
            ] = self.dotnet.clr_header.StrongNameSignatureSize.value
            metadata["info"][
                "CodeManagerTableAddress"
            ] = self.dotnet.clr_header.CodeManagerTableAddress.value
            metadata["info"][
                "CodeManagerTableSize"
            ] = self.dotnet.clr_header.CodeManagerTableSize.value
            metadata["info"][
                "VTableFixupsAddress"
            ] = self.dotnet.clr_header.VTableFixupsAddress.value
            metadata["info"][
                "VTableFixupsSize"
            ] = self.dotnet.clr_header.VTableFixupsSize.value
            metadata["info"][
                "ExportAddressTableJumpsAddress"
            ] = self.dotnet.clr_header.ExportAddressTableJumpsAddress.value
            metadata["info"][
                "ExportAddressTableJumpsSize"
            ] = self.dotnet.clr_header.ExportAddressTableJumpsSize.value
            metadata["info"][
                "ManagedNativeHeaderAddress"
            ] = self.dotnet.clr_header.ManagedNativeHeaderAddress.value
            metadata["info"][
                "ManagedNativeHeaderSize"
            ] = self.dotnet.clr_header.ManagedNativeHeaderSize.value
        except Exception as e:
            self.log.error(f"Error getting more metadata/info clr header for {self.hash.sha256}: {e}")

        # Streams section
        try:
            metadata["Streams"] = {}
            stream_names = self.dotnet.get_stream_names()
            for name in stream_names:
                indx = stream_names.index(name)
                stream_header = self.dotnet.dotnet_stream_headers[indx]
                stream_address = self.dotnet.dotnet_streams[indx].address
                metadata["Streams"][name] = {}
                metadata["Streams"][name]["raw_name"] = base64.b64encode(
                    stream_header.Name.value
                ).decode()
                # metadata["Streams"][name]["raw_name"] = name
                metadata["Streams"][name]["size"] = stream_header.Size.value
                # Retrieve the stream data directly using the given address and size
                stream_data = self.pe.get_data(stream_address, stream_header.Size.value)
                metadata["Streams"][name]["entropy"] = (
                    "%.2f" % pefile.SectionStructure.entropy_H(self.pe, stream_data)
                )
                metadata["Streams"][name]["md5"] = md5(stream_data).hexdigest()
        except Exception as e:
            self.log.error(f"Error getting streams for {self.hash.sha256}: {e}")

        # ManifestResource
        try:
            metadata["ManifestResource"] = ()
            if "ManifestResource" in available_tables:
                metadata["info"]["HasManifestResource"] = True
                metadata["ManifestResource"] = (
                    self.dotnet.ManifestResource.get_resource_names()
                )
        except Exception as e:
            self.log.error(f"Error getting manifest resource for {self.hash.sha256}: {e}")

        # ExternalAssemblyRef
        try:
            metadata["ExternalAssemblyRef"] = {}
            if "AssemblyRef" in available_tables:
                metadata["ExternalAssemblyRef"][
                    "names"
                ] = self.dotnet.AssemblyRef.get_assemblyref_names()
                metadata["ExternalAssemblyRef"][
                    "cultures"
                ] = self.dotnet.AssemblyRef.get_assemblyref_cultures()
        except Exception as e:
            self.log.error(f"Error getting external assembly ref for {self.hash.sha256}: {e}")

        # AssemblyData
        try:
            metadata["AssemblyData"] = {}
            if "Assembly" in available_tables:
                metadata["AssemblyData"][
                    "name"
                ] = self.dotnet.Assembly.get_assembly_name()
                # It's officially a one-row table, but there are ITW files with more than one row.
                # It stores information about the current assembly. It is documented in ECMA-335.
                assembly_table = self.dotnet.metadata_tables_lookup[
                    "Assembly"
                ].table_rows[0]
                metadata["AssemblyData"][
                    "MajorVersion"
                ] = assembly_table.MajorVersion.value
                metadata["AssemblyData"][
                    "MinorVersion"
                ] = assembly_table.MinorVersion.value
                metadata["AssemblyData"]["hashalgid"] = assembly_table.HashAlgId.value
                metadata["AssemblyData"][
                    "BuildNumber"
                ] = assembly_table.BuildNumber.value
                metadata["AssemblyData"][
                    "RevisionNumber"
                ] = assembly_table.RevisionNumber.value
                metadata["AssemblyData"][
                    "culture"
                ] = self.dotnet.Assembly.get_assembly_culture()
        except Exception as e:
            self.log.error(f"Error getting assembly data for {self.hash.sha256}: {e}")

        # TypeDef handling
        try:
            metadata["TypeDef"] = {}
            if "TypeDef" in available_tables:
                metadata["info"]["HasTypeDef"] = True
                # Get basic type definitions
                try:
                    # Get all types (ANY visibility)
                    type_defs = self.dotnet.TypeDef.get_type_names()
                    metadata["TypeDef"]["names"] = type_defs if type_defs else []
                    
                    # Get detailed type information with methods
                    types_with_methods = self.dotnet.TypeDef.get_type_names_with_methods()
                    if types_with_methods:
                        metadata["TypeDef"]["detailed"] = []
                        for type_info in types_with_methods:
                            type_data = {
                                "type": type_info.Type,
                                "namespace": type_info.Namespace,
                                "flags": type_info.Flags,
                                "methods": []
                            }
                            for method in type_info.Methods:
                                method_data = {
                                    "name": method.Name,
                                    "flags": method.Flags
                                }
                                if method.Signature:
                                    method_data["signature"] = {
                                        "parameters": method.Signature.get("parameter", []),
                                        "return_type": method.Signature.get("return", ""),
                                        "has_this": method.Signature.get("hasthis", False)
                                    }
                                type_data["methods"].append(method_data)
                            metadata["TypeDef"]["detailed"].append(type_data)
                except AttributeError as e:
                    self.log.warning(f"TypeDef table exists but attributes missing for {self.hash.sha256}: {e}")
                    # metadata["info"]["TypeDefParsingError"] = f"Missing attributes: {str(e)}"
                except Exception as e:
                    self.log.error(f"Error parsing TypeDef table for {self.hash.sha256}: {e}")
                    # metadata["info"]["TypeDefParsingError"] = str(e)
        except Exception as e:
            self.log.error(f"Error handling TypeDef section for {self.hash.sha256}: {e}")
            metadata["TypeDef"] = {"names": [], "detailed": []}
            # metadata["info"]["TypeDefParsingError"] = str(e)

        # ExternalUnmanagedModules
        try:
            metadata["ExternalUnmanagedModules"] = ()
            if "ModuleRef" in available_tables:
                metadata["info"]["HasModuleRef"] = True
                metadata["ExternalUnmanagedModules"] = (
                    self.dotnet.ModuleRef.get_unmanaged_module_names(
                        self.dotnet.Type.UnmanagedModules.RAW
                    )
                )
        except Exception as e:
            self.log.error(f"Error getting external unmanaged modules for {self.hash.sha256}: {e}")

        # ExternalUnmanagedMethods
        try:
            metadata["ExternalUnmanagedMethods"] = ()
            if "ImplMap" in available_tables:
                metadata["info"]["HasImplMap"] = True
                metadata["ExternalUnmanagedMethods"] = (
                    self.dotnet.ImplMap.get_unmanaged_functions()
                )
        except Exception as e:
            self.log.error(f"Error getting external unmanaged methods for {self.hash.sha256}: {e}")

        # Event
        try:
            metadata["Event"] = ()
            if "Event" in available_tables:
                metadata["info"]["HasEvent"] = True
                metadata["Event"] = self.dotnet.Event.get_event_names()
        except Exception as e:
            self.log.error(f"Error getting event for {self.hash.sha256}: {e}")

        # Resources
        try:
            metadata["Resources"] = []
            if self.dotnet.has_resources():
                tmp_resources_list = []
                resource_data = self.dotnet.get_resources()
                for data in resource_data:
                    tmp_dict = {}
                    for resource_item in data.items():
                        if resource_item[0] == "SubResources":
                            if resource_item[1]:
                                tmp_dict["SubResources"] = {}
                                for sub_resource in resource_item[1]:
                                    for sub_resource_item in sub_resource.items():
                                        if sub_resource_item[0] == "Data":
                                            # Check if data is a sequence type that supports len()
                                            if hasattr(sub_resource_item[1], '__len__') and len(sub_resource_item[1]) > 100:
                                                tmp_dict["SubResources"]["Data"] = {}
                                                try:
                                                    # tmp_dict["SubResources"]["Data"][
                                                    #     "md5"
                                                    # ] = md5(
                                                    #     sub_resource_item[1].encode()
                                                    # ).hexdigest()
                                                    tmp_dict["SubResources"]["Data"][
                                                        "md5"
                                                    ] = self._compute_md5(
                                                        sub_resource_item[1]
                                                    )
                                                except Exception as e:
                                                    self.log.error(
                                                        f"Error in dotnet resources"
                                                        f" extraction {self.hash.sha256}: {e}"
                                                    )
                                                guess = magic.from_buffer(
                                                    sub_resource_item[1], mime=True
                                                )
                                                tmp_dict["SubResources"]["Data"][
                                                    "MimeType"
                                                ] = (guess if guess else None)
                                            else:
                                                normalized_data = self._normalize_data(
                                                    sub_resource_item[1].decode()
                                                    if isinstance(
                                                        sub_resource_item[1], bytes
                                                    )
                                                    else sub_resource_item[1]
                                                )
                                                tmp_dict["SubResources"][
                                                    sub_resource_item[0]
                                                ] = normalized_data
                                        else:
                                            tmp_dict["SubResources"][
                                                sub_resource_item[0]
                                            ] = (
                                                sub_resource_item[1].decode()
                                                if isinstance(
                                                    sub_resource_item[1], bytes
                                                )
                                                else sub_resource_item[1]
                                            )
                        elif resource_item[0] == "Data":
                            # Check if data is a sequence type that supports len()
                            if hasattr(resource_item[1], '__len__') and len(resource_item[1]) > 100:
                                tmp_dict["Data"] = {}
                                tmp_dict["Data"]["md5"] = self._compute_md5(
                                    resource_item[1]
                                )
                                guess = magic.from_buffer(resource_item[1], mime=True)
                                tmp_dict["Data"]["MimeType"] = guess if guess else None
                            else:
                                normalized_data = self._normalize_data(
                                    resource_item[1].decode()
                                    if isinstance(resource_item[1], bytes)
                                    else resource_item[1]
                                )
                                tmp_dict["Data"] = normalized_data
                        else:
                            tmp_dict[resource_item[0]] = (
                                resource_item[1].decode()
                                if isinstance(resource_item[1], bytes)
                                else resource_item[1]
                            )
                    tmp_resources_list.append(tmp_dict)
                metadata["Resources"] = tmp_resources_list
        except Exception as e:
            self.log.error(f"Error getting resources for {self.hash.sha256}: {e}")
            metadata["Resources"] = []  # Ensure we always have a valid list even on error

        dotnet = PEDotNet(metadata)
        self.dotnet = dotnet  # Store for later use in prepare_export_data
        return dotnet  # Return the extracted data instead of exporting directly


    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.dotnet
        elif exporter_type == "ClickHouseExporter":
            # Convert metadata to JSON string
            metadata_json = json.dumps(self.dotnet.dotnet)
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                metadata_json,
                datetime.now(timezone.utc)
            ]]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'dotnet', 'analysis_date'
            ]
            
            if not data:
                return None

            column_type_names = [
                'String', 'String', 'String', 'JSON', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

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