Ovidio Salvetti

113 papers A* 1A 1B 3C 6Misc 1Journal 29Unranked 67
YearRankTypeTitle / Venue / Authors
2023 conf
SITIS
Giacomo Ignesti, Chiara Deri, Gennaro D'Angelo, Lorenza Pratali, Antonio Bruno, Antonio Benassi, Ovidio Salvetti, Davide Moroni, Massimo Martinelli
2022 conf
SITIS
Giacomo Ignesti, Antonio Bruno, Chiara Deri, Gennaro D'Angelo, Luca Bastiani, Lorenza Pratali, Silvia Memmini, Davide Cicalini, Alessandro Dini, Giulio Galesi, Francesca Pardini, Marco Tampucci, Antonio Benassi, Ovidio Salvetti, Davide Moroni, Massimo Martinelli
2019 conf
APPIS
Danila Germanese, Maria Antonietta Pascali, Andrea Berton, Giuseppe Riccardo Leone, Bushra Jalil, Davide Moroni, Ovidio Salvetti, Marco Tampucci
2019 J jnl
IEEE J. Biomed. Health Informatics
Eleftherios Kontopodis, Maria Venianaki, Georgios C. Manikis, Katerina Nikiforaki, Ovidio Salvetti, Efrosini Papadaki, Georgios Z. Papadakis, Apostolos Karantanas, Kostas Marias
2018 J jnl
Comput. Methods Programs Biomed.
Bushra Jalil, Valentina Hartwig, Ovidio Salvetti, Luca Potì, Luna Gargani, Tatiana Barskova, Marco Matucci Cerinic, Antonio L'Abbate
2018 conf
BHI
Maria Venianaki, Apostolos Karantanas, Eelco de Bree, Thomas G. Maris, Eleftherios Kontopodis, Katerina Nikiforaki, Ovidio Salvetti, Kostas Marias
2018 J jnl
Multim. Tools Appl.
Maria Venianaki, Ovidio Salvetti, Eelco de Bree, Thomas G. Maris, Apostolos Karantanas, Eleftherios Kontopodis, Katerina Nikiforaki, Kostas Marias
2018 J jnl
Multim. Tools Appl.
Maria Venianaki, Ovidio Salvetti, Eelco de Bree, Thomas G. Maris, Apostolos Karantanas, Eleftherios Kontopodis, Katerina Nikiforaki, Kostas Marias
2018 Misc conf
MISSI
Bushra Jalil, Maria Antonietta Pascali, Giuseppe Riccardo Leone, Massimo Martinelli, Davide Moroni, Ovidio Salvetti
2017 conf
STAG
Marianna Saba, Fabio Sorrentino, Alessandro Muntoni, Sara Casti, Gianmarco Cherchi, Alessandro Carcangiu, Fabrizio Corda, Alessio Murru, Lucio Davide Spano, Riccardo Scateni, Ilaria Vitali, Ovidio Salvetti, Massimo Magrini, Andrea Villa, Andrea Carboni, Maria Antonietta Pascali
2017 J jnl
Sensors
Giuseppe Riccardo Leone, Davide Moroni, Gabriele Pieri, Matteo Petracca, Ovidio Salvetti, Andrea Azzara, Francesco Marino
2017 conf
IWCIM@EUSIPCO
Davide Moroni, Gabriele Pieri, Marco Tampucci, Ovidio Salvetti
2017 J jnl
Pattern Recognit.
Alessandro Danielis, Daniela Giorgi, Marcus Larsson, Tomas Strömberg, Sara Colantonio, Ovidio Salvetti
2017 J jnl
IEEE Trans. Multim.
Pedro Henríquez, Bogdan J. Matuszewski, Yasmina Andreu, Luca Bastiani, Sara Colantonio, Giuseppe Coppini, Mario D'Acunto, Riccardo Favilla, Danila Germanese, Daniela Giorgi, Paolo Marraccini, Massimo Martinelli, Maria-Aurora Morales, Maria Antonietta Pascali, Marco Righi, Ovidio Salvetti, Marcus Larsson, Tomas Strömberg, Lise Randeberg, Asgeir Bjorgan, Giorgos A. Giannakakis, Matthew Pediaditis, Franco Chiarugi, Eirini Christinaki, Kostas Marias, Manolis Tsiknakis
2017 J jnl
Vis. Comput.
Daniela Giorgi, Maria Antonietta Pascali, Pedro Henríquez, Bogdan J. Matuszewski, Sara Colantonio, Ovidio Salvetti
2017 conf
IWCIM@EUSIPCO
Giuseppe Amato, Paolo Barsocchi, Fabrizio Falchi, Erina Ferro, Claudio Gennaro, Giuseppe Riccardo Leone, Davide Moroni, Ovidio Salvetti, Claudio Vairo
2016 J jnl
Signal Image Video Process.
Mario D'Acunto, Antonio Benassi, Davide Moroni, Ovidio Salvetti
2016 conf
CGI (Short Papers)
Maria Venianaki, Eleftherios Kontopodis, Katerina Nikiforaki, Eelco de Bree, Ovidio Salvetti, Kostas Marias
2016 J jnl
Signal Image Video Process.
Mario D'Acunto, Marco Righi, Ovidio Salvetti
2016 conf
IWCIM
Giuseppe Riccardo Leone, Massimo Magrini, Davide Moroni, Gabriele Pieri, Ovidio Salvetti, Marco Tampucci
2016 conf
ECCV Workshops (2)
Massimo Magrini, Ovidio Salvetti, Andrea Carboni, Olivia Curzio
2016 conf
IWCIM
Massimo Magrini, Davide Moroni, Maria Antonietta Pascali, Marco Reggiannini, Ovidio Salvetti, Marco Tampucci
2016 J jnl
Comput. Methods Programs Biomed.
Bushra Jalil, Ovidio Salvetti, Luca Potì, Valentina Hartwig, Martina Marinelli, Antonio L'Abbate
2015 conf
ApplePies
Danila Germanese, Marco Righi, Antonio Benassi, Mario D'Acunto, Giuseppe Riccardo Leone, Massimo Magrini, Paolo Paradisi, Dario Puppi, Ovidio Salvetti
2015 conf
REHAB (Revised Selected Papers)
Massimo Magrini, Andrea Carboni, Ovidio Salvetti, Olivia Curzio
2015 conf
REHAB
Massimo Magrini, Andrea Carboni, Ovidio Salvetti, Olivia Curzio
2015 conf
ITSC
Massimo Magrini, Davide Moroni, Giovanni Palazzese, Gabriele Pieri, Ovidio Salvetti, Daniele Azzarelli, Antonio Spada
2015 conf
IWCIM
Massimo Magrini, Alessandra Virgillito, Umberto Barcaro, Luca Bonfiglio, Gabriele Pieri, Ovidio Salvetti, Maria Chiara Carboncini
2015 conf
ITSC
Massimo Magrini, Davide Moroni, Giovanni Palazzese, Gabriele Pieri, Giuseppe Riccardo Leone, Ovidio Salvetti
2015 conf
IMTA
Andrea Fantini, Massimo Magrini, Salvatore Martino, Davide Moroni, Gabriele Pieri, Alberto Prestininzi, Ovidio Salvetti
2015 ed.
IMTA
Igor B. Gurevich, Heinrich Niemann, Ovidio Salvetti, Bernd Radig
2015 conf
VISAPP (2)
Massimo Magrini, Davide Moroni, Gabriele Pieri, Ovidio Salvetti
2015 A conf
ICME
Yasmina Andreu Cabedo, Pedro Castellano, Sara Colantonio, Giuseppe Coppini, Riccardo Favilla, Danila Germanese, Giorgos A. Giannakakis, Daniela Giorgi, Marcus Larsson, Paolo Marraccini, Massimo Martinelli, Bogdan J. Matuszewski, Matijia Milanic, Maria Antonietta Pascali, Matthew Pediaditis, Giovanni Raccichini, Lise Randeberg, Ovidio Salvetti, Tomas Strömberg
2015 conf
3DOR@Eurographics
Daniela Giorgi, Maria Antonietta Pascali, Giovanni Raccichini, Sara Colantonio, Ovidio Salvetti
2015 conf
IMTA
Marco Righi, Mario D'Acunto, Ovidio Salvetti
2015 conf
IMTA
Davide Moroni, Maria Antonietta Pascali, Marco Reggiannini, Ovidio Salvetti
2015 conf
HCI (9)
Marianna Saba, Riccardo Scateni, Fabio Sorrentino, Lucio Davide Spano, Sara Colantonio, Daniela Giorgi, Massimo Magrini, Ovidio Salvetti, Novella Buonaccorsi, Ilaria Vitali
2015 C conf
ICVS
Benedetto Allotta, Riccardo Costanzi, Massimo Magrini, Niccolò Monni, Davide Moroni, Maria Antonietta Pascali, Marco Reggiannini, Alessandro Ridolfi, Ovidio Salvetti, Marco Tampucci
2015 conf
IMTA
Massimo Magrini, Maria Antonietta Pascali, Marco Reggiannini, Ovidio Salvetti, Marco Tampucci
2014 conf
InMed
Antonio Benassi, Sara Colantonio, Daniela Giorgi, Massimo Magrini, Massimo Martinelli, Maria Antonietta Pascali, Marco Righi, Ovidio Salvetti
2014 conf
HEALTHINF
Sara Colantonio, Massimo Martinelli, Ovidio Salvetti
2014 conf
SIU
Mario D'Acunto, Antonio Benassi, Davide Moroni, Ovidio Salvetti
2014 J jnl
ERCIM News
Sara Colantonio, Daniela Giorgi, Ovidio Salvetti
2014 C conf
ICPRAM
Sara Colantonio, Mario D'Acunto, Marco Righi, Ovidio Salvetti
2014 conf
HEALTHINF
Mario D'Acunto, Antonio Benassi, Federica Chiellini, Danila Germanese, Randa Ishak, Massimo Magrini, Emanuele Pagliei, Paolo Paradisi, Marco Righi, Ovidio Salvetti
2013 C conf
BIBE
Franco Chiarugi, Eirini Christinaki, Sara Colantonio, Giuseppe Coppini, Paolo Marraccini, Matthew Pediaditis, Ovidio Salvetti, Manolis Tsiknakis
2013 J jnl
ERCIM News
Massimo Martinelli, Davide Moroni, Ovidio Salvetti
2013 conf
EMS
Bushra Jalil, Ovidio Salvetti, Luca Potì, Martina Marinelli, Valentina Hartwig, Antonio L'Abbate, Silvia Burchielli
2012 J jnl
IEEE Trans. Inf. Technol. Biomed.
Sara Colantonio, Massimo Esposito, Massimo Martinelli, Giuseppe De Pietro, Ovidio Salvetti
2012 ed.
MUSCLE
Emanuele Salerno, A. Enis Çetin, Ovidio Salvetti
2012 conf
MDA
Mario D'Acunto, Antonio Benassi, Davide Moroni, Ovidio Salvetti
2012 J jnl
ERCIM News
Mario D'Acunto, Antonio Benassi, Ovidio Salvetti
2012 conf
CISIS/ICEUTE/SOCO Special Sessions
Sara Colantonio, Ovidio Salvetti
2012 conf
EuroMed
Benedetto Allotta, S. Bargagliotti, L. Botarelli, Andrea Caiti, Vincenzo Calabrò, G. Casa, Michele Cocco, Sara Colantonio, Carlo Colombo, S. Costa, Marco Fanfani, L. Franchi, P. Gambogi, Lavinio Gualdesi, Denise La Monica, Massimo Magrini, Massimo Martinelli, Davide Moroni, Andrea Munafò, Gordon J. Pace, C. Papa, Maria Antonietta Pascali, Gabriele Pieri, Marco Reggiannini, Marco Righi, Ovidio Salvetti, Marco Tampucci
2011 conf
MDA
Giuseppe Coppini, Riccardo Favilla, Paolo Marraccini, Davide Moroni, Gabriele Pieri, Ovidio Salvetti
2011 conf
MobiHealth
Sara Colantonio, Giuseppe De Pietro, Massimo Esposito, Alberto Machì, Massimo Martinelli, Ovidio Salvetti
2011 conf
KDIR
Mario D'Acunto, Stefano Berrettini, Serena Danti, Michele Lisanti, Mario Petrini, Andrea Pietrabissa, Ovidio Salvetti
2011 C conf
KEOD
Sara Colantonio, Massimo Martinelli, Ovidio Salvetti, Giuseppe De Pietro, Massimo Esposito, Alberto Machì
2011 conf
MUSCLE
Sara Colantonio, Massimo Martinelli, Ovidio Salvetti
2011 conf
MUSCLE
Massimo Magrini, Davide Moroni, Gabriele Pieri, Ovidio Salvetti
2011 conf
VAST (Short and Project Papers)
Benedetto Allotta, Andrea Caiti, Michele Cocco, Carlo Colombo, Walter Daviddi, Lavinio Gualdesi, Denise La Monica, Davide Moroni, Gabriele Pieri, Ovidio Salvetti, Marco Tampucci
2010 J jnl
Trans. Mass Data Anal. Images Signals
Massimo Martinelli, Davide Moroni, Ovidio Salvetti, Marco Tampucci
2010 J jnl
Artif. Intell. Medicine
Franco Chiarugi, Sara Colantonio, Dimitra Emmanouilidou, Massimo Martinelli, Davide Moroni, Ovidio Salvetti
2010 J jnl
J. Softw. Eng. Appl.
Suzanne Little, Sara Colantonio, Ovidio Salvetti, Petra Perner
2009 C conf
ISDA
Sara Colantonio, Massimo Martinelli, Davide Moroni, Ovidio Salvetti, Franco Chiarugi, Dimitra Emmanouilidou
2009 conf
MLDM Posters
Sara Colantonio, Igor B. Gurevich, Ovidio Salvetti, Yulia Trusova
2009 J jnl
Trans. Mach. Learn. Data Min.
Suzanne Little, Sara Colatino, Ovidio Salvetti, Petra Perner
2009 J jnl
Trans. Case Based Reason.
Sara Colantonio, Petra Perner, Ovidio Salvetti
2009 J jnl
Trans. Mass Data Anal. Images Signals
Giuseppe Coppini, Riccardo Favilla, Eleonora Lami, Paolo Marraccini, Davide Moroni, Ovidio Salvetti
2008 conf
SWWS
Sara Colantonio, Massimo Martinelli, Davide Moroni, Ovidio Salvetti, Antonio Candelieri, Domenico Conforti, Francesco Perticone, Angela Sciacqua, Christos Biniaris, Andy Marsh
2008 ed.
MDA
Petra Perner, Ovidio Salvetti
2008 A* conf
ICDM
Sara Colantonio, Ovidio Salvetti, Marco Tampucci
2008 conf
MDA
Franco Chiarugi, Sara Colantonio, Dimitra Emmanouilidou, Davide Moroni, Ovidio Salvetti
2008 conf
HEALTHINF (1)
Sara Colantonio, Massimo Martinelli, Davide Moroni, Ovidio Salvetti, Francesco Perticone, Angela Sciacqua, Franco Chiarugi, Domenico Conforti, Antonio Gualtieri, Vincenzo Lagani
2008 B conf
CBMS
Suzanne Little, Ovidio Salvetti, Petra Perner
2008 conf
ECCBR
Suzanne Little, Ovidio Salvetti, Petra Perner
2008 J jnl
EURASIP J. Adv. Signal Process.
A. Enis Çetin, Eric J. Pauwels, Ovidio Salvetti
2008 conf
HEALTHINF (2)
Igor B. Gurevich, Vera Yashina, Heinrich Niemann, Ovidio Salvetti
2008 conf
MDA
Davide Moroni, Mario Salvetti, Ovidio Salvetti
2007 conf
MDA
Davide Moroni, Petra Perner, Ovidio Salvetti
2007 ed.
MDA
Petra Perner, Ovidio Salvetti
2007 conf
SWAP
Sara Colantonio, Massimo Martinelli, Davide Moroni, Ovidio Salvetti, Francesco Perticone, Angela Sciacqua, Domenico Conforti, Antonio Gualtieri
2007 conf
VISAPP (Special Sessions)
Igor B. Gurevich, Irina Koryabkina, Vera Yashina, Heinrich Niemann, Ovidio Salvetti
2007 conf
MDA
Sara Colantonio, Igor B. Gurevich, Ovidio Salvetti
2007 conf
VISAPP (Special Sessions)
Davide Moroni, Sara Colantonio, Ovidio Salvetti, Mario Salvetti
2007 J jnl
ERCIM News
Sara Colantonio, Davide Moroni, Ovidio Salvetti
2007 C conf
CBMI
Suzanne Little, Massimo Martinelli, Ovidio Salvetti, Ugur Güdükbay, Özgür Ulusoy, Gaël de Chalendar, Gregory Grefenstette
2007 conf
VISAPP (Special Sessions)
Igor B. Gurevich, Dmitry Murashov, Ovidio Salvetti, Heinrich Niemann
2007 conf
ICDM Workshops
Suzanne Little, Ovidio Salvetti, Petra Perner
2007 conf
LWA
Suzanne Little, Ovidio Salvetti, Petra Perner
2007 conf
MDA
Suzanne Little, Ovidio Salvetti, Petra Perner
2007 conf
SAMT
Sara Colantonio, Igor B. Gurevich, Massimo Martinelli, Ovidio Salvetti, Yulia Trusova
2006 ed.
ICDM (Workshops)
Petra Perner, Ovidio Salvetti, Isabelle Bichindaritz
2006 conf
ICDM (Workshops)
Davide Moroni, Petra Perner, Ovidio Salvetti
2006 conf
EUSIPCO
Gabriele Pieri, Ovidio Salvetti
2006 conf
ICDM (Workshops)
Sara Colantonio, Igor B. Gurevich, Ovidio Salvetti
2006 conf
SWAP
Patrizia Asirelli, Suzanne Little, Massimo Martinelli, Ovidio Salvetti
2006 conf
Eurographics Italian Chapter Conference
Sara Colantonio, Davide Moroni, Ovidio Salvetti
2006 conf
ICPR (4)
Igor B. Gurevich, D. Kharazishvili, Dmitry Murashov, Ovidio Salvetti, Ivan Vorobjev
2003 J jnl
Artif. Intell. Medicine
Sergio Di Bona, Heinrich Niemann, Gabriele Pieri, Ovidio Salvetti
2002 J jnl
J. Electronic Imaging
Sergio Di Bona, Ovidio Salvetti
2001 conf
ICIP (1)
Sergio Di Bona, Ovidio Salvetti
2000 B conf
ICIP
Sergio Di Bona, Ovidio Salvetti
2000 conf
SSIAI
Sergio Di Bona, Ovidio Salvetti
1999 conf
Eurographics (Tutorials)
Barbara Caputo, Laura Moltedo, Antonella Troncone, Domenico Vitulano, Federico Pedersini, Augusto Sarti, Stefano Tubaro, Ovidio Salvetti, Paolo Salonia, Maurizio Rossi
1998 conf
HPCN Europe
M. Agostiniani, L. Azzarelli, M. Chimenti, Ovidio Salvetti
1998 B conf
AVI
Laura Moltedo, Giuseppe Mortelliti, Ovidio Salvetti
1997 conf
ICIP (1)
C. Di Sacco, L. Lutzember, Ovidio Salvetti
1997 J jnl
Comput. Networks ISDN Syst.
Daniele Marini, Maurizio Rossi, Laura Moltedo, Ovidio Salvetti
1996 J jnl
Artif. Intell. Medicine
Ovidio Salvetti, Giovanni Braccini, R. Evangelista, M. Freschi
1995 J jnl
J. Electronic Imaging
Paolo Marraccini, Ovidio Salvetti, Giovanni Braccini, Paolo Bragagni, Dianora Levorato, Antonio L'Abbate, Mario Marzilli
1991 conf
MIE
Giovanni Braccini, Davide Caramella, Ovidio Salvetti
1990 J jnl
Image Vis. Comput.
L. Azzarelli, M. Chimenti, Ovidio Salvetti, Heinz Brünig, Heinrich Niemann
redb/extractors/elf_extractor.py
← Index redb/extractors/elf_extractor.py python
import logging
from abc import ABCMeta, abstractmethod
import inspect

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.extractor import Extractor

