Magnos Martinello

87 papers A* 1A 2B 15C 3Misc 3Journal 26Unranked 36
YearRankTypeTitle / Venue / Authors
2025 conf
SIGCOMM (Posters and Demos)
Daniel José Ventorim Nunes, Bruno Missi Xavier, Magnos Martinello
2025 conf
SIGCOMM (Posters and Demos)
Everson Scherrer Borges, Fabricio Rodriguez, Rafael Silva Guimarães, Magnos Martinello, Cristina K. Dominicini, Moisés R. N. Ribeiro, Eduard Marin, Christian Esteve Rothenberg
2025 J jnl
Int. J. Netw. Manag.
Célio Albuquerque, Magnos Martinello
2025 conf
CSCN
José Marcos S. Nogueira, Paulo H. L. Rettore, Clayson Celes, Fernando Garcia Diniz Campos Ferreira, Daniel Fernandes Macedo, Juliano Araújo Wickboldt, Vinícius F. S. Mota, Magnos Martinello, Rodolfo da Silva Villaça, Cristiano Bonato Both, Christian Esteve Rothenberg
2025 J jnl
CoRR
Anees Al-Najjar, Domingos Paraiso, Mariam Kiran, Cristina K. Dominicini, Everson Scherrer Borges, Rafael S. Guimarães, Magnos Martinello, Harvey Newman
2025 J jnl
IEEE Trans. Netw. Serv. Manag.
Merim Dzaferagic, Bruno Missi Xavier, Diarmuid Collins, Vince D'Onofrio, Magnos Martinello, Marco Ruffini
2025 conf
ICAR
Antonio Marcos Mutz Entringer, Luiz Carlos Cosmi Filho, Raquel Frizera Vassallo, Vinícius F. S. Mota, Magnos Martinello, José Marcos S. Nogueira
2025 conf
AINA (3)
Wadham Bottacin, Vitor Fontana Zanotelli, Matheus S. De Martin, Pedro de Morais, Rodolfo da Silva Villaça, Vinícius F. S. Mota, Magnos Martinello, Antonio A. de A. Rocha, Giovanni Comarela
2025 J jnl
Ann. des Télécommunications
Vitor F. Zanotelli, Edgard C. Pontes, Magnos Martinello, Jordi Ros-Giralt, Everson Scherrer Borges, Giovanni Comarela, Moisés R. N. Ribeiro, Harvey Newman
2024 conf
ICC
Bruno Missi Xavier, Merim Dzaferagic, Irene Vilà, Magnos Martinello, Marco Ruffini
2024 J jnl
CoRR
Bruno Missi Xavier, Merim Dzaferagic, Irene Vilà, Magnos Martinello, Marco Ruffini
2024 conf
APNet
Bruno Missi Xavier, Magnos Martinello, Celio Trois, Brenno de Mello Alencar, Ricardo Araújo Rios
2024 conf
SC Workshops
Anees Al-Najjar, Domingos Paraiso, Mariam Kiran, Cristina K. Dominicini, Everson Scherrer Borges, Rafael S. Guimarães, Magnos Martinello, Harvey Newman
2024 J jnl
CoRR
Merim Dzaferagic, Bruno Missi Xavier, Diarmuid Collins, Vince D'Onofrio, Magnos Martinello, Marco Ruffini
2024 conf
NFV-SDN
Everson Scherrer Borges, Willen Borges Coelho, Fabricio E. Rodriguez Cesen, Francisco Germano Vogt, Christian Esteve Rothenberg, Rodolfo da Silva Villaça, Cristina K. Dominicini, Rafael S. Guimarães, Magnos Martinello
2024 conf
NFV-SDN
Magnos Martinello, Roberta Lima-Gomes, Everson Scherrer Borges, Henrique Coutinho Layber, Vitor Berger Bonella, Cristina K. Dominicini, Rafael S. Guimarães, Moisés R. N. Ribeiro, Marinho P. Barcellos
2024 J jnl
Comput. Networks
Bruno Missi Xavier, Merim Dzaferagic, Magnos Martinello, Marco Ruffini
2024 J jnl
IEEE Trans. Netw. Serv. Manag.
Everson Scherrer Borges, Magnos Martinello, Vitor Berger Bonella, Abraão Jesus dos Santos, Roberta L. Gomes, Cristina K. Dominicini, Rafael Silva Guimarães, Gabriel Tetzner Menegueti, Marinho P. Barcellos, Marco Ruffini
2023 B conf
NetSoft
Everson Scherrer Borges, Vitor Berger Bonella, Abraão Jesus dos Santos, Gabriel Tetzner Menegueti, Cristina Klippel Dominicini, Magnos Martinello
2023 conf
ICC
Bruno Missi Xavier, Merim Dzaferagic, Diarmuid Collins, Giovanni Comarela, Magnos Martinello, Marco Ruffini
2023 J jnl
CoRR
Bruno Missi Xavier, Merim Dzaferagic, Diarmuid Collins, Giovanni Comarela, Magnos Martinello, Marco Ruffini
2023 conf
AINA (2)
Victor M. Garcia Martinez, Rafael S. Guimarães, Ricardo C. de Mello, Alexandre Pereira do Carmo, Raquel Frizera Vassallo, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, Magnos Martinello
2022 J jnl
IEEE Trans. Netw. Serv. Manag.
Matheus S. Castanho, Cristina K. Dominicini, Magnos Martinello, Marcos A. M. Vieira
2022 J jnl
IEEE Trans. Netw. Serv. Manag.
Rafael S. Guimarães, Cristina K. Dominicini, Victor M. Garcia Martinez, Bruno Missi Xavier, Diego R. Mafioletti, Ana C. Locateli, Rodolfo da Silva Villaça, Magnos Martinello, Moisés R. N. Ribeiro
2022 J jnl
IEEE Trans. Netw. Serv. Manag.
Bruno Missi Xavier, Rafael Silva Guimarães, Giovanni Comarela, Magnos Martinello
2022 B conf
CNSM
Diego Rossi Mafioletti, Magnos Martinello, Moisés R. N. Ribeiro, Marco Ruffini, Frank Slyne
2021 conf
SBRC
Vitor F. Zanotelli, Giovanni Comarela, Rodolfo da Silva Villaça, Magnos Martinello
2021 conf
ONDM
Cristina K. Dominicini, Rafael S. Guimarães, Diego R. Mafioletti, Magnos Martinello, Moisés R. N. Ribeiro, Rodolfo da Silva Villaça, Frédéric Loui, Jordi Ortiz, Frank Slyne, Marco Ruffini, Eoin Kenny
2021 B conf
CNSM
Diego Rossi Mafioletti, Ricardo Carminati de Mello, Marco Ruffini, Valerio Frascolla, Magnos Martinello, Moisés R. N. Ribeiro
2021 A* conf
INFOCOM
Bruno Missi Xavier, Rafael Silva Guimarães, Giovanni Comarela, Magnos Martinello
2021 J jnl
IEEE Trans. Netw. Serv. Manag.
Renato Souza Silva, Carlos Colman Meixner, Rafael S. Guimarães, Thierno Diallo, Borja O. Garcia, Luís F. M. de Moraes, Magnos Martinello
2020 conf
NOF
Rafael Gomes de Castro, Celio Trois, Luis C. E. Bona, Magnos Martinello
2020 conf
ICC
Rafael S. Guimarães, Victor M. Garcia Martinez, Ricardo C. de Mello, Diego R. Mafioletti, Magnos Martinello, Moisés R. N. Ribeiro
2020 J jnl
Comput. Networks
Cristina K. Dominicini, Gilmar L. Vassoler, Rodolfo V. Valentim, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, Magnos Martinello, Eduardo Zambon
2020 conf
ICC
Diego Rossi Mafioletti, Cristina Klippel Dominicini, Magnos Martinello, Moisés R. N. Ribeiro, Rodolfo da Silva Villaça
2020 B conf
NetSoft
Cristina K. Dominicini, Diego R. Mafioletti, Ana C. Locateli, Rodolfo da Silva Villaça, Magnos Martinello, Moisés R. N. Ribeiro, Alexander Gorodnik
2020 J jnl
Comput. Commun.
Wallas Froes, Lucas Santos, Leobino N. Sampaio, Magnos Martinello, Alextian B. Liberato, Rodolfo da Silva Villaça
2020 conf
SBRC Companion
Cristina Klippel Dominicini, Magnos Martinello, Moisés Renato Nunes Ribeiro
2020 conf
SBRC
Rodolfo V. Valentim, Cristina Klippel Dominicini, Diego Rossi Mafioletti, Rodolfo da Silva Villaça, Moisés Renato Nunes Ribeiro, Magnos Martinello
2019 J jnl
IEEE Commun. Mag.
Cristiano Both, Rafael S. Guimarães, Frank Slyne, Juliano Araújo Wickboldt, Magnos Martinello, Cristina K. Dominicini, Rafael de Jesus Martins, Yi Zhang, Diego G. Cardoso, Rodolfo da Silva Villaça, Isabella Ceravolo, Reza Nejabati, Johann Marquez-Barja, Marco Ruffini, Luiz A. DaSilva
2019 conf
SOSR
Cristina K. Dominicini, Gilmar L. Vassoler, Rodolfo V. Valentim, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, Magnos Martinello, Eduardo Zambon
2019 B conf
GLOBECOM
Renan L. Souza, Celio Trois, Rogério C. Turchetti, Magnos Martinello, Joao Henrique G. Correa, Diego Rossi Mafioletti, Luis C. E. Bona, Joao Carlos D. Lima, Alencar Machado
2019 J jnl
Trans. Emerg. Telecommun. Technol.
Alexandre Pereira do Carmo, Raquel Frizera Vassallo, Felippe Mendonça de Queiroz, Rodolfo Picoreti, Mariana Rampinelli, Roberta L. Gomes, Magnos Martinello, Cristina K. Dominicini, Rafael S. Guimarães, Anilton S. Garcia, Moisés R. N. Ribeiro, Dimitra Simeonidou
2019 conf
SBRC
Rodolfo V. Valentim, Cristina Klippel Dominicini, Rodolfo da Silva Villaça, Magnos Martinello, Moisés R. N. Ribeiro, Diego Rossi Mafioletti
2019 J jnl
CoRR
Rodolfo V. Valentim, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, Magnos Martinello, Cristina K. Dominicini, Diego R. Mafioletti
2019 conf
SBRC Companion
Alextian Bartholomeu Liberato, Magnos Martinello, Moisés Renato Nunes Ribeiro
2018 conf
SBRC
Wallas F. Oliveira, Lucas Santos, Magnos Martinello, Leobino N. Sampaio
2018 B conf
AINA
Celio Trois, Luis C. E. Bona, Luiz S. Oliveira, Magnos Martinello, Douglas Harewood-Gill, Marcos Didonet Del Fabro, Reza Nejabati, Dimitra Simeonidou, João Carlos D. Lima, Benhur de Oliveira Stein
2018 conf
OFC
Isabella de A. Ceravolo, Diego G. Cardoso, Cristina K. Dominicini, Pedro Hasse, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, Magnos Martinello, Reza Nejabati, Dimitra Simeonidou
2018 conf
CAMAD
Paulo Marques, Alexandre Pereira do Carmo, Valerio Frascolla, Carlos F. M. Silva, Emanuel D. R. Sena, Raphael Braga, Joao F. N. Pinheiro, Carlos A. Astudillo, Tiago P. C. de Andrade, Eduardo S. Gama, Luiz F. Bittencourt, Leandro A. Villas, Edmundo R. M. Madeira, Nelson L. S. da Fonseca, Cristiano Both, Gabriel Lando, Matias Artur Klafke Schimuneck, Juliano Araújo Wickboldt, Ana P. V. Trevisan, Rafael de Jesus Martins, Raquel Frizera Vassallo, Felippe Mendonça de Queiroz, Rodolfo Picoreti, Roberta L. Gomes, Cristina K. Dominicini, Victor M. Garcia Martinez, Rafael S. Guimarães, Rodolfo da Silva Villaça, Magnos Martinello, Moisés R. N. Ribeiro, Daniel F. Macedo, Vinicius F. e Silva, Julio C. T. Guimaraes, Carlos Colman Meixner, Reza Nejabati, Dimitra Simeonidou, Yi Zhang, Frank Slyne, Pedro Alvarez, Diarmuid Collins, Marco Ruffini, Luiz A. DaSilva, Johann M. Márquez-Barja
2018 C conf
ISCC
Matheus S. Castanho, Cristina K. Dominicini, Rodolfo da Silva Villaça, Magnos Martinello, Moisés R. N. Ribeiro
2018 J jnl
IEEE Trans. Netw. Serv. Manag.
Alextian B. Liberato, Magnos Martinello, Roberta L. Gomes, Arash Farhadi Beldachi, Emilio Hugues-Salas, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, George Kanellos, Reza Nejabati, Alexander Gorodnik, Dimitra Simeonidou
2018 B conf
AINA
Juliana C. S. Andrade, Renato Benezath Cabelino Ribeiro, Rodolfo da Silva Villaça, Magnos Martinello, Celso A. S. Santos
2018 C conf
ISCC
Victor M. Garcia Martinez, Ricardo C. de Mello, Pedro Hasse, Moisés R. N. Ribeiro, Magnos Martinello, Rafael S. Guimarães, Valerio Frascolla
2018 Misc conf
PSC
Valerio Frascolla, Carlos Colman Meixner, Reza Nejabati, Dimitra Simeonidou, Frank Slyne, Yi Zhang, Luiz A. DaSilva, Marco Ruffini, Magnos Martinello, Rafael S. Guimarães, Moisés Renato Nunes Ribeiro
2017 B conf
CNSM
Magnos Martinello, Alextian B. Liberato, Arash Farhadi Beldachi, Koteswararao Kondepu, Roberta L. Gomes, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, Yan Yan, Emilio Hugues-Salas, Dimitra Simeonidou
2017 C conf
PDP
Celio Trois, Luis Carlos Erpen De Bona, Marcos Didonet Del Fabro, Magnos Martinello, Sarvesh Bidkar, Reza Nejabati, Dimitra Simeonidou
2017 J jnl
IEEE Trans. Netw. Serv. Manag.
Cristina K. Dominicini, Gilmar L. Vassoler, Leonardo F. Meneses, Rodolfo da Silva Villaça, Moisés R. N. Ribeiro, Magnos Martinello
2016 J jnl
IEEE Commun. Surv. Tutorials
Celio Trois, Marcos Didonet Del Fabro, Luis Carlos Erpen De Bona, Magnos Martinello
2016 B conf
NOMS
Eros S. Spalla, Diego R. Mafioletti, Alextian B. Liberato, Gilberto Ewald, Christian Esteve Rothenberg, Lásaro J. Camargos, Rodolfo da Silva Villaça, Magnos Martinello
2016 B conf
LCN
Celio Trois, Luis Carlos Erpen De Bona, Marcos Didonet Del Fabro, Magnos Martinello
2016 conf
LANCOMM@SIGCOMM
Alextian B. Liberato, Moisés Renato Nunes Ribeiro, Magnos Martinello, Johann Marquez-Barja, Nicholas J. Kaminski, Luiz A. DaSilva
2016 conf
DSN Workshops
Rodolfo R. Gomes, Alextian B. Liberato, Cristina K. Dominicini, Moisés R. N. Ribeiro, Magnos Martinello
2016 J jnl
Comput. Commun. Rev.
Diego Rossi Mafioletti, Alextian Bartholomeu Liberato, Rodolfo da Silva Villaça, Cristina Klippel Dominicini, Magnos Martinello, Moisés Renato Nunes Ribeiro
2016 conf
LANCOMM@SIGCOMM
Diego Rossi Mafioletti, Alextian Bartholomeu Liberato, Cristina Klippel Dominicini, Rodolfo da Silva Villaça, Magnos Martinello, Moisés Renato Nunes Ribeiro
2016 B conf
AINA
Sergio Charpinel, Celso Alberto Saibel Santos, Alex Borges Vieira, Rodolfo da Silva Villaça, Magnos Martinello
2016 conf
NFV-SDN
Cristina K. Dominicini, Gilmar L. Vassoler, Moisés R. N. Ribeiro, Magnos Martinello
2015 Misc conf
SAC
Celio Trois, Magnos Martinello, Luis Carlos Erpen De Bona, Marcos Didonet Del Fabro
2015 conf
SBRC
Eros S. Spalla, Diego R. Mafioletti, Alextian B. Liberato, Christian Esteve Rothenberg, Lásaro J. Camargos, Rodolfo da Silva Villaça, Magnos Martinello
2014 conf
WICON
Renato Benezath Cabelino Ribeiro, Magnos Martinello, Celso Alberto Saibel Santos, Rosane Bodart Soares
2014 conf
LANC
José Alexandre Macedo, Guilherme Tebaldi Meira, Roberta Lima-Gomes, Magnos Martinello, Alex Borges Vieira
2014 B conf
CNSM
Rafael D. Vencioneck, Gilmar L. Vassoler, Magnos Martinello, Moisés R. N. Ribeiro, Cesar Marcondes
2014 J jnl
IEEE Netw.
Magnos Martinello, Moisés R. N. Ribeiro, Rafael Emerick Z. de Oliveira, Romulo de Angelis Vitoi
2013 conf
LADC
Ramon Marques Ramos, Magnos Martinello, Christian Esteve Rothenberg
2013 B conf
LCN
Ramon Marques Ramos, Magnos Martinello, Christian Esteve Rothenberg
2011 J jnl
Int. J. Web Portals
Raphael O. Santos, Felipe F. Oliveira, Roberta L. Gomes, Magnos Martinello, Renata S. S. Guizzardi
2009 conf
Web Intelligence/IAT Workshops
Raphael O. Santos, Felipe F. Oliveira, Julio C. P. Antunes, Magnos Martinello, Renata S. S. Guizzardi, Roberta L. Gomes
2008 conf
SBSC
Raphael de Oliveira Santos, Fábio Fabris, Magnos Martinello, Cesar Marcondes
2008 B conf
NOMS
Cesar Marcondes, M. Y. Sanadidi, Mario Gerla, Ramon S. Schwartz, Raphael O. Santos, Magnos Martinello
2007 conf
E2EMON
Cesar Marcondes, Medy Sanadidi, Mario Gerla, Magnos Martinello, Ramon S. Schwartz
2007 Misc conf
TRIDENTCOM
Cesar Marcondes, Claudio E. Palazzi, M. Y. Sanadidi, Mario Gerla, Magnos Martinello, Marcos Tadeu Torres
2006 A conf
IPDPS
Magnos Martinello, Mohamed Kaâniche, Karama Kanoun, Carlos Aguilar Melchor
2005
Magnos Martinello
2005 J jnl
Reliab. Eng. Syst. Saf.
Magnos Martinello, Mohamed Kaâniche, Karama Kanoun
2003 A conf
DSN
Mohamed Kaâniche, Karama Kanoun, Magnos Martinello
2003 B conf
SAFECOMP
Magnos Martinello, Mohamed Kaâniche, Karama Kanoun
2001 J jnl
J. Braz. Comput. Soc.
Magnos Martinello, Edmundo de Souza e Silva
redb/extractors/pe_extractors/pe_features.py
← Index redb/extractors/pe_extractors/pe_features.py python
import base64
import inspect
import json
from pprint import pprint
import re

