Olivier Buttelli

41 papers C 3Misc 2Journal 17Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
Signal Process.
Le Trung Thanh, Karim Abed-Meraim, Nguyen Linh Trung, Philippe Ravier, Olivier Buttelli, Ales Holobar
2025 conf
EUSIPCO
Meryem Jabloun, Ales Holobar, N. Murks, Matej Kramberger, Philippe Ravier, Olivier Buttelli
2025 J jnl
Biomed. Signal Process. Control.
Amal Kammoun, Philippe Ravier, Olivier Buttelli
2024 J jnl
Sensors
Amal Kammoun, Philippe Ravier, Olivier Buttelli
2024 J jnl
Sensors
Amal Kammoun, Philippe Ravier, Olivier Buttelli
2024 Misc conf
ICASSP
Le Trung Thanh, Karim Abed-Meraim, Philippe Ravier, Olivier Buttelli, Ales Holobar
2024 J jnl
Entropy
Meryem Jabloun, Olivier Buttelli, Philippe Ravier
2024 C conf
ICPRAM
Hichem Bengacemi, Abdenour Hacine-Gharbi, Philippe Ravier, Karim Abed-Meraim, Olivier Buttelli
2024 J jnl
Signal Process.
Le Trung Thanh, Karim Abed-Meraim, Philippe Ravier, Olivier Buttelli, Ales Holobar
2024 Misc conf
ICASSP
Le Trung Thanh, Karim Abed-Meraim, Philippe Ravier, Olivier Buttelli, Ales Holobar
2023 conf
SSP
Le Trung Thanh, Karim Abed-Meraim, Philippe Ravier, Olivier Buttelli
2023 conf
APSIPA ASC
Van-Hieu Nguyen, Gia-Thien Luu, Thien Van Luong, Mai Xuan Trang, Philippe Ravier, Olivier Buttelli
2023 conf
SSP
Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2022 J jnl
Entropy
Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2021 J jnl
Entropy
Antonio Dávalos, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2021 C conf
ICPRAM
Hichem Bengacemi, Abdenour Hacine-Gharbi, Philippe Ravier, Karim Abed-Meraim, Olivier Buttelli
2021 J jnl
Entropy
Antonio Dávalos, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2021 J jnl
Entropy
Philippe Ravier, Antonio Dávalos, Meryem Jabloun, Olivier Buttelli
2020 J jnl
Medical Biol. Eng. Comput.
Hichem Bengacemi, Karim Abed-Meraim, Olivier Buttelli, Abdelaziz Ouldali, Ammar Mesloub
2020 conf
EUSIPCO
Antonio Dávalos, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2019 conf
EUSIPCO
Antonio Dávalos, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2019 J jnl
Entropy
Antonio Dávalos, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2018 conf
SSP
Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2018 conf
EUSIPCO
Antonio Dávalos, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2018 J jnl
Biomed. Signal Process. Control.
Mohamed Daoud, Philippe Ravier, Olivier Buttelli
2017 conf
ICCASA/ICTCC
Gia-Thien Luu, Abdelbassit Boualem, Philippe Ravier, Olivier Buttelli
2016 conf
EUSIPCO
Philippe Ravier, Meryem Jabloun, Mohamed Lamine Talbi, Ross Parry, Elodie Lalo, Olivier Buttelli
2016 conf
EUSIPCO
Amal Naseem, Meryem Jabloun, Olivier Buttelli, Philippe Ravier
2016 C conf
HealthCom
Amal Naseem, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2015 J jnl
Signal Process.
Abdelbassit Boualem, Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2015 J jnl
Biomed. Signal Process. Control.
Philippe Ravier, Dario Farina, Olivier Buttelli
2014 conf
BHI
Julien Roussel, Michel Haritopoulos, Philippe Ravier, Olivier Buttelli
2013 J jnl
Biomed. Signal Process. Control.
Meryem Jabloun, Philippe Ravier, Olivier Buttelli, Roger Lédée, Rachid Harba, Long-Dang Nguyen
2013 conf
EUSIPCO
Julien Roussel, Michel Haritopoulos, Philippe Ravier, Olivier Buttelli
2013 J jnl
Biomed. Signal Process. Control.
Mohamed Daoud, Philippe Ravier, Rachid Harba, Meryem Jabloun, Benabdellah Yagoubi, Olivier Buttelli
2013 conf
EUSIPCO
Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2011 conf
ISABEL
Philippe Ravier, Gia-Thien Luu, Meryem Jabloun, Olivier Buttelli
2010 conf
EUSIPCO
Meryem Jabloun, Philippe Ravier, Olivier Buttelli
2008 conf
EUSIPCO
Frédéric Leclerc, Philippe Ravier, Dario Farina, J.-C. Jouanin, Olivier Buttelli
2007 conf
EUSIPCO
Frédéric Leclerc, Philippe Ravier, Olivier Buttelli, J.-C. Jouanin
2004 conf
EUSIPCO
Philippe Ravier, Olivier Buttelli
redb/extractors/basicproperties.py
← Index redb/extractors/basicproperties.py python
from dataclasses import asdict
import inspect
import os
import magic
from magika import Magika
from datetime import datetime, timezone
from typing import Any, List, Tuple

