Olivier Thonnard

50 papers A* 2A 4B 2C 5Misc 1Journal 11Unranked 23
YearRankTypeTitle / Venue / Authors
2025 conf
DSN-S
Umberto Fontana, Elisa Chiapponi, Claudio Costanza, Vincent Rigal, Olivier Thonnard, Martynas Buozis, Hervé Debar
2025 conf
DSN-S
Elisa Chiapponi, Umberto Fontana, Elyssa Boulila, Claudio Costanza, Vincent Rigal, Olivier Thonnard
2023 conf
EuroS&P Workshops
Elisa Chiapponi, Marc Dacier, Olivier Thonnard
2023 A conf
IMC
Elisa Chiapponi, Marc Dacier, Olivier Thonnard
2023 conf
TMA
Elisa Chiapponi, Marc Dacier, Olivier Thonnard
2022 conf
DSN (Supplements)
Elisa Chiapponi, Marc Dacier, Olivier Thonnard, Mohamed Fangar, Mattias Mattsson, Vincent Rigal
2022 C conf
ISPEC
Elisa Chiapponi, Marc Dacier, Olivier Thonnard, Mohamed Fangar, Vincent Rigal
2020 conf
ICSOC Workshops
Elisa Chiapponi, Marc Dacier, Massimiliano Todisco, Onur Catakoglu, Olivier Thonnard
2020 J jnl
IEEE Trans. Vis. Comput. Graph.
Siming Chen, Natalia V. Andrienko, Gennady L. Andrienko, Linara Adilova, Jérémie Barlet, Jörg Kindermann, Phong H. Nguyen, Olivier Thonnard, Cagatay Turkay
2020 J jnl
IEEE Trans. Vis. Comput. Graph.
Phong H. Nguyen, Rafael Henkin, Siming Chen, Natalia V. Andrienko, Gennady L. Andrienko, Olivier Thonnard, Cagatay Turkay
2019 conf
DSN Workshops
Linara Adilova, Livin Natious, Siming Chen, Olivier Thonnard, Michael Kamp
2019 J jnl
CoRR
Linara Adilova, Livin Natious, Siming Chen, Olivier Thonnard, Michael Kamp
2019 J jnl
IEEE Trans. Vis. Comput. Graph.
Phong H. Nguyen, Cagatay Turkay, Gennady L. Andrienko, Natalia V. Andrienko, Olivier Thonnard, Jihane Zouaoui
2018 C conf
PRDC
Pedro Marques, Zayani Dabbabi, Miruna-Mihaela Mironescu, Olivier Thonnard, Alysson Bessani, Frances V. Buontempo, Ilir Gashi
2018 C conf
VizSEC
Siming Chen, Shuai Chen, Natalia V. Andrienko, Gennady L. Andrienko, Phong H. Nguyen, Cagatay Turkay, Olivier Thonnard, Xiaoru Yuan
2018 conf
DSN Workshops
Pedro Marques, Zayani Dabbabi, Miruna-Mihaela Mironescu, Olivier Thonnard, Frances V. Buontempo, Ilir Gashi, Alysson Bessani
2017 conf
EuroVA@EuroVis
Phong H. Nguyen, Cagatay Turkay, Gennady L. Andrienko, Natalia V. Andrienko, Olivier Thonnard
2016 conf
DSN Workshops
Remi Domingues, Francesco Buonora, Romain Senesi, Olivier Thonnard
2016 conf
DSN Workshops
Antonio Pecchia, Olivier Thonnard
2016 J jnl
Secur. Commun. Networks
Olivier Thonnard, Pierre-Antoine Vervier, Marc Dacier
2015 conf
Financial Cryptography
Olivier Thonnard, Leyla Bilge, Anand Kashyap, Martin Lee
2015 A* conf
NDSS
Pierre-Antoine Vervier, Olivier Thonnard, Marc Dacier
2015 B conf
DIMVA
Gianluca Stringhini, Olivier Thonnard
2014 conf
EuroVA@EuroVis
Fabian Fischer, James Davey, Johannes Fuchs, Olivier Thonnard, Jörn Kohlhammer, Daniel A. Keim
2014 conf
IEEE BigData
Thibault Debatty, Pietro Michiardi, Olivier Thonnard, Wim Mees
2014 conf
EDBT/ICDT Workshops
Thibault Debatty, Pietro Michiardi, Wim Mees, Olivier Thonnard
2014 J jnl
EURASIP J. Inf. Secur.
Jelena Isacenkova, Olivier Thonnard, Andrei Costin, Aurélien Francillon, Davide Balzarotti
2014 conf
IEEE BigData
Yun Shen, Olivier Thonnard
2014 conf
ICC
Pierre-Antoine Vervier, Quentin Jacquemart, Johann Schlamp, Olivier Thonnard, Georg Carle, Guillaume Urvoy-Keller, Ernst W. Biersack, Marc Dacier
2014 conf
BigMine
Thibault Debatty, Pietro Michiardi, Olivier Thonnard, Wim Mees
2014 J jnl
CoRR
Gianluca Stringhini, Olivier Thonnard
2014 J jnl
Comput. Graph. Forum
Michael Behrisch, James Davey, Fabian Fischer, Olivier Thonnard, Tobias Schreck, Daniel A. Keim, Jörn Kohlhammer
2013 conf
IEEE Symposium on Security and Privacy Workshops
Jelena Isacenkova, Olivier Thonnard, Andrei Costin, Davide Balzarotti, Aurélien Francillon
2013 A* conf
INFOCOM
Pierre-Antoine Vervier, Olivier Thonnard
2013 conf
INFOCOM Workshops
Pierre-Antoine Vervier, Olivier Thonnard
2012 A conf
RAID
Olivier Thonnard, Leyla Bilge, Gavin O'Gorman, Seán Kiernan, Martin Lee
2012 C conf
VizSEC
Fabian Fischer, Johannes Fuchs, Pierre-Antoine Vervier, Florian Mansmann, Olivier Thonnard
2012 J jnl
IEEE Netw.
Ernst W. Biersack, Quentin Jacquemart, Fabian Fischer, Johannes Fuchs, Olivier Thonnard, Georgios Theodoridis, Dimitrios Tzovaras, Pierre-Antoine Vervier
2012 C conf
VizSEC
Orestis Tsigkas, Olivier Thonnard, Dimitrios Tzovaras
2011 conf
CEAS
Olivier Thonnard, Marc Dacier
2010 A conf
RAID
Marco Cova, Corrado Leita, Olivier Thonnard, Angelos D. Keromytis, Marc Dacier
2010 ch.
Cyber Situational Awareness
Marc Dacier, Corrado Leita, Olivier Thonnard, Hau-Van Pham, Engin Kirda
2010 J jnl
SIGKDD Explor.
Olivier Thonnard, Wim Mees, Marc Dacier
2010
Olivier Thonnard
2009 conf
KDD Workshop on CyberSecurity and Intelligence Informatics
Olivier Thonnard, Wim Mees, Marc Dacier
2009 B conf
NCA
Ilir Gashi, Vladimir Stankovic, Corrado Leita, Olivier Thonnard
2009 Misc conf
ICISS
Marc Dacier, Van-Hau Pham, Olivier Thonnard
2008 J jnl
Digit. Investig.
Olivier Thonnard, Marc Dacier
2008 conf
ICDM Workshops
Olivier Thonnard, Marc Dacier
2008 A conf
RAID
Olivier Thonnard, Jouni Viinikka, Corrado Leita, Marc Dacier
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOExport


class MachOExportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_exports"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'UInt32', 'Array(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

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