Madalena Chaves

37 papers C 1Journal 18Unranked 16
YearRankTypeTitle / Venue / Authors
2025 J jnl
Biosyst.
Odile Burckard, Michèle Teboul, Franck Delaunay, Madalena Chaves
2023 J jnl
IEEE Trans. Autom. Control.
Nicolas Augier, Madalena Chaves, Jean-Luc Gouzé
2021 J jnl
Soft Comput.
Tomas Veloz, Madalena Chaves, Manuel António Martins
2020 conf
MED
Luis C. Gomes-Pereira, Madalena Chaves, Jérémie Roux
2020 J jnl
Nat. Comput.
Madalena Chaves, Daniel Figueiredo, Manuel A. Martins
2020 J jnl
J. Bioinform. Comput. Biol.
Sofia Almeida, Madalena Chaves, Franck Delaunay
2020 conf
CMSB
Marielle Péré, Madalena Chaves, Jérémie Roux
2020 conf
CMSB
Ousmane Diop, Madalena Chaves, Laurent Tournier
2019 conf
CDC
Madalena Chaves, Luca Scardovi, Eleni Firippi
2019 J jnl
Autom.
Madalena Chaves, Diego A. Oyarzún
2019 ed.
MLCSB
Madalena Chaves, Manuel A. Martins
2019 conf
HSB
Daniel Figueiredo, Eugénio Rocha, Manuel António Martins, Madalena Chaves
2018 J jnl
SIAM J. Appl. Dyn. Syst.
Camille Poignard, Madalena Chaves, Jean-Luc Gouzé
2016 J jnl
SIAM J. Appl. Dyn. Syst.
Camille Poignard, Madalena Chaves, Jean-Luc Gouzé
2015 J jnl
Theor. Comput. Sci.
Madalena Chaves, Alfonso Carta
2015 J jnl
Autom.
Alfonso Carta, Madalena Chaves, Jean-Luc Gouzé
2013 conf
NOLCOS
Alfonso Carta, Madalena Chaves, Jean-Luc Gouzé
2013 conf
CDC
Christian Breindl, Madalena Chaves, Frank Allgöwer
2013 J jnl
Autom.
Laurent Tournier, Madalena Chaves
2013 book
Madalena Chaves
2012 conf
CMSB
Alfonso Carta, Madalena Chaves, Jean-Luc Gouzé
2011 conf
CDC/ECC
Xiao-Dong Li, Jean-Luc Gouzé, Madalena Chaves
2011 J jnl
Autom.
Madalena Chaves, Jean-Luc Gouzé
2011 conf
CDC/ECC
Madalena Chaves, Laurent Tournier
2009 J jnl
Comput. Chem. Eng.
Thomas Eissing, Madalena Chaves, Frank Allgöwer
2009 conf
ECC
Madalena Chaves
2009 conf
ECC
Laurent Tournier, Madalena Chaves
2009 J jnl
PLoS Comput. Biol.
Adel Dayarian, Madalena Chaves, Eduardo D. Sontag, Anirvan M. Sengupta
2008 J jnl
IEEE Trans. Autom. Control.
Madalena Chaves, Thomas Eissing, Frank Allgöwer
2006 J jnl
Autom.
Eduardo D. Sontag, Madalena Chaves
2006 conf
CDC
Madalena Chaves
2006 conf
CDC
Madalena Chaves, Eduardo D. Sontag, Réka Albert
2005 J jnl
SIAM J. Control. Optim.
Madalena Chaves
2004 conf
CDC
Madalena Chaves, Eduardo D. Sontag, Robert J. Dinerstein
2003 C conf
ACC
Sonja Glavaski, Madalena Chaves, Robert Day, Parthasarathi Nag, Anca Williams, Wei Zhang
2002 J jnl
Eur. J. Control
Madalena Chaves, Eduardo D. Sontag
2001 conf
ECC
Madalena Chaves, Eduardo D. Sontag
redb/extractors/elf_extractors/elf_relocations.py
← Index redb/extractors/elf_extractors/elf_relocations.py python
import inspect
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 ELFRelocation