import pefile

from redb.ext.rich_header import get_rich_idVersion
from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor
from redb.models.dataclasses import PE
from datetime import datetime, timezone
from typing import Any


class PEFeaturesExtractor(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_features"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _extract_type(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if self.pe.is_dll():
            return "DLL"
        elif self.pe.is_driver():
            return "DRIVER"
        elif self.pe.is_exe():
            return "EXE"

    def _extract_architecture(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        mt = {"0x14c": "x86", "0x0200": "Itanium", "0x8664": "x64"}
        machine_value = self.pe.FILE_HEADER.Machine
        if isinstance(machine_value, int):
            return mt.get(str(hex(machine_value)), "")
        return str(machine_value) + " => Not x86/64 or Itanium"

    def _extract_rich_header(self):
        """Extract the Rich header from the PE file

        to decode it back from base64, use:
        rh_tmp = json.loads(rh_b64_string)
        rh_decoded = {}
        for k in rh_tmp:
            if isinstance(rh_tmp[k], str):
                rh_decoded[k] = base64.b64decode(rh_tmp[k])
            else:
                rh_decoded[k] = rh_tmp[k]
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        rh = self.pe.parse_rich_header()
        rich_header_b64 = {}
        rich_header_infos = []
        if rh:
            for key in rh:
                if isinstance(rh[key], bytes):
                    rich_header_b64[key] = base64.b64encode(rh[key]).decode("utf-8")
                else:
                    rich_header_b64[key] = rh[key]
            rich_header_infos = self._get_rich_header_infos(rh)
        return json.dumps(rich_header_b64) if rich_header_b64 else None, "\n".join(
            item for item in rich_header_infos
        ) if rich_header_infos else None

    def _get_rich_header_infos(self, rh):
        """Parse Rich header information from the PE Rich Header dump"""
        self.log.debug(inspect.currentframe().f_code.co_name)

        rich_header_infos = []
        try:
            # Get list of @Comp.IDs and counts from Rich header
            # Elements in rich_fields at even indices are @Comp.IDs
            # Elements in rich_fields at odd indices are counts
            # example:                  'values': [8681481,
            #                             1,
            #                             9795593,
            #                             1]
            rich_fields = rh.get("values", [])
            if len(rich_fields) % 2 != 0:
                self.log.info(f"rich header extraction stopped for {self.hash.sha256}")
                return None

            comp_id = None
            for i in rich_fields:
                if rich_fields.index(i) % 2 == 0:
                    # even -> save value
                    comp_id = get_rich_idVersion(i)
                else:
                    # odd -> add to list
                    if comp_id:
                        rich_header_infos.append(f"{comp_id} count={i}")
                        comp_id = None
        except Exception as e:
            self.log.error(
                f"Extract rich header error {self.hash.sha256} Exception: {e}"
            )
        return rich_header_infos

    def _extract_version_info(self):
        """Extract the VS_VERSIONINFO field in a PE file

        Returns:
        vsinfo: a list of "key:value" strings from VS_INFORMATION content.
               None if no VS_INFORMATION content is present.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        version_info = []
        try:
            if hasattr(self.pe, "VS_VERSIONINFO") and hasattr(self.pe, "FileInfo"):
                for finfo in self.pe.FileInfo:
                    for entry in finfo:
                        if hasattr(entry, "StringTable"):
                            for st_entry in entry.StringTable:
                                for key, str_entry in list(st_entry.entries.items()):
                                    version_info.append(f"{key.decode()}:{str_entry.decode()}")
        except Exception as e:
            self.log.error(
                f"Extract VersionInfo error {self.hash.sha256}  Exception: {e}"
            )
        return version_info if version_info else None

    def _extract_exports(self):
        """
        Returns:
        export_library_name: a str representing the name of the export library.
                            An empty string if no export library is present.
        exp_symbols_list: a list of function names exported as per DIRECTORY_ENTRY_EXPORT.symbols
                            An empty list if no export library is present.
        export_timestamp: a timestamp representing the time of the export.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        export_symbols_list = []
        export_library_name = ""
        export_library_name_raw = ""
        export_timestamp = None
        try:
            if hasattr(self.pe, "DIRECTORY_ENTRY_EXPORT"):
                export_timestamp = self.pe.DIRECTORY_ENTRY_EXPORT.struct.TimeDateStamp
                export_directory = self.pe.DIRECTORY_ENTRY_EXPORT
                export_library_name_rva = export_directory.struct.Name
                try:
                    export_library_name = self.remove_non_utf8(
                        self.pe.get_string_at_rva(export_library_name_rva)
                    ).decode()
                    export_library_name_raw = self.pe.get_string_at_rva(
                        export_library_name_rva
                    ).__str__()
                except Exception as e:
                    self.log.error(
                        f"Error while getting export library name {self.pe.get_string_at_rva(export_library_name_rva)} for file: {self.hash.sha256} {e}"
                    )
                    export_library_name = "REDB_ERROR"
                if hasattr(self.pe.DIRECTORY_ENTRY_EXPORT, "symbols"):
                    for exp in self.pe.DIRECTORY_ENTRY_EXPORT.symbols:
                        export_symbols_list.append(
                            exp.name.decode() if exp.name else None
                        )
        except Exception as e:
            self.log.error(f"Extract exports error {self.hash.sha256} Exception: {e}")

        return (
            export_library_name if export_library_name else None,
            export_library_name_raw if export_library_name_raw else None,
            export_symbols_list if export_symbols_list else None,
            export_timestamp if export_timestamp else None,
        )

    def _extract_dbg_info(self):
        """Extract debug information from PE if present

        At the moment this function parses only the DEBUG_ENTRY Structure where Type
        field == 1, i.e. IMAGE_DEBUG_TYPE_CODEVIEW, where the pdb is eventually present.

        Returns:
        debug_entry: the dump of pe.DIRECTORY_ENTRY_DEBUG.struct only for the type 1
                    "IMAGE_DEBUG_TYPE_CODEVIEW". "None" if not present.
        debug_time: a int representing the epoch timestamp as present in the
                    DIRECTORY_ENTRY_DEBUG. "None" if not present.
        pdb_info: a str with the pdb path. "None" if not present.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        dbg_timestamp = None
        dbg_timestamp_utc = ""
        dbg_pdb_info = ""
        dbg_pdb_info_raw = ""
        dbg_struct = ""
        try:
            if hasattr(self.pe, "DIRECTORY_ENTRY_DEBUG"):
                for debug_entry in self.pe.DIRECTORY_ENTRY_DEBUG:
                    if (
                        debug_entry.struct.Type
                        == pefile.DEBUG_TYPE["IMAGE_DEBUG_TYPE_CODEVIEW"]
                    ):
                        dbg_timestamp = debug_entry.struct.TimeDateStamp
                        dbg_timestamp_utc = datetime.fromtimestamp(
                            dbg_timestamp, timezone.utc
                        ).strftime("%Y-%m-%d %H:%M:%S")
                        # dbg_struct = base64.b64encode(debug_entry.entry).decode()
                        dbg_struct = debug_entry.entry.__str__()
                        if hasattr(debug_entry.entry, "PdbFileName"):
                            dbg_pdb_info = self.remove_non_utf8(
                                debug_entry.entry.PdbFileName.rstrip(b"\x00")
                            ).decode()
                            dbg_pdb_info_raw = debug_entry.entry.PdbFileName.rstrip(
                                b"\x00"
                            ).__str__()
                            # if dbg_pdb_info:
                            #     dbg_pdb_info = dbg_pdb_info.rstrip(b"\x00")
                            #     dbg_pdb_info = dbg_pdb_info.decode()

        except Exception as e:
            self.log.error(f"Extract DBG info error {self.hash.sha256} Exception: {e}")
        return (
            dbg_timestamp if dbg_timestamp else None,
            dbg_timestamp_utc if dbg_timestamp_utc else None,
            dbg_pdb_info if dbg_pdb_info else None,
            dbg_pdb_info_raw if dbg_pdb_info_raw else None,
            dbg_struct if dbg_struct else None,
        )

    def _extract_tls_info(self):
        """Check for the presence of Thread Local Storage and related extract
        callback addresses.

        Taken from the original version of PEScanner, as the python3 porting
        "ext_pescanner" does not have it.

        Returns:
        pe.DIRECTORY_ENTRY_TLS.struct: a pefile.Structure type containing the dump
                    of the TLS structure and content. "None" is no TLS is present.
        callbacks: a list containing the TLS callbacks addresse. Empty list if no
                    address is found, "None" is no TLS is present.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        callbacks = []
        tls_dir_struct = ""
        try:
            if (
                hasattr(self.pe, "DIRECTORY_ENTRY_TLS")
                and self.pe.DIRECTORY_ENTRY_TLS
                and self.pe.DIRECTORY_ENTRY_TLS.struct
                and self.pe.DIRECTORY_ENTRY_TLS.struct.AddressOfCallBacks
            ):
                # tls_dir_struct = base64.b64encode(self.pe.DIRECTORY_ENTRY_TLS.struct).decode()
                tls_dir_struct = self.pe.DIRECTORY_ENTRY_TLS.struct.__str__()
                callback_array_rva = (
                    self.pe.DIRECTORY_ENTRY_TLS.struct.AddressOfCallBacks
                    - self.pe.OPTIONAL_HEADER.ImageBase
                )
                # Originally it was while True
                # todo while can't be used cause risky
                # what maximum range makes sense to add here?
                for idx in range(10000):
                    func = self.pe.get_dword_from_data(
                        self.pe.get_data(callback_array_rva + 4 * idx, 4), 0
                    )
                    if func == 0:
                        break
                    callbacks.append(func)
        except Exception as e:
            self.log.error(f"Extract TLS error {self.hash.sha256} Exception: {e}")
        return callbacks if callbacks else None, tls_dir_struct if tls_dir_struct else None

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

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            (
                export_library_name,
                export_library_name_raw,
                export_symbols_list,
                export_timestamp,
            ) = self._extract_exports()
            (
                dbg_timestamp,
                dbg_timestamp_utc,
                dbg_pdb_info,
                dbg_pdb_info_raw,
                dbg_struct,
            ) = self._extract_dbg_info()
            tls_callbacks, tls_struct = self._extract_tls_info()
            rich_header_dump, rich_header_parsed = self._extract_rich_header()

            is_dotnet = self._check_dotnet()

            number_of_resources = 0
            number_of_imports = 0
            if hasattr(self.pe, "DIRECTORY_ENTRY_RESOURCE"):
                number_of_resources = len(self.pe.DIRECTORY_ENTRY_RESOURCE.entries)
            if hasattr(self.pe, "DIRECTORY_ENTRY_IMPORT"):
                number_of_imports = len(self.pe.DIRECTORY_ENTRY_IMPORT)

            self.pe_features = PE(
                type=self._extract_type(),
                magic=hex(self.pe.OPTIONAL_HEADER.Magic),
                entry_point=hex(self.pe.OPTIONAL_HEADER.AddressOfEntryPoint),
                major_linker_version=self.pe.OPTIONAL_HEADER.MajorLinkerVersion,
                minor_linker_version=self.pe.OPTIONAL_HEADER.MinorLinkerVersion,
                target_machine=self.pe.FILE_HEADER.Machine,
                architecture=self._extract_architecture(),
                compilation_time=self.pe.FILE_HEADER.TimeDateStamp,
                compilation_time_utc=datetime.fromtimestamp(
                    self.pe.FILE_HEADER.TimeDateStamp, timezone.utc
                ).strftime("%Y-%m-%d %H:%M:%S"),
                rich_header_dump=rich_header_dump,
                rich_header_parsed=rich_header_parsed,
                dos_header=self.pe.DOS_HEADER.__str__(),
                nt_header=self.pe.NT_HEADERS.__str__(),
                optional_header=self.pe.OPTIONAL_HEADER.__str__(),
                file_header=self.pe.FILE_HEADER.__str__(),
                version_info=self._extract_version_info(),
                export_library_name=export_library_name,
                export_library_name_raw=export_library_name_raw,
                export_symbols_list=export_symbols_list,
                export_timestamp=export_timestamp,
                is_dotnet=is_dotnet,
                dbg_timestamp=dbg_timestamp,
                dbg_timestamp_utc=dbg_timestamp_utc,
                dbg_pdb_info=dbg_pdb_info,
                dbg_pdb_info_raw=dbg_pdb_info_raw,
                dbg_struct=dbg_struct,
                tls_callbacks=tls_callbacks,
                tls_struct=tls_struct,
                is_signed=self._is_signed(),
                has_overlay=self._has_overlay(),
                number_of_sections=len(self.pe.sections),
                number_of_imports=number_of_imports,
                number_of_exports=(
                    len(export_symbols_list) if export_symbols_list else 0
                ),
                number_of_resources=number_of_resources,
            )
            return self.pe_features
        except Exception as e:
            self.log.error(f"Error extracting PE features {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)
        if exporter_type == "ElasticsearchExporter":
            return self.pe_features
        elif exporter_type == "ClickHouseExporter":
            try:
                pe_dump = self.pe.dump_dict()   
                # Convert PE headers directly to JSON
                dos_header_raw = json.dumps(pe_dump['DOS_HEADER'])
                nt_header_raw = json.dumps(pe_dump['NT_HEADERS'])
                optional_header_raw = json.dumps(pe_dump['OPTIONAL_HEADER'])
                file_header_raw = json.dumps(pe_dump['FILE_HEADER'])

                # Convert magic and entry_point from hex strings to integers
                magic_raw = int(self.pe_features.magic, 16) if isinstance(self.pe_features.magic, str) else self.pe_features.magic
                entry_point = int(self.pe_features.entry_point, 16) if isinstance(self.pe_features.entry_point, str) else self.pe_features.entry_point

                # Convert target_machine to string if it's an integer
                target_machine = str(self.pe_features.target_machine) if isinstance(self.pe_features.target_machine, int) else self.pe_features.target_machine

                # debug struct
                dbg_struct_raw = {}
                if self.pe_features.dbg_struct:
                    if hasattr(self.pe, "DIRECTORY_ENTRY_DEBUG"):
                        for debug_entry in self.pe.DIRECTORY_ENTRY_DEBUG:
                            if (
                                debug_entry.struct.Type
                                == pefile.DEBUG_TYPE["IMAGE_DEBUG_TYPE_CODEVIEW"]
                            ):
                                dbg_struct_raw = json.dumps(debug_entry.struct.__dict__)

                # tls struct
                tls_struct_raw = {}
                if self.pe_features.tls_struct:
                    if (
                        hasattr(self.pe, "DIRECTORY_ENTRY_TLS")
                        and self.pe.DIRECTORY_ENTRY_TLS
                        and self.pe.DIRECTORY_ENTRY_TLS.struct
                        and self.pe.DIRECTORY_ENTRY_TLS.struct.AddressOfCallBacks
                    ):
                        tls_struct_raw = json.dumps(self.pe.DIRECTORY_ENTRY_TLS.struct.__dict__)

                # Ensure arrays are properly initialized
                rich_header_parsed = []
                if self.pe_features.rich_header_parsed:
                    if isinstance(self.pe_features.rich_header_parsed, str):
                        rich_header_parsed = [x for x in self.pe_features.rich_header_parsed.split("\n") if x]
                    elif isinstance(self.pe_features.rich_header_parsed, list):
                        rich_header_parsed = self.pe_features.rich_header_parsed

                version_info = self.pe_features.version_info if self.pe_features.version_info else []
                version_info_raw = {}
                if version_info:
                    for finfo in self.pe.FileInfo:
                        for entry in finfo:
                            if hasattr(entry, "StringTable"):
                                for st_entry in entry.StringTable:
                                    for key, str_entry in list(st_entry.entries.items()):
                                        version_info_raw[key.decode()] = str_entry.decode()
                version_info_raw = json.dumps(version_info_raw) if version_info_raw else "{}"

                export_symbols_list = self.pe_features.export_symbols_list if self.pe_features.export_symbols_list else []
                tls_callbacks = self.pe_features.tls_callbacks if self.pe_features.tls_callbacks else []

                # Prepare data array
                data = [[
                    self.sha256,
                    self.md5,
                    self.sha1,
                    self.pe_features.dos_header,
                    dos_header_raw,
                    self.pe_features.nt_header,
                    nt_header_raw,
                    self.pe_features.optional_header,
                    optional_header_raw,
                    self.pe_features.file_header,
                    file_header_raw,
                    magic_raw,
                    entry_point,
                    self.pe_features.major_linker_version,
                    self.pe_features.minor_linker_version,
                    target_machine,
                    self.pe_features.architecture,
                    self.pe_features.compilation_time,
                    1 if self.pe_features.is_dotnet else 0,
                    1 if self.pe_features.is_signed else 0,
                    1 if self.pe_features.has_overlay else 0,
                    self.pe_features.number_of_sections,
                    self.pe_features.number_of_imports,
                    self.pe_features.number_of_exports,
                    self.pe_features.number_of_resources,
                    self.pe_features.type,
                    self.pe_features.dbg_struct,
                    dbg_struct_raw,
                    self.pe_features.dbg_timestamp,
                    self.pe_features.dbg_pdb_info,
                    self.pe_features.dbg_pdb_info_raw,
                    self.pe_features.tls_struct,
                    tls_struct_raw,
                    self.pe_features.export_timestamp,
                    self.pe_features.export_library_name,
                    self.pe_features.export_library_name_raw,
                    self.pe_features.rich_header_dump if self.pe_features.rich_header_dump else "{}",
                    rich_header_parsed,
                    version_info,
                    version_info_raw,
                    export_symbols_list,
                    tls_callbacks,
                    datetime.now(timezone.utc)
                ]]

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'dos_header', 'dos_header_raw', 'nt_header', 'nt_header_raw', 'optional_header', 'optional_header_raw', 'file_header', 'file_header_raw',
                    'magic_raw', 'entry_point',
                    'major_linker_version', 'minor_linker_version',
                    'target_machine', 'architecture',
                    'compilation_time',
                    'is_dotnet', 'is_signed', 'has_overlay',
                    'number_of_sections', 'number_of_imports', 'number_of_exports', 'number_of_resources',
                    'type',
                    'dbg_struct', 'dbg_struct_raw', 'dbg_timestamp', 'dbg_pdb_info', 'dbg_pdb_info_raw',
                    'tls_struct', 'tls_struct_raw', 'export_timestamp', 'export_library_name', 'export_library_name_raw',
                    'rich_header_dump', 'rich_header_parsed', 'version_info', 'version_info_raw',
                    'export_symbols_list', 'tls_callbacks',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'String', 'JSON', 'String', 'JSON', 'String', 'JSON', 'String', 'JSON',
                    'UInt16', 'UInt32',
                    'UInt8', 'UInt8',
                    'LowCardinality(String)', 'Enum8(\'x86\' = 1, \'Itanium\' = 2, \'x64\' = 3)',
                    'UInt64',
                    'UInt8', 'UInt8', 'UInt8',
                    'UInt16', 'UInt16', 'UInt16', 'UInt16',
                    'Enum8(\'DLL\' = 1, \'EXE\' = 2, \'DRIVER\' = 3)',
                    'Nullable(String)', 'JSON', 'Nullable(UInt64)', 'Nullable(String)', 'Nullable(String)',
                    'Nullable(String)', 'JSON', 'Nullable(UInt64)', 'Nullable(String)', 'Nullable(String)',
                    'JSON', 'Array(Nullable(String))', 'Array(Nullable(String))', 'JSON',
                    'Array(Nullable(String))', 'Array(Nullable(UInt64))',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)
            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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