James P. G. Sterbenz

122 papers A* 7A 1B 6Misc 2Journal 35Unranked 65
YearRankTypeTitle / Venue / Authors
2020 J jnl
Comput. Commun.
Claudio Casetti, Jordi Domingo-Pascual, Fernando Kuipers, James P. G. Sterbenz
2019 J jnl
Proc. IEEE
Simon Dobson, David Hutchison, Andreas Mauthe, Alberto E. Schaeffer Filho, Paul Smith, James P. G. Sterbenz
2018 B ed.
Networking
Claudio Casetti, Fernando A. Kuipers, James P. G. Sterbenz, Burkhard Stiller
2018 J jnl
Comput. Commun.
David Hutchison, James P. G. Sterbenz
2018 conf
RNDM
Truc Anh N. Nguyen, James P. G. Sterbenz
2018 J jnl
Ann. des Télécommunications
M. Todd Gardner, Yufei Cheng, Cory C. Beard, James P. G. Sterbenz, Deep Medhi
2018 conf
ISC2
Amir Modarresi, James P. G. Sterbenz
2017 conf
RNDM
Amir Modarresi, Siddharth Gangadhar, James P. G. Sterbenz
2017 conf
WNS3
Truc Anh N. Nguyen, James P. G. Sterbenz
2017 conf
ICTON
Jacek Rak, Magnus Jonsson, David Hutchison, James P. G. Sterbenz
2017 conf
RNDM
Siddharth Gangadhar, James P. G. Sterbenz
2017 conf
CFI
Amir Modarresi, James P. G. Sterbenz
2017 conf
RNDM
James P. G. Sterbenz
2017 conf
RNDM
Amir Modarresi, James P. G. Sterbenz
2016 conf
WNS3
Truc Anh N. Nguyen, Siddharth Gangadhar, Md. Moshfequr Rahman, James P. G. Sterbenz
2016 conf
DRCN
M. Todd Gardner, Yufei Cheng, Rebecca May, Cory C. Beard, James P. G. Sterbenz, Deep Medhi
2016 conf
DRCN
Yufei Cheng, Truc Anh N. Nguyen, Md. Moshfequr Rahman, Siddharth Gangadhar, James P. G. Sterbenz
2016 conf
RNDM
Andreas Mauthe, David Hutchison, Egemen K. Çetinkaya, Ivan Ganchev, Jacek Rak, James P. G. Sterbenz, Matthias Gunkel, Paul Smith, Teresa Gomes
2016 conf
DroNet@MobiSys
James P. G. Sterbenz
2016 conf
RNDM
Yufei Cheng, Truc Anh N. Nguyen, Md. Moshfequr Rahman, Siddharth Gangadhar, James P. G. Sterbenz
2016 conf
CFI
Truc Anh N. Nguyen, Siddharth Gangadhar, James P. G. Sterbenz
2016 J jnl
J. Netw. Syst. Manag.
Dongsheng Zhang, James P. G. Sterbenz
2015 J jnl
Comput. Networks
Yufei Cheng, M. Todd Gardner, Junyan Li, Rebecca May, Deep Medhi, James P. G. Sterbenz
2015 conf
DRCN
Mohammed J. F. Alenazi, James P. G. Sterbenz
2015 conf
RNDM@WMNC
Yufei Cheng, James P. G. Sterbenz
2015 B conf
CNSM
Yufei Cheng, Md. Moshfequr Rahman, Siddharth Gangadhar, Mohammed J. F. Alenazi, James P. G. Sterbenz
2015 conf
WNS3
Mohammed J. F. Alenazi, Yufei Cheng, Dongsheng Zhang, James P. G. Sterbenz
2015 conf
RNDM@WMNC
Mohammed J. F. Alenazi, James P. G. Sterbenz
2015 J jnl
Telecommun. Syst.
Jacek Rak, Mario Pickavet, Kishor S. Trivedi, Javier Alonso Lopez, Arie M. C. A. Koster, James P. G. Sterbenz, Egemen K. Çetinkaya, Teresa Gomes, Matthias Gunkel, Krzysztof Walkowiak, Dimitri Staessens
2015 J jnl
Networks
Yufei Cheng, Deep Medhi, James P. G. Sterbenz
2015 J jnl
IEEE Commun. Mag.
Fawzi Behmann, Jacek Rak, James P. G. Sterbenz, Gangxiang Shen, Dimitri Papadimitriou, Krzysztof Walkowiak, Boris Bellalta, Miroslav Skoric, Thomas Magedanz
2015 conf
RNDM@WMNC
Dongsheng Zhang, James P. G. Sterbenz
2015 J jnl
Telecommun. Syst.
Egemen K. Çetinkaya, Mohammed J. F. Alenazi, Andrew M. Peck, Justin P. Rohrer, James P. G. Sterbenz
2015 J jnl
Networks
Jacek Rak, James P. G. Sterbenz
2015 conf
CFI
Truc Anh N. Nguyen, Justin P. Rohrer, James P. G. Sterbenz
2015 conf
DRCN
Dongsheng Zhang, James P. G. Sterbenz
2014 J jnl
Opt. Switch. Netw.
Egemen K. Çetinkaya, Mohammed J. F. Alenazi, Yufei Cheng, Andrew M. Peck, James P. G. Sterbenz
2014 J jnl
Opt. Switch. Netw.
Mohammed J. F. Alenazi, Egemen K. Çetinkaya, James P. G. Sterbenz
2014 conf
DRCN
Yufei Cheng, M. Todd Gardner, Junyan Li, Rebecca May, Deep Medhi, James P. G. Sterbenz
2014 J jnl
Telecommun. Syst.
Justin P. Rohrer, Abdul Jabbar, James P. G. Sterbenz
2014 J jnl
Opt. Switch. Netw.
Georgios Ellinas, Dimitri Papadimitriou, Jacek Rak, Dimitri Staessens, James P. G. Sterbenz, Krzysztof Walkowiak
2014 J jnl
Telecommun. Syst.
James P. G. Sterbenz, David Hutchison, Egemen K. Çetinkaya, Abdul Jabbar, Justin P. Rohrer, Marcus Schöller, Paul Smith
2014 J jnl
Comput. Networks
James P. G. Sterbenz, David Hutchison, Paul Müller, Chip Elliott
2014 J jnl
Comput. Networks
James P. G. Sterbenz, David Hutchison, Paul Müller, Chip Elliott
2014 J jnl
Comput. Networks
Deep Medhi, Byrav Ramamurthy, Caterina M. Scoglio, Justin P. Rohrer, Egemen K. Çetinkaya, Ramkumar Cherukuri, Xuan Liu, Pragatheeswaran Angu, Andy C. Bavier, Cort Buffington, James P. G. Sterbenz
2013 conf
DRCN
Egemen K. Çetinkaya, James P. G. Sterbenz
2013 B conf
ICCCN
James P. G. Sterbenz, Prasad A. Kulkarni
2013 J jnl
Telecommun. Syst.
James P. G. Sterbenz, Egemen K. Çetinkaya, Mahmood A. Hameed, Abdul Jabbar, Shi Qian, Justin P. Rohrer
2013 conf
DRCN
Egemen K. Çetinkaya, Andrew M. Peck, James P. G. Sterbenz
2013 conf
IWSOS
Dongsheng Zhang, James P. G. Sterbenz
2013 J jnl
Telecommun. Syst.
Egemen K. Çetinkaya, Dan Broyles, Amit Dandekar, Sripriya Srinivasan, James P. G. Sterbenz
2013 conf
ICUMT
Mohammed J. F. Alenazi, Egemen K. Çetinkaya, James P. G. Sterbenz
2013 conf
ICUMT
Egemen K. Çetinkaya, Mohammed J. F. Alenazi, Yufei Cheng, Andrew M. Peck, James P. G. Sterbenz
2013 conf
ICUMT
Yufei Cheng, Junyan Li, James P. G. Sterbenz
2013 conf
ICUMT
Dongsheng Zhang, Egemen K. Çetinkaya, James P. G. Sterbenz
2013 conf
SimuTools
Siddharth Gangadhar, Truc Anh N. Nguyen, Greeshma Umapathi, James P. G. Sterbenz
2013 conf
SimuTools
Yufei Cheng, Egemen K. Çetinkaya, James P. G. Sterbenz
2012 conf
SimuTools
Yufei Cheng, Egemen K. Çetinkaya, James P. G. Sterbenz
2012 conf
ICUMT
Dongsheng Zhang, Santosh Ajith Gogi, Dan Broyles, Egemen K. Çetinkaya, James P. G. Sterbenz
2012 A* conf
MobiCom
Dongsheng Zhang, Santosh Ajith Gogi, Dan Broyles, Egemen K. Çetinkaya, James P. G. Sterbenz
2012 conf
MILCOM
Justin P. Rohrer, Kamakshi Sirisha Pathapati, Truc Anh N. Nguyen, James P. G. Sterbenz
2012 A* conf
MobiCom
Egemen K. Çetinkaya, Justin P. Rohrer, Abdul Jabbar, Mohammed J. F. Alenazi, Dongsheng Zhang, Dan Broyles, Kamakshi Sirisha Pathapati, Hemanth Narra, Kevin Peters, Santosh Ajith Gogi, James P. G. Sterbenz
2012 conf
ICUMT
Egemen K. Çetinkaya, Mohammed J. F. Alenazi, Justin P. Rohrer, James P. G. Sterbenz
2011 B conf
WCNC
Kevin Peters, Abdul Jabbar, Egemen K. Çetinkaya, James P. G. Sterbenz
2011 conf
MILCOM
Justin P. Rohrer, Egemen K. Çetinkaya, Hemanth Narra, Dan Broyles, Kevin Peters, James P. G. Sterbenz
2011 conf
DRCN
Abdul Jabbar, Hemanth Narra, James P. G. Sterbenz
2011 conf
SimuTools
Hemanth Narra, Yufei Cheng, Egemen K. Çetinkaya, Justin P. Rohrer, James P. G. Sterbenz
2011 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Justin P. Rohrer, Abdul Jabbar, Egemen K. Çetinkaya, Erik Perrins, James P. G. Sterbenz
2011 Misc conf
COMSNETS
James P. G. Sterbenz, Egemen K. Çetinkaya, Mahmood A. Hameed, Abdul Jabbar, Justin P. Rohrer
2011 J jnl
IEEE Commun. Mag.
Paul Smith, David Hutchison, James P. G. Sterbenz, Marcus Schöller, Ali Fessi, Merkourios Karaliopoulos, Chidung Lac, Bernhard Plattner
2011 conf
Integrated Network Management
Ramkumar Cherukuri, Xuan Liu, Andy C. Bavier, James P. G. Sterbenz, Deep Medhi
2011 conf
ICUMT
Justin P. Rohrer, James P. G. Sterbenz
2011 conf
CFI
Justin P. Rohrer, Egemen K. Çetinkaya, James P. G. Sterbenz
2011 J jnl
Comput. Commun.
Abdul Jabbar, Justin P. Rohrer, Victor S. Frost, James P. G. Sterbenz
2010 conf
ICUMT
Egemen K. Çetinkaya, Dan Broyles, Amit Dandekar, Sripriya Srinivasan, James P. G. Sterbenz
2010 J jnl
Comput. Networks
James P. G. Sterbenz, David Hutchison, Egemen K. Çetinkaya, Abdul Jabbar, Justin P. Rohrer, Marcus Schöller, Paul Smith
2010 J jnl
Comput. Networks
Bernhard Plattner, David Hutchison, James P. G. Sterbenz
2010 conf
ICUMT
Tyson Thedinger, Abdul Jabbar, James P. G. Sterbenz
2010 Misc conf
TRIDENTCOM
James P. G. Sterbenz, Deep Medhi, Byrav Ramamurthy, Caterina M. Scoglio, David Hutchison, Bernhard Plattner, Tricha Anjali, Andrew Scott, Cort Buffington, Gregory E. Monaco
2009 conf
ICUMT
Justin P. Rohrer, Ramya Naidu, James P. G. Sterbenz
2009 conf
DRCN
Justin P. Rohrer, Abdul Jabbar, James P. G. Sterbenz
2009 A* conf
INFOCOM
Abdul Jabbar, Justin P. Rohrer, Andrew Oberthaler, Egemen K. Çetinkaya, Victor Frost, James P. G. Sterbenz
2009 J jnl
ERCIM News
David Hutchison, James P. G. Sterbenz
2009 conf
CFI
James P. G. Sterbenz
2008 conf
Network Attack Detection and Defense
Lothar Braun, Falko Dressler, Thorsten Holz, Engin Kirda, Jan Kohlrausch, Christopher Kruegel, Tobias Limmer, Konrad Rieck, James P. G. Sterbenz
2008 conf
Network Attack Detection and Defense
Marc Dacier, Hervé Debar, Thorsten Holz, Engin Kirda, Jan Kohlrausch, Christopher Kruegel, Konrad Rieck, James P. G. Sterbenz
2008 conf
ICC
Linlin Xie, Paul Smith, David Hutchison, Mark Banfield, Helmut Leopold, Abdul Jabbar, James P. G. Sterbenz
2008 ed.
IWSOS
Karin Anna Hummel, James P. G. Sterbenz
2008 conf
IWSOS
Abdul Jabbar, Bharatwajan Raman, Victor S. Frost, James P. G. Sterbenz
2006 J jnl
Comput. Networks
Bernhard Plattner, James P. G. Sterbenz
2006 ed.
IWSOS/EuroNGI
Hermann de Meer, James P. G. Sterbenz
2006 conf
IWSOS/EuroNGI
James P. G. Sterbenz
2005 J jnl
IEEE Micro
James P. G. Sterbenz, Dimitrios Stiliadis
2005 conf
Hot Interconnects
James P. G. Sterbenz
2005 conf
Service Management and Self-Organization in IP-based Networks
James P. G. Sterbenz
2005 conf
IWAN
Linlin Xie, Paul Smith, Mark Banfield, Helmut Leopold, James P. G. Sterbenz, David Hutchison
2005 B conf
IWQoS
David Hutchison, Gísli Hjálmtýsson, James P. G. Sterbenz, Giorgio Ventre, John B. Vicente
2004 ed.
IWAN
Naoki Wakamiya, Marcin Solarski, James P. G. Sterbenz
2004 J jnl
Comput. Networks
Rajesh Krishnan, James P. G. Sterbenz, Wesley M. Eddy, Craig Partridge, Mark Allman
2004 conf
Hot Interconnects
James P. G. Sterbenz
2004 conf
Hot Interconnects
James P. G. Sterbenz, Dimitrios Stiliadis
2004 conf
Hot Interconnects
James P. G. Sterbenz, J. Bryan Lyles, Ásgeir Th. Eiríksson, Steve Klinger, Christoph L. Schuba, Jonathan S. Turner, Raj Yavatkar
2002 conf
DANCE
Alden W. Jackson, James P. G. Sterbenz, Matthew Condell, Regina Hain
2002 ed.
IWAN
James P. G. Sterbenz, Osamu Takada, Christian F. Tschudin, Bernhard Plattner
2002 conf
Protocols for High-Speed Networks
James P. G. Sterbenz
2002 conf
Protocols for High-Speed Networks
James P. G. Sterbenz
2002 A* conf
INFOCOM
Will Ivancic, David A. Wagner, Aviel D. Rubin, E. Paul Ratazzi, James P. G. Sterbenz
2002 conf
Workshop on Wireless Security
James P. G. Sterbenz, Rajesh Krishnan, Regina Hain, Alden W. Jackson, David Levin, Ram Ramanathan, John Zao
2002 conf
Hot Interconnects
James P. G. Sterbenz
2001 book
James P. G. Sterbenz, Joseph D. Touch
2001 B conf
ICNP
Rajesh Krishnan, James P. G. Sterbenz
2000 J jnl
IEEE Wirel. Commun.
Gregory D. Abowd, James P. G. Sterbenz
2000 ed.
Protocols for High-Speed Networks
Joseph D. Touch, James P. G. Sterbenz
1999 A* ed.
SIGCOMM
Lyman Chapin, James P. G. Sterbenz, Guru M. Parulkar, Jonathan S. Turner
1995 J jnl
IEEE J. Sel. Areas Commun.
Jean-Paul Nussbaumer, Baiju V. Patel, Frank Schaffa, James P. G. Sterbenz
1995 J jnl
IEEE Netw.
James P. G. Sterbenz, Henning Schulzrinne, Joseph D. Touch
1994 conf
Protocols for High-Speed Networks
James P. G. Sterbenz
1993 J jnl
J. High Speed Networks
James P. G. Sterbenz, Gurudatta M. Parulkar
1992 A* conf
INFOCOM
James P. G. Sterbenz, Anshul Kantawala, Milind M. Buddhikot, Guru M. Parulkar
1990 A* conf
INFOCOM
James P. G. Sterbenz, Guru M. Parulkar
1990 A conf
ICDCS
James P. G. Sterbenz, Guru M. Parulkar
1990 J jnl
Comput. Commun. Rev.
James P. G. Sterbenz, Gurudatta M. Parulkar
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"