logger = logging.getLogger(__name__)


@abstractmethod
class ELFExtractor(Extractor, metaclass=ABCMeta):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious
        )
        # Store ELF object if provided, otherwise we'll create it per-operation for security
        self._provided_elf = elf
        self._elf_file_valid = None  # Cache validity check

    def _with_elf_file(self, operation):
        """Safely execute an operation with an ELF file using context manager.

        Args:
            operation: A callable that takes an ELFFile object and returns a result

        Returns:
            The result of the operation, or None if an error occurred
        """
        if self._provided_elf:
            try:
                return operation(self._provided_elf)
            except ELFError as e:
                if "String Table not found" in str(e):
                    self.log.warning(f"String table missing in ELF {self.hash.sha256}: {e}")
                    return None
                else:
                    self.log.error(f"ELF format error {self.hash.sha256} Full error: {e}")
                    return None
            except Exception as e:
                self.log.error(f"Error processing ELF file {self.hash.sha256} Full error: {e}")
                return None

        try:
            with open(self.filepath, 'rb') as f:
                elf = ELFFile(f)
                if not elf:
                    raise ELFError("Empty file?")
                return operation(elf)
        except ELFError as e:
            if "String Table not found" in str(e):
                self.log.warning(f"String table missing in ELF {self.hash.sha256}: {e}")
                return None
            else:
                self.log.error(f"ELF format error {self.hash.sha256} Full error: {e}")
                return None
        except Exception as e:
            self.log.error(f"Error reading ELF file {self.hash.sha256} Full error: {e}")
            return None

    def _is_elf_file(self):
        """Check if the file is a valid ELF binary."""
        if self._elf_file_valid is not None:
            return self._elf_file_valid

        def check_elf_validity(elf):
            # pyelftools ELFFile object existing means it's valid ELF
            # Just check that we can access the header
            header = elf.header
            return header is not None

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

    def _is_64bit(self):
        """Check if the ELF binary is 64-bit."""
        def check_64bit(elf):
            return elf.header.get('e_ident', {}).get('EI_CLASS') == 'ELFCLASS64'

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

    def _is_stripped(self):
        """Check if the ELF binary is stripped (no symbol table)."""
        def check_stripped(elf):
            # Look for symbol table sections
            for section in elf.iter_sections():
                if section.name in ['.symtab', '.strtab']:
                    return False
            return True

        try:
            result = self._with_elf_file(check_stripped)
            return result if result is not None else True
        except Exception as e:
            self.log.error(f"Error checking if ELF is stripped: {e}")
            return True

    def _has_debug_info(self):
        """Check if the ELF binary contains debug information."""
        def check_debug_info(elf):
            # Look for debug sections
            debug_sections = ['.debug_info', '.debug_line', '.debug_str', '.debug_abbrev']
            for section in elf.iter_sections():
                if section.name in debug_sections:
                    return True
            return False

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

    def _get_architecture(self):
        """Get the architecture of the ELF binary."""
        def get_arch(elf):
            machine = elf.header.get('e_machine', 'EM_NONE')

            # Map common machine types to readable names
            arch_map = {
                'EM_386': 'x86',
                'EM_X86_64': 'x86_64',
                'EM_ARM': 'ARM',
                'EM_AARCH64': 'ARM64',
                'EM_MIPS': 'MIPS',
                'EM_PPC': 'PowerPC',
                'EM_PPC64': 'PowerPC64',
                'EM_SPARC': 'SPARC',
                'EM_RISCV': 'RISC-V'
            }

            return arch_map.get(machine, machine)

        try:
            result = self._with_elf_file(get_arch)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting architecture: {e}")
            return "unknown"

    def _get_endianness(self):
        """Get the endianness of the ELF binary."""
        def get_endian(elf):
            data_encoding = elf.header.get('e_ident', {}).get('EI_DATA')
            if data_encoding == 'ELFDATA2LSB':
                return "little"
            elif data_encoding == 'ELFDATA2MSB':
                return "big"
            return "unknown"

        try:
            result = self._with_elf_file(get_endian)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting endianness: {e}")
            return "unknown"

    def _get_file_type(self):
        """Get the file type of the ELF binary."""
        def get_file_type(elf):
            etype = elf.header.get('e_type', 'ET_NONE')

            # Map file types to readable names
            type_map = {
                'ET_NONE': 'none',
                'ET_REL': 'relocatable',
                'ET_EXEC': 'executable',
                'ET_DYN': 'shared_object',
                'ET_CORE': 'core_dump'
            }

            return type_map.get(etype, etype)

        try:
            result = self._with_elf_file(get_file_type)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting file type: {e}")
            return "unknown"

    def _is_pie(self):
        """Check if the ELF binary is position-independent executable."""
        def check_pie(elf):
            # PIE binaries are typically ET_DYN type
            etype = elf.header.get('e_type', 'ET_NONE')
            if etype == 'ET_DYN':
                # Check if it has an entry point (executable) vs library
                entry_point = elf.header.get('e_entry', 0)
                return entry_point > 0
            return False

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

    def _has_stack_protection(self):
        """Check if the binary has stack protection (canaries)."""
        def check_stack_protection(elf):
            # Look for stack protection symbols
            stack_symbols = ['__stack_chk_fail', '__stack_chk_guard']

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

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

    def _has_nx_bit(self):
        """Check if the binary has NX bit (non-executable stack)."""
        def check_nx_bit(elf):
            # Look for GNU_STACK segment
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_GNU_STACK':
                    flags = segment.header.get('p_flags', 0)
                    # Check if execute flag is NOT set (NX enabled)
                    return not (flags & 0x1)  # PF_X = 0x1
            return False

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

    def _has_relro(self):
        """Check if the binary has RELRO (Relocation Read-Only)."""
        def check_relro(elf):
            # Look for GNU_RELRO segment
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_GNU_RELRO':
                    return True
            return False

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

    def _get_build_id(self):
        """Extract build ID from notes section."""
        def get_build_id(elf):
            # Look for build ID in notes sections
            for section in elf.iter_sections():
                if section.name == '.note.gnu.build-id':
                    for note in section.iter_notes():
                        if note['n_type'] == 'NT_GNU_BUILD_ID':
                            # Convert bytes to hex string
                            build_id = note['n_desc']
                            if isinstance(build_id, bytes):
                                return build_id.hex()
                            return str(build_id)
            return None

        try:
            result = self._with_elf_file(get_build_id)
            return result
        except Exception as e:
            self.log.error(f"Error getting build ID: {e}")
            return None

    def _count_sections(self):
        """Count the number of sections in the ELF file."""
        def count_sections(elf):
            return elf.header.get('e_shnum', 0)

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

    def _count_segments(self):
        """Count the number of segments (program headers) in the ELF file."""
        def count_segments(elf):
            return elf.header.get('e_phnum', 0)

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

    def _count_symbols(self):
        """Count the total number of symbols in symbol tables."""
        def count_symbols(elf):
            symbol_count = 0
            for section in elf.iter_sections():
                if hasattr(section, 'iter_symbols'):
                    symbol_count += section.num_symbols()
            return symbol_count

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

    def _get_dependencies(self):
        """Get list of dynamic dependencies."""
        def get_dependencies(elf):
            dependencies = []
            dynamic_section = elf.get_section_by_name('.dynamic')
            if dynamic_section:
                for tag in dynamic_section.iter_tags():
                    if tag.entry.d_tag == 'DT_NEEDED':
                        dependencies.append(tag.needed)
            return dependencies

        try:
            result = self._with_elf_file(get_dependencies)
            return result if result is not None else []
        except Exception as e:
            self.log.error(f"Error getting dependencies: {e}")
            return []