Camillo Gentile

62 papers B 10Misc 4Journal 31Unranked 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Access
Raied Caromi, Samuel Berweger, Anuraag Bodi, Jelena Senic, Neeraj Varshney, Jack Chuang, Camillo Gentile
2026 J jnl
IEEE Trans. Wirel. Commun.
Lihao Zhang, Haijian Sun, Samuel Berweger, Camillo Gentile, Rose Qingyang Hu
2026 J jnl
CoRR
Zhenlin An, Longfei Shangguan, John Kaewell, Philip Pietraski, Jelena Senic, Camillo Gentile, Nada Golmie, Kyle Jamieson
2025 J jnl
IEEE Trans. Wirel. Commun.
Anish Shastri, Steve Blandino, Camillo Gentile, Chiehping Lai, Paolo Casari
2024 J jnl
IEEE Trans. Wirel. Commun.
Akbar M. Sayeed, Damla Guven, Michael Döbereiner, Sebastian Semper, Camillo Gentile, Anuraag Bodi, Zihang Cheng
2024 Misc conf
ICASSP
Steve Blandino, Jihoon Bang, Jian Wang, Samuel Berweger, Jack Chuang, Jelena Senic, Tanguy Ropitault, Camillo Gentile, Nada Golmie
2024 J jnl
IEEE Trans. Veh. Technol.
William Sloane, Mansoor Shafi, Camillo Gentile, Chiehping Lai, Jian Wang, Graeme Woodward, Philippa A. Martin
2024 J jnl
CoRR
Lihao Zhang, Haijian Sun, Samuel Berweger, Camillo Gentile, Rose Qingyang Hu
2024 J jnl
CoRR
Anish Shastri, Steve Blandino, Camillo Gentile, Chiehping Lai, Paolo Casari
2024 J jnl
IEEE Internet Things J.
Jian Wang, Jack Chuang, Samuel Berweger, Camillo Gentile, Nada Golmie
2024 Misc conf
ICASSP
Sebastian Semper, Jack Chuang, Samuel Berweger, Camillo Gentile
2023 J jnl
IEEE Internet Things J.
Neeraj Varshney, Samuel Berweger, Jack Chuang, Steve Blandino, Jian Wang, Neha Pazare, Camillo Gentile, Nada Golmie
2023 J jnl
IEEE Open J. Commun. Soc.
Anmol Bhardwaj, Jack Chuang, Camillo Gentile, Chiehping Lai
2023 J jnl
IEEE Access
Chiehping Lai, Damir Senic, Camillo Gentile, Jelena Senic, Nada Golmie
2022 J jnl
IEEE Internet Things J.
Jian Wang, Neeraj Varshney, Camillo Gentile, Steve Blandino, Jack Chuang, Nada Golmie
2022 B conf
WCNC
Jiayi Zhang, Steve Blandino, Neeraj Varshney, Jian Wang, Camillo Gentile, Nada Golmie
2022 J jnl
IEEE Access
Swagato Mukherjee, Gregory Skidmore, Tarun Chawla, Anmol Bhardwaj, Camillo Gentile, Jelena Senic
2021 J jnl
CoRR
Akbar M. Sayeed, Peter G. Vouras, Camillo Gentile, Alec Weiss, Jeanne T. Quimby, Zihang Cheng, Bassel Modad, Yuning Zhang, Chethan Kumar Anjinappa, Fatih Erden, Özgür Özdemir, Robert Müller, Diego A. Dupleich, Han Niu, David G. Michelson, Aidan Hughes
2021 B conf
PIMRC
William Sloane, Mansoor Shafi, Camillo Gentile, Graeme Woodward, Philippa A. Martin, Pan Tang, Jianhua Zhang, Chiehping Lai
2021 J jnl
IEEE Access
Anmol Bhardwaj, Derek Caudill, Camillo Gentile, Jack Chuang, Jelena Senic, David G. Michelson
2020 conf
GLOBECOM (Workshops)
Akbar M. Sayeed, Peter G. Vouras, Camillo Gentile, Alec Weiss, Jeanne T. Quimby, Zihang Cheng, Bassel Modad, Yuning Zhang, Chethan Kumar Anjinappa, Fatih Erden, Özgür Özdemir, Robert Müller, Diego A. Dupleich, Han Niu, David G. Michelson, Aidan Hughes
2020 J jnl
IEEE Access
Jack Chuang, Jelena Senic, Chunmei Liu, Camillo Gentile, Sung Yun Jun, Derek Caudill
2020 J jnl
IEEE Trans. Veh. Technol.
Romain Charbonnier, Chiehping Lai, Thierry Tenoux, Derek Caudill, Grégory Gougeon, Jelena Senic, Camillo Gentile, Yoann Corre, Jack Chuang, Nada Golmie
2020 J jnl
IEEE Trans. Wirel. Commun.
Camillo Gentile, Andreas F. Molisch, Jack Chuang, David G. Michelson, Anuraag Bodi, Anmol Bhardwaj, Özgür Özdemir, Wahab Ali Gulzar Khawaja, Ismail Güvenç, Zihang Cheng, François Rottenberg, Thomas Choi, Robert Müller, Han Niu, Diego A. Dupleich
2020 B conf
GLOBECOM
Mattia Lecci, Michele Polese, Chiehping Lai, Jian Wang, Camillo Gentile, Nada Golmie, Michele Zorzi
2020 J jnl
CoRR
Mattia Lecci, Michele Polese, Chiehping Lai, Jian Wang, Camillo Gentile, Nada Golmie, Michele Zorzi
2020 Misc conf
ITA
Mattia Lecci, Paolo Testolina, Marco Giordani, Michele Polese, Tanguy Ropitault, Camillo Gentile, Neeraj Varshney, Anuraag Bodi, Michele Zorzi
2020 J jnl
CoRR
Mattia Lecci, Paolo Testolina, Marco Giordani, Michele Polese, Tanguy Ropitault, Camillo Gentile, Neeraj Varshney, Anuraag Bodi, Michele Zorzi
2019 conf
ICC
Anuraag Bodi, Jiayi Zhang, Jian Wang, Camillo Gentile
2018 J jnl
Digit. Commun. Networks
Richard Rouil, Wesley Garey, Camillo Gentile, Nada Golmie, Patrick Schwinghammer
2018 J jnl
IEEE Commun. Mag.
Camillo Gentile, Peter B. Papazian, Nada Golmie, Kate A. Remley, Peter G. Vouras, Jelena Senic, Jian Wang, Derek Caudill, Chiehping Lai, Ruoyu Sun, Jack Chuang
2018 J jnl
IEEE Commun. Mag.
Ruoyu Sun, Camillo Gentile, Jelena Senic, Peter G. Vouras, Peter B. Papazian, Nada Golmie, Kate A. Remley
2017 B conf
WCNC
Jae-Kark Choi, Camillo Gentile
2017 conf
VTC Fall
Kate A. Remley, Camillo Gentile, Alenka G. Zajic, Jeanne T. Quimby
2017 conf
VTC Fall
Jian Wang, Camillo Gentile, Jelena Senic, Ruoyu Sun, Peter B. Papazian, Chiehping Lai
2016 conf
GLOBECOM Workshops
Camillo Gentile, Jelena Senic, Peter B. Papazian, Jae-Kark Choi, Kate A. Remley
2013 conf
ICC
Camillo Gentile
2013 J jnl
IEEE Veh. Technol. Mag.
Richard Rouil, Antonio Izquierdo, Michael R. Souryal, Camillo Gentile, David W. Griffith, Nada Golmie
2012 B conf
GLOBECOM
Camillo Gentile, Fabien Valoit, Nader Moayeri
2012 conf
ICC
Camillo Gentile, David W. Matolak, Kate A. Remley, Chris L. Holloway, Qiong Wu, Qian Zhang
2012 J jnl
IEEE Netw.
Camillo Gentile, David W. Griffith, Michael R. Souryal
2011 conf
ICC
Camillo Gentile, David W. Griffith, Michael R. Souryal, Nada Golmie
2010 conf
ICC
Camillo Gentile, Nada Golmie, Kate A. Remley, Chris L. Holloway, William F. Young
2010 conf
PerMIS
Francine Amon, Camillo Gentile, Kate A. Remley
2010 conf
ICC
P. M. Shankar, Camillo Gentile
2009 B conf
GLOBECOM
Camillo Gentile, Sofia Martinez Lopez, Alfred Kik
2009 conf
ICC
A. Judson Braga, Camillo Gentile
2009 B conf
GLOBECOM
Camillo Gentile
2008 J jnl
EURASIP J. Wirel. Commun. Netw.
Camillo Gentile, A. Judson Braga, Alfred Kik
2008 conf
ICC
Camillo Gentile, A. Judson Braga, Alfred Kik
2007 J jnl
EURASIP J. Wirel. Commun. Netw.
Camillo Gentile, Alfred Kik
2007 B conf
GLOBECOM
Camillo Gentile, Alfred Kik
2007 J jnl
IEEE Trans. Wirel. Commun.
Camillo Gentile
2007 Misc conf
CISS
Camillo Gentile, John Shiu
2006 B conf
GLOBECOM
Camillo Gentile, Alfred Kik
2006 conf
ICC
Camillo Gentile
2004 conf
ICC
Camillo Gentile, Luke Klein-Berndt
2004 J jnl
IEEE Trans. Image Process.
Camillo Gentile, Octavia I. Camps, Mario Sznaier
2002 conf
VTC Spring
Camillo Gentile, Robert E. Van Dyck
2001 J jnl
IEEE Trans. Neural Networks
Camillo Gentile, Mario Sznaier
2001 conf
CVPR (2)
Camillo Gentile, Octavia I. Camps, Mario Sznaier
1999 B conf
IJCNN
Camillo Gentile, Mario Sznaier
redb/extractors/elf_extractors/elf_segments.py
← Index redb/extractors/elf_extractors/elf_segments.py python
import inspect
import hashlib
import math
from collections import Counter
from datetime import datetime, timezone
from typing import Any, List, Dict

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

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSegment


