Ralf Knackstedt

162 papers C 5Journal 35Unranked 117
YearRankTypeTitle / Venue / Authors
2026 conf
HICSS
Daniel Bierschwale, Phillip Oliver Gottschewski-Meyer, David Walter, Ralf Knackstedt
2025 conf
HCI (55)
Paul-Ferdinand Steuck, Marco Di Maria, Daniel Bierschwale, Phillip Oliver Gottschewski-Meyer, Ralf Knackstedt
2025 conf
INFORMATIK
David Walter, Thorsten Schoormann, Evelyn Eßmann, Ralf Knackstedt
2025 conf
HCI (42)
Daniel Bierschwale, Phillip Oliver Gottschewski-Meyer, Paul-Ferdinand Steuck, Ralf Knackstedt
2024 conf
ECIS
David Walter, Kathrin Seibert, Thorsten Schoormann, Ralf Knackstedt
2024 C conf
ICIS
Marco Di Maria, Natia Baindurashvili, Thorsten Schoormann, Ralf Knackstedt
2024 conf
ECIS
Marco Di Maria, Thorsten Schoormann, Thomas Grisold, Ralf Knackstedt
2024 conf
Wirtschaftsinformatik
David Walter, Kathrin Seibert, Thorsten Schoormann, Marco Di Maria, Ralf Knackstedt
2024 conf
INFORMATIK
David Walter, Paul-Ferdinand Steuck, Marco Di Maria, Ralf Knackstedt
2024 conf
Wirtschaftsinformatik
Marco Di Maria, Vanessa Guski, Thorsten Schoormann, Ralf Knackstedt
2024 conf
INFORMATIK
David Walter, Kathrin Seibert, Marco Di Maria, Ralf Knackstedt
2024 conf
Wirtschaftsinformatik
Paul-Ferdinand Steuck, Phillip Oliver Gottschewski-Meyer, Daniel Bierschwale, Ralf Knackstedt
2023 J jnl
Electron. Mark.
Janina Seutter, Kristin Kutzner, Maren Stadtländer, Dennis Kundisch, Ralf Knackstedt
2023 J jnl
J. Manag. Inf. Syst.
Thorsten Schoormann, Maren Stadtländer, Ralf Knackstedt
2023 conf
RVI
Marco Di Maria, Daniel Bierschwale, Paul-Ferdinand Steuck, Ralf Knackstedt
2023 conf
DELFI
Marco Di Maria, David Walter, Fabian Segieth, Ralf Knackstedt
2023 J jnl
HMD Prax. Wirtsch.
Marco Di Maria, David Walter, Thorsten Schoormann, Ralf Knackstedt
2023 conf
Wirtschaftsinformatik
Marco Di Maria, David Walter, Thorsten Schoormann, Ralf Knackstedt
2023 conf
RVI
Daniel Bierschwale, Paul-Ferdinand Steuck, Ralf Knackstedt
2023 conf
DELFI
Marco Di Maria, David Walter, Paul-Ferdinand Steuck, Ralf Knackstedt
2023 conf
ECIS
Marco Di Maria, David Walter, Thorsten Schoormann, Ralf Knackstedt
2023 conf
GI-Jahrestagung
Marco Di Maria, David Walter, Ralf Knackstedt
2023 conf
DELFI
David Walter, Marco Di Maria, Ralf Knackstedt
2022 J jnl
Electron. Mark.
Thorsten Schoormann, Maren Stadtländer, Ralf Knackstedt
2022 conf
DELFI
Marco Di Maria, David Walter, Ralf Knackstedt
2021 conf
ECIS
Kristin Kutzner, Maren Stadtländer, Janina Seutter, Dennis Kundisch, Ralf Knackstedt
2021 conf
Wirtschaftsinformatik
Maren Stadtländer, Thorsten Schoormann, Ralf Knackstedt
2021 conf
Wirtschaftsinformatik
Kristin Kutzner, Thorsten Schoormann, Claudia Roßkopf, Ralf Knackstedt
2021 conf
Wirtschaftsinformatik
Thorsten Schoormann, Dennis Behrens, Michael Fellmann, Ralf Knackstedt
2021 conf
Wirtschaftsinformatik
Coralie Werkmeister, Thorsten Schoormann, Ralf Knackstedt
2021 J jnl
HMD Prax. Wirtsch.
Julien Hofer, Ralf Knackstedt
2020 conf
GI-Jahrestagung
Kristin Kutzner, Thorsten Schoormann, Ralf Knackstedt
2020 J jnl
HMD Prax. Wirtsch.
Friedemann Kammler, Thorsten Schoormann, Alexander Fuchs, Achim Mauruschat, Oliver Thomas, Ralf Knackstedt
2020 conf
HICSS
Thorsten Schoormann, Julien Hofer, Ralf Knackstedt
2020 J jnl
Electron. Mark.
Daniel Szopinski, Thorsten Schoormann, Thomas John, Ralf Knackstedt, Dennis Kundisch
2020 conf
Modellierung
Thorsten Schoormann, Simon Hagen, Jonas Brinker, Sebastian Wildau, Oliver Thomas, Ralf Knackstedt
2019 J jnl
HMD Prax. Wirtsch.
Julien Hofer, Thorsten Schoormann, Jonas Kortum, Ralf Knackstedt
2019 conf
Wirtschaftsinformatik
Kristin Kutzner, Kristina Petzold, Ralf Knackstedt
2019 C conf
ICIS
Thorsten Schoormann, Kristin Kutzner, Sebastian Pape, Ralf Knackstedt
2019 conf
Wirtschaftsinformatik
Maren Stadtländer, Thorsten Schoormann, Ralf Knackstedt
2019 ch.
The Art of Structuring
Ralf Knackstedt, Sebastian Bräuer, Thorsten Schoormann
2018 conf
CBI (1)
Thorsten Schoormann, Dennis Behrens, Michael Fellmann, Ralf Knackstedt
2018 ch.
Business Process Management Cases
Jan Bührig, Thorsten Schoormann, Ralf Knackstedt
2018 conf
ECIS
Thorsten Schoormann, Dennis Behrens, Ralf Knackstedt
2018 conf
BIS
Dennis Behrens, Thorsten Schoormann, Ralf Knackstedt
2018 conf
ECIS
Kristin Kutzner, Thorsten Schoormann, Ralf Knackstedt
2018 J jnl
Energy Inform.
Dennis Behrens, Thorsten Schoormann, Sebastian Bräuer, Ralf Knackstedt
2018 conf
DeLFI
Julien Hofer, Thorsten Schoormann, Ralf Knackstedt
2018 J jnl
Enterp. Model. Inf. Syst. Archit.
Dennis Behrens, Carola Gerwig, Thorsten Schoormann, Ralf Knackstedt
2018 conf
MKWI
Simon Hagen, Thorsten Schoormann, Sven Jannaber, Ralf Knackstedt, Oliver Thomas
2018 C conf
ICIS
Thorsten Schoormann, Dennis Behrens, Ralf Knackstedt
2018 conf
EMISA
Thorsten Schoormann, Ralf Knackstedt
2018 J jnl
EMISA Forum
Thorsten Schoormann, Ralf Knackstedt
2018 conf
BIS
Thorsten Schoormann, Anna Kaufhold, Dennis Behrens, Ralf Knackstedt
2018 conf
GI-Jahrestagung (Workshops)
Simon Hagen, Thorsten Schoormann, Sven Jannaber, Ralf Knackstedt, Oliver Thomas
2017 conf
OR
Dennis Behrens, Cornelius Rüther, Thorsten Schoormann, Thimo Hachmeister, Klaus Ambrosi, Ralf Knackstedt
2017 J jnl
HMD Prax. Wirtsch.
Julien Hofer, Kristin Kutzner, Ralf Knackstedt
2017 conf
AMCIS
Daniel Szopinski, Thorsten Schoormann, Thomas John, Ralf Knackstedt, Dennis Kundisch
2017 conf
BIS
Thorsten Schoormann, Dennis Behrens, Ulrich Heid, Ralf Knackstedt
2017 C conf
ICIS
Thorsten Schoormann, Dennis Behrens, Ralf Knackstedt
2017 conf
BIS
Dennis Behrens, Thorsten Schoormann, Ralf Knackstedt
2016 conf
GI-Jahrestagung
Thorsten Schoormann, Dennis Behrens, Ralf Knackstedt
2016 conf
GI-Jahrestagung
Dennis Behrens, Thorsten Schoormann, Ralf Knackstedt
2016 conf
GI-Jahrestagung
Thorsten Schoormann, Dennis Behrens, Ralf Knackstedt
2016 conf
ECIS
Thorsten Schoormann, Dennis Behrens, Erik Kolek, Ralf Knackstedt
2015 conf
GI-Jahrestagung
Carola Gerwig, Dennis Behrens, Helmut Lessing, Ralf Knackstedt
2014 J jnl
Commun. Assoc. Inf. Syst.
Ralf Knackstedt, Marcel Heddier, Jörg Becker
2014 conf
GI-Jahrestagung
Carola Gerwig, Dennis Behrens, Ralf Knackstedt, Helmut Lessing
2014 C conf
ICIS
Ralf Knackstedt, Sebastian Bräuer, Marcel Heddier, Jörg Becker
2014 J jnl
Inf. Syst. E Bus. Manag.
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Hans Peter Rauer, Daniel Sigge
2014 conf
HICSS
Jörg Becker, Marcel Heddier, Ayten Öksüz, Ralf Knackstedt
2014 conf
MKWI
Tilo Böhmann, Ralf Knackstedt, Jan Marco Leimeister, Markus Nüttgens, Oliver Thomas
2013 J jnl
IEEE Trans. Engineering Management
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Martin Matzner, Oliver Müller, Jens Pöppelbuß
2013 J jnl
Scand. J. Inf. Syst.
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Martin Matzner, Oliver Müller, Jens Pöppelbuß
2013 conf
AMCIS
Jörg Becker, Mathias Eggert, Ralf Knackstedt, Stefan Fleischer
2013 J jnl
Int. J. Web Portals
Jörg Becker, Tobias Heide, Ralf Knackstedt, Matthias Steinhorst
2013 conf
ECIS
Mathias Eggert, Axel Winkelmann, Patrick Lohmann, Ralf Knackstedt
2013 conf
ECIS
Ralf Knackstedt, Mathias Eggert, Marcel Heddier, Friedrich Chasin, Jörg Becker
2012 J jnl
Enterp. Model. Inf. Syst. Archit.
Jörg Becker, Torben Bernhold, Daniel Beverungen, Nina Kaling, Ralf Knackstedt, Vanessa Lellek, Hans Peter Rauer
2012 conf
ACIS
Jörg Becker, Mathias Eggert, Stefan Fleischer, Marcel Heddier, Ralf Knackstedt
2012 ch.
Implementing International Services
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Armin Stein
2012 conf
FTVI/FTRI
Jörg Becker, Ralf Knackstedt, Mathias Eggert, Stefan Fleischer
2012 conf
HICSS
Jörg Becker, Mathias Eggert, Marcel Heddier, Ralf Knackstedt
2012 conf
FTVI/FTRI
Jörg Becker, Sara Hofmann, Marlen Jurisch, Ralf Knackstedt, Helmut Krcmar, Michael Räckers, Irina Thome, Petra Wolf
2012 J jnl
Int. J. Knowl. Manag.
Jörg Becker, Ralf Knackstedt, Lukasz Lis, Armin Stein, Matthias Steinhorst
2012 conf
HICSS
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Hans Peter Rauer, Daniel Sigge
2012 conf
HICSS
Ralf Knackstedt, Mathias Eggert, Stefan Fleischer
2012 conf
ECIS
Ralf Knackstedt, Mathias Eggert, Marcel Heddier, Eike Richter, Jörg Becker
2012 conf
HICSS
Jörg Becker, Marcel Heddier, Ralf Knackstedt
2011 conf
Wirtschaftsinformatik
Jörg Becker, Patrick Delfmann, Ralf Knackstedt, Lukasz Lis
2011 conf
ECIS
Jörg Becker, Daniel Beverungen, Dominic Breuker, Hanns-Alexander Dietrich, Ralf Knackstedt, Hans Peter Rauer
2011 conf
HICSS
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Martin Matzner, Oliver Müller
2011 J jnl
Enterp. Model. Inf. Syst. Archit.
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Oliver Müller
2011 conf
AMCIS
Jörg Becker, Mathias Eggert, Axel Winkelmann, Ralf Knackstedt
2010 conf
FKBI
Jörg Becker, Mathias Eggert, Ralf Knackstedt
2010 J jnl
Electron. Mark.
Klaus Backhaus, Jörg Becker, Daniel Beverungen, Margarethe Frohs, Oliver Müller, Matthias Weddeling, Ralf Knackstedt, Michael Steiner
2010 conf
MKWI
Jörg Becker, Ralf Knackstedt, Lukasz Lis, Armin Stein
2010 conf
ISSS/BPSC
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Axel Winkelmann
2010 conf
GI Jahrestagung (1)
Klaus Backhaus, Ole Bröker, Anna Nikula, Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Robert Wilken
2010 conf
MKWI
Jörg Becker, Daniel Beverungen, Nadine Blinn, Michael Fellmann, Ralf Knackstedt, Markus Nüttgens, Oliver Thomas
2010 conf
GI Jahrestagung (1)
Ralf Knackstedt, Oliver Thomas
2010 J jnl
Inf. Syst. E Bus. Manag.
Jörg Becker, Daniel Beverungen, Ralf Knackstedt
2010 conf
ECIS
Jörg Becker, Ralf Knackstedt, Lukasz Lis, Armin Stein
2010 conf
MKWI
Jörg Becker, Ralf Knackstedt, Jens Pöppelbuß
2010 book
Klaus Backhaus, Jörg Becker, Daniel Beverungen, Margarethe Frohs, Ralf Knackstedt, Oliver Müller, Michael Steiner, Matthias Weddeling
2009 conf
AMCIS
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Martin Matzner, Oliver Müller, Jens Pöppelbuß
2009 conf
ECIS
Felix Müller-Wienbergen, Stefan Seidel, Oliver Müller, Ralf Knackstedt, Jörg Becker
2009 conf
HICSS
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Martin Matzner
2009 J jnl
Bus. Inf. Syst. Eng.
Jörg Becker, Ralf Knackstedt, Jens Pöppelbuß
2009 conf
FKBI
Ralf Knackstedt, Lukasz Lis
2009 J jnl
Enterp. Model. Inf. Syst. Archit.
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Oliver Müller
2009 conf
Wirtschaftsinformatik (2)
Ralf Knackstedt, Armin Stein, Jörg Becker
2009 conf
Wirtschaftsinformatik (2)
Ralf Knackstedt, Marc-Oliver Deinert, Jörg Becker
2009 conf
Wirtschaftsinformatik (2)
Matthias Goeken, Ralf Knackstedt
2009 conf
ECIS
Ralf Knackstedt, Lukasz Lis, Armin Stein, Ingo Barth, Jörg Becker
2009 conf
Wirtschaftsinformatik (1)
Ralf Knackstedt, Jens Pöppelbuß, Jörg Becker
2009 conf
Wirtschaftsinformatik (1)
Jörg Becker, Ralf Knackstedt, Martin Matzner
2009 conf
AMCIS
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Axel Winkelmann
2008 conf
ECIS
Ralf Knackstedt, Dominik Kuropka, Oliver Müller, Artem Polyvyanyy
2008 J jnl
HMD Prax. Wirtsch.
Jörg Becker, Christian Heitmann, Ralf Knackstedt
2008 conf
Data Warehousing
Jörg Becker, Ralf Knackstedt, Jens Pöppelbuß, Lars Schwarze
2008 J jnl
Wirtschaftsinf.
Daniel Beverungen, Ralf Knackstedt, Oliver Müller
2008 J jnl
Wirtschaftsinf.
Ralf Knackstedt, Jens Pöppelbuß, Axel Winkelmann
2008 conf
Multikonferenz Wirtschaftsinformatik
Daniel Beverungen, Uwe Kaiser, Ralf Knackstedt, Robin Krings, Armin Stein
2008 conf
AMCIS
Jörg Becker, Daniel Beverungen, Ralf Knackstedt, Oliver Müller
2008 conf
ECIS
Jörg Becker, Ralf Knackstedt, Stefan Fleischer, Armin Stein
2008 conf
HICSS
Jörg Becker, Daniel Beverungen, Ralf Knackstedt
2008 J jnl
HMD Prax. Wirtsch.
Matthias Goeken, Ralf Knackstedt
2007 conf
AMCIS
Jörg Becker, Ralf Knackstedt, Daniel Pfeiffer, Christian Janiesch
2007 conf
AMCIS
Ralf Knackstedt, Axel Winkelmann, Jörg Becker
2007 conf
ECIS
Jörg Becker, Ralf Knackstedt, Armin Stein
2007 J jnl
Int. J. Inf. Syst. Chang. Manag.
Jörg Becker, Christian Janiesch, Ralf Knackstedt, Tobias Rieke
2007 conf
ECIS
Karsten Klose, Ralf Knackstedt, Daniel Beverungen
2007 conf
AMCIS
Ralf Knackstedt, Axel Winkelmann, Robert Braun
2007 conf
Wirtschaftsinformatik (2)
Patrick Delfmann, Ralf Knackstedt
2007 conf
ICEIS (3)
Matthias Goeken, Ralf Knackstedt
2007 conf
Wirtschaftsinformatik (1)
Ralf Knackstedt, Martin Pellengahr
2007 J jnl
HMD Prax. Wirtsch.
Karsten Klose, Ralf Knackstedt
2007 conf
GfKl
Ralf Knackstedt, Armin Stein
2007 conf
ECIS
Patrick Delfmann, Ralf Knackstedt
2006 conf
ICEIS (3)
Ralf Knackstedt, Christian Janiesch, Tobias Rieke
2006 J jnl
Wirtschaftsinf.
Ralf Knackstedt, Christian Brelage, Noogie C. Kaufmann
2006
Ralf Knackstedt
2006 conf
Data Warehousing
Ralf Knackstedt, Stefan Seidel, Christian Janiesch
2006 J jnl
Wirtschaftsinf.
Ralf Knackstedt, Axel Winkelmann
2006 conf
ACIS
Stefan Seidel, Ralf Knackstedt, Christian Janiesch
2006 conf
WoMM
Patrick Delfmann, Christian Janiesch, Ralf Knackstedt, Tobias Rieke, Stefan Seidel
2005 conf
Wissensmanagement
Björn Niehaves, Karsten Klose, Ralf Knackstedt, Jörg Becker
2005 conf
Wissensmanagement (LNCS Volume)
Björn Niehaves, Karsten Klose, Ralf Knackstedt, Jörg Becker
2005 conf
ICEIS (3)
Karsten Klose, Ralf Knackstedt, Jörg Becker
2005 conf
ICEIS (3)
Ralf Knackstedt, Karsten Klose, Björn Niehaves, Jörg Becker
2004 conf
Referenzmodellierung
Jörg Becker, Björn Niehaves, Ralf Knackstedt
2004 J jnl
Wirtschaftsinf.
Jörg Becker, Patrick Delfmann, Ralf Knackstedt
2004 J jnl
Wirtschaftsinf.
Jörg Becker, Ralf Knackstedt
2003 conf
ECIS
Jörg Becker, Ralf Knackstedt, Thomas Serries
2003 conf
Wirtschaftsinformatik (2)
Jörg Becker, Ralf Knackstedt, Dominik Kuropka, Patrick Delfmann
2003 conf
Wirtschaftsinformatik (2)
Jörg Becker, Ralf Knackstedt
2003 conf
EPK
Jörg Becker, Patrick Delfmann, Thorsten Falk, Ralf Knackstedt
2003 conf
GI Jahrestagung (1)
Jörg Becker, Ralf Knackstedt, Tobias Rieke
2003 conf
AMCIS
Jörg Becker, Ralf Knackstedt, Thomas Serries, Hansjoerg Stewering
2001 conf
GI Jahrestagung (1)
Ralf Knackstedt, Beate Dahlke
1999 J jnl
Rundbr. GI Fachgr. 5 10 Informationssystem Archit.
Roland Holten, Ralf Knackstedt
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"