Carla Silva

54 papers A 1B 1C 2Journal 6Unranked 40
YearRankTypeTitle / Venue / Authors
2025 conf
SBQS
Camilo C. Almendra, Carla Silva, David Campelo
2025 ed.
SBLP
Hugo Musso Gualandi, André Murbach Maidl, Carla Silva, Jéssyka Vilela, Mariana Maia Peixoto
2025 J jnl
J. Softw. Evol. Process.
Mariana Maia Peixoto, Tony Gorschek, Daniel Méndez, Carla Silva, Davide Fucci
2024 C conf
IoTBDS
Felipe Faustino, Jéssyka Vilela, Carla Silva, Mariana Maia Peixoto
2024 C conf
IoTBDS
Alessandro Rodrigues, Jéssyka Vilela, Carla Silva
2024 conf
SBES
José Claudino Santos Neto, Carla Silva, Jéssyka Vilela, Mariana Maia Peixoto
2024 conf
WER
Ruy Ovídio Perrelli de Melo, Jéssyka Vilela, Carla Silva
2024 conf
SBES
Jéssyka Vilela, Carla Silva
2024 conf
SBQS
Dorgival Pereira da Silva Netto, Carla Silva, João Araújo
2024 conf
WER
Ewerton David Brito de Jesus, Jéssyka Vilela, Carla Silva
2023 conf
WER
Dorgival Netto, Carla Silva
2023 conf
WER
Diego Menegazzi, Carla Silva
2023 J jnl
J. Syst. Softw.
Mariana Maia Peixoto, Dayse Ferreira, Mateus Cavalcanti, Carla Silva, Jéssyka Vilela, João Araújo, Tony Gorschek
2023 conf
WER
Arthur Vieira, Mariana Maia Peixoto, Carla Silva
2023 conf
WER
Raimundo Fagner Costa, Carla Silva, Rafael Mello
2022 J jnl
Int. J. Bus. Inf. Syst.
Melquizedequi Cabral dos Santos, Wylliams Barbosa Santos, Sandro Ronaldo Bezerra Oliveira, Alexandre Marcos Lins de Vasconcelos, Carla Silva
2022 conf
WER
Maria Yêda Lima, Carla Silva, Renata M. C. R. de Souza
2022 J jnl
Requir. Eng.
Camilo C. Almendra, Carla Silva, Luiz Eduardo Galvão Martins, Johnny Cardoso Marques
2021 conf
SBSI
Eric Araújo, Jéssyka Vilela, Carla Silva, Carina Alves
2021 A conf
RE
Mariana Maia Peixoto, Carla Silva, Jéssyka Vilela, Tony Gorschek
2021 conf
WER
Mariana Maia Peixoto, Diogo Santos, Jéssyka Vilela, Carla Silva
2020 conf
SBSI
Melquizedequi Santos, Wylliams Barbosa Santos, Sandro Ronaldo Bezerra Oliveira, Alexandre Marcos Lins de Vasconcelos, Carla Silva
2020 conf
SBES
Camilo C. Almendra, Carla Silva, Jéssyka Vilela
2020 conf
SBES
Camilo C. Almendra, Carla Silva
2020 B conf
REFSQ
Mariana Maia Peixoto, Dayse Ferreira, Mateus Cavalcanti, Carla Silva, Jéssyka Vilela, João Araújo, Tony Gorschek
2020 ed.
CIbSE
Claudia P. Ayala, Leonardo Murta, Daniela Soares Cruzes, Eduardo Figueiredo, Carla Silva, Jose Luis de la Vara, Breno de França, Martín Solari, Guilherme Horta Travassos, Ivan Machado
2020 J jnl
Inf. Softw. Technol.
Juliana Medeiros, Alexandre M. L. de Vasconcelos, Carla Silva, Miguel Goulão
2020 conf
REFSQ Workshops
Mariana Maia Peixoto, Carla Silva, Helton Maia, João Araújo
2019 conf
ER Workshops
César Henrique Bernabé, Vítor E. Silva Souza, Ricardo de Almeida Falbo, Renata S. S. Guizzardi, Carla Silva
2019 conf
SBES
Dorgival Netto, Carla Silva, João Araújo
2019 conf
WER
Dorgival Netto, Mariana Maia Peixoto, Carla Silva
2019 conf
iStar@ER
César Henrique Bernabé, Pedro Pignaton Negri, Vítor E. Silva Souza, Renata S. S. Guizzardi, Carla Silva
2019 conf
iStar@ER
Camilo C. Almendra, Carla Silva, Vítor E. Silva Souza, Renata S. S. Guizzardi, César Henrique Bernabé
2018 ed.
WER
Carla Silva, Graciela D. S. Hadad, João Pimentel
2018 conf
SBES
Mariana Maia Peixoto, Carla Silva
2016 J jnl
Braz. J. Inf. Syst.
Hidelberg Oliveira Albuquerque, Carla Silva, Danielle Rousy, Márcia Lucena, Gilberto A. Cysneiros Filho
2015 conf
CIbSE
Juliana Medeiros, Alexandre M. L. de Vasconcelos, Carla Silva
2015 conf
CIbSE
Orlando Silva de Oliveira, Carla Silva
2015 conf
CIbSE
Juliana Medeiros, Daniela C. P. Alves, Alexandre M. L. de Vasconcelos, Carla Silva, Eduardo Wanderley
2015 conf
CIbSE
Mariana Maia Peixoto, Carla Silva
2015 conf
SBSI
Carlos Batista, Carla Silva
2014 conf
SBSI
Hidelberg Albuquerque, Carla Silva, Danielle Rousy
2014 conf
CIbSE
Hidelberg Albuquerque, Carla Silva, Danielle Rousy
2014 conf
CIbSE
Danilo Tavares, Carla Silva, Danielle Rousy
2014 conf
CIbSE
Cynara Souza, Carla Silva
2011 conf
CIbSE
Carla Silva, Clarissa Borba, Jaelson Castro
2011 conf
CIbSE
Josias Paes, Carlos Lima, Emanuel Santos, Carla Silva, Jaelson Castro
2011 conf
CIbSE
Carla Silva, Pedro Dias, João Araújo, Ana Moreira
2011 ch.
Social Modeling for Requirements Engineering
Jaelson Castro, Fernanda M. R. Alencar, Victor F. A. Santander, Carla Silva
2009 conf
EA@ICSE
Carla Silva, Márcia Lucena, Jaelson Castro, João Araújo, Ana Moreira, Fernanda M. R. Alencar
2006 conf
SELMAS
Carla Silva, Jaelson Castro, Patrícia Azevedo Tedesco, João Araújo, Ana Moreira, John Mylopoulos
2006 conf
SBES
Carla Silva, João Araújo, Ana Moreira, Jaelson Castro, Patrícia C. A. R. Tedesco, Fernanda M. R. Alencar, Ricardo Argenton Ramos
2005 conf
SBES
Carla Silva, Jaelson Castro, Patrícia C. A. R. Tedesco, Ismênia G. L. da Silva
2005 conf
SBES
Rosa Candida Pinto, Carla Silva, Jaelson Castro
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"