from redb.extractors.enum import Tag
from redb.models.dataclasses import BasicProperties
from redb.extractors.extractor import Extractor


class BasicPropertiesExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        parent_sha256=None,
        precomputed_hashes=None,
        is_fat=None,
        child_sha256=None,
        child_architecture=None,
        child_filetype=None,
        first_seen=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters=exporters,
            index_prefix=index_prefix,
            elastic_index=elastic_index,
            known_benign=known_benign,
            known_malicious=known_malicious,
            precomputed_hashes=precomputed_hashes,
        )
        self.basic_properties = None
        self.elastic_index = self.index_prefix + "-basic_properties"
        self.is_packed = None
        self.parent_sha256 = parent_sha256  # For FAT Mach-O slices, points to container hash
        self.is_fat = is_fat  # True for FAT Mach-O containers, None otherwise
        self.child_sha256 = child_sha256  # SHA256 hashes of children (FAT slices, zip contents)
        self.child_architecture = child_architecture  # Architecture names for FAT Mach-O slices
        self.child_filetype = child_filetype  # Magika filetypes for children (useful for zip archives)
        self.first_seen = first_seen  # From catalog_samples, None for local files

    def tag(self):
        return Tag.BASIC_PROPERTIES.value

    def _extract_basic_properties(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        filename = None  # Reserved for future use
        sample_name = os.path.basename(self.filepath)
        file_entropy = round(self.calculate_entropy(self.binary), 3)
        type_ = magic.from_buffer(self.binary)
        type_mime = magic.from_buffer(self.binary, mime=True)
        type_magika = Magika().identify_bytes(self.binary).output.label
        size = len(self.binary)
        self.basic_properties = BasicProperties(
            filename, sample_name, size, type_, type_mime, type_magika,
            file_entropy, self.is_packed, self.is_fat, self.child_sha256,
            self.child_architecture, self.child_filetype,
            first_seen=str(self.first_seen) if self.first_seen else None,
        )
        self.log.debug(f"Basic Properties dump: {asdict(self.basic_properties)}")

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_basic_properties()
            # self.export_to_elastic([self.basic_properties])
            return self.basic_properties
        except Exception as e:
            self.log.error(f"Extract basic properties error {self.hash.sha256} Exception: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.basic_properties
        elif exporter_type == "ClickHouseExporter":
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                self.parent_sha256,  # NULL for standalone/FAT, fat_hash for slices
                self.basic_properties.child_sha256 or [],  # SHA256 hashes of children
                self.basic_properties.child_architecture or [],  # Architecture names for FAT slices
                self.basic_properties.child_filetype or [],  # Magika filetypes for children
                self.basic_properties.is_fat,  # True for FAT Mach-O containers, NULL otherwise
                self.basic_properties.filename,
                self.basic_properties.sample_name,
                self.basic_properties.filesize,
                self.basic_properties.file_entropy,
                self.basic_properties.filetype,
                self.basic_properties.filetype_mime,
                self.basic_properties.filetype_magika,
                self.first_seen or datetime(1970, 1, 1, tzinfo=timezone.utc),  # From catalog_samples, epoch zero for local files (uses original datetime, not string)
                datetime.now(timezone.utc)
            ]]

            column_names = [
                'sha256', 'md5', 'sha1', 'parent_sha256', 'child_sha256', 'child_architecture', 'child_filetype',
                'is_fat', 'filename', 'sample_name',
                'filesize', 'file_entropy', 'filetype', 'filetype_mime',
                'filetype_magika', 'first_seen', 'analysis_date'
            ]

            column_type_names = [
                'String', 'String', 'String', 'Nullable(String)',
                'Array(FixedString(64))', 'Array(LowCardinality(String))', 'Array(LowCardinality(String))',
                'Nullable(UInt8)', 'Nullable(String)', 'String',
                'UInt64', 'Float64', 'LowCardinality(String)',
                'LowCardinality(String)', 'LowCardinality(String)',
                'DateTime64(3, \'UTC\')',
                'DateTime64(3, \'UTC\')'
            ]

            return data, column_names, column_type_names

    def get_clickhouse_table(self) -> str:
        return "redb_basic_properties"