class ELFSegmentExtractor(ELFExtractor):

    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,
            elf,
        )
        self.elf_segments = []
        self.elastic_index = self.index_prefix + "-elf_segments"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _is_empty_result(self, extracted_data) -> bool:
        """
        Override: Empty segments is an ERROR, not a valid empty case.
        A valid ELF file must have segments (program headers).
        """
        # Always return False - empty segments should be treated as an error
        return False

    def _calculate_entropy(self, data: bytes) -> float:
        """Calculate Shannon entropy of data."""
        if not data:
            return 0.0

        try:
            # Count frequency of each byte
            byte_counts = Counter(data)
            data_len = len(data)

            # Calculate entropy
            entropy = 0.0
            for count in byte_counts.values():
                if count > 0:
                    frequency = count / data_len
                    entropy -= frequency * math.log2(frequency)

            return entropy
        except Exception as e:
            self.log.error(f"Error calculating entropy: {e}")
            return 0.0

    def _map_segment_type(self, p_type_str: str) -> int:
        """Map segment type string to enum value."""
        type_map = {
            'PT_NULL': 0,
            'PT_LOAD': 1,
            'PT_DYNAMIC': 2,
            'PT_INTERP': 3,
            'PT_NOTE': 4,
            'PT_SHLIB': 5,
            'PT_PHDR': 6,
            'PT_TLS': 7
        }
        return type_map.get(p_type_str, 0)

    def _decode_segment_flags(self, flags: int) -> List[str]:
        """Decode segment flags to human-readable strings."""
        flag_strings = []

        if flags & 0x1:  # PF_X
            flag_strings.append('EXECUTE')
        if flags & 0x2:  # PF_W
            flag_strings.append('WRITE')
        if flags & 0x4:  # PF_R
            flag_strings.append('READ')

        return flag_strings if flag_strings else ['NONE']

    def _extract_segment_data(self, segment) -> ELFSegment:
        """Extract data from a single segment with granular error handling."""
        # Initialize with safe defaults
        segment_type = 0
        segment_type_str = 'unknown'
        segment_flags = 0
        segment_flags_str = ['NONE']
        segment_offset = 0
        segment_vaddr = 0
        segment_paddr = 0
        segment_filesz = 0
        segment_memsz = 0
        segment_align = 0
        segment_entropy = 0.0
        segment_sha256 = ""
        segment_md5 = ""

        # Try to get segment header
        header = None
        try:
            header = segment.header
        except Exception as e:
            self.log.warning(f"Could not access segment header: {e}")
            return ELFSegment(
                segment_type=segment_type, segment_type_str=segment_type_str,
                segment_flags=segment_flags, segment_flags_str=segment_flags_str,
                segment_offset=segment_offset, segment_vaddr=segment_vaddr,
                segment_paddr=segment_paddr, segment_filesz=segment_filesz,
                segment_memsz=segment_memsz, segment_align=segment_align,
                segment_entropy=segment_entropy, segment_sha256=segment_sha256,
                segment_md5=segment_md5
            )

        # Extract segment type
        try:
            p_type_str = header.get('p_type', 'PT_NULL')
            segment_type = self._map_segment_type(p_type_str)
            segment_type_str = p_type_str.replace('PT_', '') if p_type_str.startswith('PT_') else p_type_str
        except Exception as e:
            self.log.warning(f"Could not extract segment type: {e}")

        # Extract segment flags
        try:
            segment_flags = header.get('p_flags', 0)
            segment_flags_str = self._decode_segment_flags(segment_flags)
        except Exception as e:
            self.log.warning(f"Could not extract segment flags: {e}")

        # Extract segment addresses and sizes
        try:
            segment_offset = header.get('p_offset', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment offset: {e}")

        try:
            segment_vaddr = header.get('p_vaddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment vaddr: {e}")

        try:
            segment_paddr = header.get('p_paddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment paddr: {e}")

        try:
            segment_filesz = header.get('p_filesz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment filesz: {e}")

        try:
            segment_memsz = header.get('p_memsz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment memsz: {e}")

        try:
            segment_align = header.get('p_align', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment align: {e}")

        # Calculate entropy and hashes for segment data (most likely to fail)
        try:
            if segment_filesz > 0:
                segment_data = segment.data()
                if segment_data:
                    # Calculate entropy
                    segment_entropy = self._calculate_entropy(segment_data)

                    # Calculate hashes
                    segment_sha256 = hashlib.sha256(segment_data).hexdigest()
                    segment_md5 = hashlib.md5(segment_data).hexdigest()
        except Exception as e:
            self.log.warning(f"Could not read segment data for hashing: {e}")
            # Keep defaults (0.0, "", "")

        return ELFSegment(
            segment_type=segment_type,
            segment_type_str=segment_type_str,
            segment_flags=segment_flags,
            segment_flags_str=segment_flags_str,
            segment_offset=segment_offset,
            segment_vaddr=segment_vaddr,
            segment_paddr=segment_paddr,
            segment_filesz=segment_filesz,
            segment_memsz=segment_memsz,
            segment_align=segment_align,
            segment_entropy=segment_entropy,
            segment_sha256=segment_sha256,
            segment_md5=segment_md5
        )

    def tag(self):
        return Tag.ELF_SEGMENTS.value if hasattr(Tag, 'ELF_SEGMENTS') else "elf_segments"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_segments(elf):
                segments_data = []

                # Iterate through all segments with per-segment error handling
                for segment_index, segment in enumerate(elf.iter_segments()):
                    try:
                        segment_data = self._extract_segment_data(segment)
                        if segment_data:
                            segments_data.append(segment_data)
                        else:
                            self.log.warning(f"Failed to extract data for segment {segment_index}")
                    except Exception as e:
                        self.log.warning(f"Error processing segment {segment_index}: {e}")
                        # Continue processing other segments

                return segments_data

            # Check if file is valid ELF
            if not self._is_elf_file():
                self.log.error(f"No valid ELF file for {self.hash.sha256}")
                return None

            segments_data = self._with_elf_file(extract_segments)
            if segments_data is None:
                return None

            self.elf_segments = segments_data
            return self.elf_segments

        except Exception as e:
            self.log.error(f"Error extracting ELF segments {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.elf_segments
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_segments:
                    return None

                # Prepare data arrays for all segments
                data = []
                current_time = datetime.now(timezone.utc)
                for segment in self.elf_segments:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        segment.segment_type,
                        segment.segment_type_str,
                        segment.segment_flags,
                        segment.segment_flags_str,
                        segment.segment_offset,
                        segment.segment_vaddr,
                        segment.segment_paddr,
                        segment.segment_filesz,
                        segment.segment_memsz,
                        segment.segment_align,
                        segment.segment_entropy,
                        segment.segment_sha256,
                        segment.segment_md5,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'segment_type', 'segment_type_str', 'segment_flags', 'segment_flags_str',
                    'segment_offset', 'segment_vaddr', 'segment_paddr',
                    'segment_filesz', 'segment_memsz', 'segment_align',
                    'segment_entropy', 'segment_sha256', 'segment_md5',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('NULL'=0, 'LOAD'=1, 'DYNAMIC'=2, 'INTERP'=3, 'NOTE'=4, 'SHLIB'=5, 'PHDR'=6, 'TLS'=7)",
                    'LowCardinality(String)',
                    'UInt32',
                    'Array(LowCardinality(String))',
                    'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64',
                    'Float64',
                    'FixedString(64)', 'FixedString(32)',
                    '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_elf_segments"