Hachem Kadri

69 papers A* 6A 5B 7C 2Misc 3Journal 40Unranked 6
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Joachim Tomasi, Sandrine Anthoine, Hachem Kadri
2025 J jnl
CoRR
Xiaoyu Sun, Mathieu Roget, Giuseppe Di Molfetta, Hachem Kadri
2025 J jnl
CoRR
Hachem Kadri, Joachim Tomasi, Yuka Hashimoto, Sandrine Anthoine
2024 J jnl
CoRR
Yuka Hashimoto, Masahiro Ikeda, Hachem Kadri
2024 A conf
AISTATS
Kais Hariz, Hachem Kadri, Stéphane Ayache, Maher Moakher, Thierry Artières
2024 B conf
IJCNN
Hamed Benazha, Stéphane Ayache, Hachem Kadri, Thierry Artières
2024 J jnl
Trans. Mach. Learn. Res.
Nizar Demni, Hachem Kadri
2024 A* conf
ICML
Yuka Hashimoto, Masahiro Ikeda, Hachem Kadri
2024 J jnl
CoRR
Yuka Hashimoto, Ayoub Hafid, Masahiro Ikeda, Hachem Kadri
2023 J jnl
CoRR
Yuka Hashimoto, Masahiro Ikeda, Hachem Kadri
2023 A* conf
NeurIPS
Yuka Hashimoto, Masahiro Ikeda, Hachem Kadri
2023 J jnl
CoRR
Balthazar Casalé, Giuseppe Di Molfetta, Sandrine Anthoine, Hachem Kadri
2023 A conf
AISTATS
Yuka Hashimoto, Masahiro Ikeda, Hachem Kadri
2023 J jnl
CoRR
Nizar Demni, Hachem Kadri
2022 J jnl
Pattern Recognit.
Riikka Huusari, Cécile Capponi, Paul Villoutreix, Hachem Kadri
2022 A* conf
ICML
Kais Hariz, Hachem Kadri, Stéphane Ayache, Maher Moakher, Thierry Artières
2022 J jnl
CoRR
Kais Hariz, Hachem Kadri, Stéphane Ayache, Maher Moakher, Thierry Artières
2022 J jnl
CoRR
Yuka Hashimoto, Masahiro Ikeda, Hachem Kadri
2022 A conf
UAI
Mathieu Roget, Giuseppe Di Molfetta, Hachem Kadri
2022 Misc conf
ICASSP
Farah Cherfaoui, Hachem Kadri, Liva Ralaivola
2022 J jnl
CoRR
Mathieu Roget, Hachem Kadri, Giuseppe Di Molfetta
2022 J jnl
J. Mach. Learn. Res.
Dominique Benielli, Baptiste Bauvin, Sokol Koço, Riikka Huusari, Cécile Capponi, Hachem Kadri, François Laviolette
2021 J jnl
CoRR
Riikka Huusari, Hachem Kadri
2021 J jnl
J. Mach. Learn. Res.
Riikka Huusari, Hachem Kadri
2021 B conf
IJCNN
Paolo Milanesi, Hachem Kadri, Stéphane Ayache, Thierry Artières
2021 J jnl
CoRR
Paolo Milanesi, Hachem Kadri, Stéphane Ayache, Thierry Artières
2021 J jnl
CoRR
Riikka Huusari, Sahely Bhadra, Cécile Capponi, Hachem Kadri, Juho Rousu
2021 B conf
IJCNN
Luc Giffon, Stéphane Ayache, Hachem Kadri, Thierry Artières, Ronan Sicre
2021 J jnl
CoRR
Mathieu Roget, Giuseppe Di Molfetta, Hachem Kadri
2021 J jnl
Mach. Learn.
Luc Giffon, Valentin Emiya, Hachem Kadri, Liva Ralaivola
2020 B conf
IJCNN
Akrem Sellami, François-Xavier Dupé, Bastien Cagna, Hachem Kadri, Stéphane Ayache, Thierry Artières, Sylvain Takerkart
2020 J jnl
CoRR
Akrem Sellami, François-Xavier Dupé, Bastien Cagna, Hachem Kadri, Stéphane Ayache, Thierry Artières, Sylvain Takerkart
2020 A* conf
ICML
Hachem Kadri, Stéphane Ayache, Riikka Huusari, Alain Rakotomamonjy, Liva Ralaivola
2020 J jnl
CoRR
Hachem Kadri, Stéphane Ayache, Riikka Huusari, Alain Rakotomamonjy, Liva Ralaivola
2020 J jnl
CoRR
Balthazar Casalé, Giuseppe Di Molfetta, Hachem Kadri, Liva Ralaivola
2020 J jnl
Quantum Mach. Intell.
Balthazar Casalé, Giuseppe Di Molfetta, Hachem Kadri, Liva Ralaivola
2019 B conf
IJCNN
Luc Giffon, Stéphane Ayache, Thierry Artières, Hachem Kadri
2019 J jnl
CoRR
Luc Giffon, Stéphane Ayache, Thierry Artières, Hachem Kadri
2019 A* conf
IJCAI
Riikka Huusari, Hachem Kadri
2019 J jnl
CoRR
Riikka Huusari, Cécile Capponi, Paul Villoutreix, Hachem Kadri
2019 J jnl
CoRR
Luc Giffon, Valentin Emiya, Liva Ralaivola, Hachem Kadri
2018 A conf
AISTATS
Riikka Huusari, Hachem Kadri, Cécile Capponi
2018 J jnl
CoRR
Riikka Huusari, Hachem Kadri, Cécile Capponi
2017 B conf
IJCNN
Julien Audiffren, Hachem Kadri
2016 J jnl
CoRR
Guillaume Rabusseau, Hachem Kadri
2016 conf
NIPS
Guillaume Rabusseau, Hachem Kadri
2016 J jnl
J. Mach. Learn. Res.
Hachem Kadri, Emmanuel Duflos, Philippe Preux, Stéphane Canu, Alain Rakotomamonjy, Julien Audiffren
2015 B conf
ESANN
Julien Audiffren, Hachem Kadri
2015 J jnl
CoRR
Hachem Kadri, Emmanuel Duflos, Philippe Preux, Stéphane Canu, Alain Rakotomamonjy, Julien Audiffren
2015 conf
EUSIPCO
Pierre-Olivier Amblard, Hachem Kadri
2014 J jnl
CoRR
Julien Audiffren, Hachem Kadri
2013 conf
ICML (1)
Hachem Kadri, Mohammad Ghavamzadeh, Philippe Preux
2013 J jnl
CoRR
Hachem Kadri, Asma Rabaoui, Philippe Preux, Emmanuel Duflos, Alain Rakotomamonjy
2013 J jnl
CoRR
Julien Audiffren, Hachem Kadri
2013 J jnl
CoRR
Hachem Kadri, Philippe Preux, Emmanuel Duflos, Stéphane Canu
2013 J jnl
CoRR
Julien Audiffren, Hachem Kadri
2013 C conf
ACML
Julien Audiffren, Hachem Kadri
2013 J jnl
CoRR
Julien Audiffren, Hachem Kadri
2013 C conf
ACML
Hachem Kadri, Stéphane Ayache, Cécile Capponi, Sokol Koço, François-Xavier Dupé, Emilie Morvant
2012 J jnl
CoRR
Hachem Kadri, Mohammad Ghavamzadeh, Philippe Preux
2012 J jnl
CoRR
Hachem Kadri, Alain Rakotomamonjy, Francis R. Bach, Philippe Preux
2012 conf
NIPS
Hachem Kadri, Alain Rakotomamonjy, Francis R. Bach, Philippe Preux
2012 Misc conf
ICASSP
Asma Rabaoui, Hachem Kadri, Manuel Davy
2011 A* conf
ICML
Hachem Kadri, Asma Rabaoui, Philippe Preux, Emmanuel Duflos, Alain Rakotomamonjy
2011 Misc conf
ICASSP
Hachem Kadri, Emmanuel Duflos, Philippe Preux
2010 A conf
AISTATS
Hachem Kadri, Emmanuel Duflos, Philippe Preux, Stéphane Canu, Manuel Davy
2008 J jnl
EURASIP J. Adv. Signal Process.
Asma Rabaoui, Hachem Kadri, Zied Lachiri, Noureddine Ellouze
2008 conf
EUSIPCO
Hachem Kadri, Manuel Davy, Asma Rabaoui, Zied Lachiri, Noureddine Ellouze
2006 conf
EUSIPCO
Hachem Kadri, Zied Lachiri, Noureddine Ellouze
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"