class ELFRelocationExtractor(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_relocations = []
        self.elastic_index = self.index_prefix + "-elf_relocations"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _get_relocation_type_string(self, reloc_type: int, machine_arch: str) -> str:
        """Convert relocation type number to human-readable string based on architecture."""
        # This is a simplified mapping - real implementation would need comprehensive
        # architecture-specific relocation type mappings

        common_types = {
            0: "R_NONE",
            1: "R_DIRECT",
            2: "R_PC_RELATIVE",
            3: "R_GOT",
            4: "R_PLT",
            5: "R_COPY",
            6: "R_GLOB_DAT",
            7: "R_JMP_SLOT",
            8: "R_RELATIVE"
        }

        # Architecture-specific mappings could be added here
        if machine_arch == "x86_64":
            x86_64_types = {
                1: "R_X86_64_64",
                2: "R_X86_64_PC32",
                3: "R_X86_64_GOT32",
                4: "R_X86_64_PLT32",
                5: "R_X86_64_COPY",
                6: "R_X86_64_GLOB_DAT",
                7: "R_X86_64_JUMP_SLOT",
                8: "R_X86_64_RELATIVE"
            }
            return x86_64_types.get(reloc_type, f"R_X86_64_{reloc_type}")
        elif machine_arch == "x86":
            i386_types = {
                1: "R_386_32",
                2: "R_386_PC32",
                3: "R_386_GOT32",
                4: "R_386_PLT32",
                5: "R_386_COPY",
                6: "R_386_GLOB_DAT",
                7: "R_386_JMP_SLOT",
                8: "R_386_RELATIVE"
            }
            return i386_types.get(reloc_type, f"R_386_{reloc_type}")

        return common_types.get(reloc_type, f"R_UNKNOWN_{reloc_type}")

    def _extract_relocation_data(self, relocation, section_name: str, machine_arch: str) -> Dict:
        """Extract data from a single relocation entry."""
        try:
            # Get relocation offset
            relocation_offset = relocation.entry.get('r_offset', 0)

            # Get relocation type
            relocation_type = relocation.entry.get('r_info_type', 0)

            # Get symbol index
            relocation_symbol_index = relocation.entry.get('r_info_sym', 0)

            # Get addend (only present in RELA sections)
            relocation_addend = None
            if hasattr(relocation.entry, 'r_addend'):
                relocation_addend = relocation.entry.get('r_addend', 0)

            # Get symbol name if available
            relocation_symbol_name = ""
            if hasattr(relocation, 'symbol') and relocation.symbol:
                relocation_symbol_name = relocation.symbol.name or f"<symbol_{relocation_symbol_index}>"
            else:
                relocation_symbol_name = f"<symbol_{relocation_symbol_index}>"

            # Get type string mapping
            relocation_type_str = self._get_relocation_type_string(relocation_type, machine_arch)

            return ELFRelocation(
                relocation_offset=relocation_offset,
                relocation_type=relocation_type,
                relocation_type_str=relocation_type_str,
                relocation_symbol_index=relocation_symbol_index,
                relocation_symbol_name=relocation_symbol_name,
                relocation_section=section_name,
                relocation_addend=relocation_addend
            )

        except Exception as e:
            self.log.error(f"Error extracting relocation data: {e}")
            return None

    def _extract_relocations_from_section(self, section, machine_arch: str) -> List[Dict]:
        """Extract all relocations from a relocation section."""
        relocations = []

        try:
            if not hasattr(section, 'iter_relocations'):
                return relocations

            section_name = section.name or f"<unnamed_section>"

            for relocation in section.iter_relocations():
                reloc_data = self._extract_relocation_data(relocation, section_name, machine_arch)
                if reloc_data:
                    relocations.append(reloc_data)

        except Exception as e:
            self.log.error(f"Error extracting relocations from section {section.name}: {e}")

        return relocations

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

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

            def extract_data(elf):
                # Get architecture for relocation type mapping
                machine_arch = self._get_architecture()
                all_relocations = []

                # Iterate through all sections looking for relocation sections with per-section error handling
                for section_index, section in enumerate(elf.iter_sections()):
                    try:
                        # Check if this is a relocation section (.rel or .rela)
                        if (section.name and
                            (section.name.startswith('.rel') or section.name.startswith('.rela')) and
                            hasattr(section, 'iter_relocations')):

                            section_relocations = self._extract_relocations_from_section(section, machine_arch)
                            all_relocations.extend(section_relocations)
                            self.log.debug(f"Extracted {len(section_relocations)} relocations from section {section.name}")
                    except Exception as e:
                        section_name = getattr(section, 'name', f'section_{section_index}')
                        self.log.warning(f"Error processing relocation section {section_name}: {e}")
                        # Continue processing other sections

                return all_relocations

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_relocations = result
            return self.elf_relocations

        except Exception as e:
            self.log.error(f"Error extracting ELF relocations {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_relocations
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no relocations (e.g., statically linked binary)
                # None is reserved for actual errors

                # Prepare data arrays for all relocations
                data = []
                current_time = datetime.now(timezone.utc)
                for reloc in self.elf_relocations:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        reloc.relocation_offset,
                        reloc.relocation_type,
                        reloc.relocation_type_str,
                        reloc.relocation_symbol_index,
                        reloc.relocation_symbol_name,
                        reloc.relocation_addend,
                        reloc.relocation_section,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'relocation_offset', 'relocation_type', 'relocation_type_str',
                    'relocation_symbol_index', 'relocation_symbol_name',
                    'relocation_addend', 'relocation_section',
                    'analysis_date'
                ]

                if not data:
                    return None

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'UInt64', 'UInt32', 'LowCardinality(String)',
                    'UInt32', 'LowCardinality(String)',
                    'Nullable(Int64)', 'LowCardinality(String)',
                    'DateTime64(3, \'UTC\')'
                ]

                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_relocations"