Xavier Blanc

86 papers A* 4A 15B 10C 5Misc 7Journal 22Unranked 23
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Antoine Chevrot, Alexandre Vernotte, Jean-Rémy Falleri, Xavier Blanc, Bruno Legeard
2025 J jnl
Proc. ACM Softw. Eng.
Antoine Chevrot, Alexandre Vernotte, Jean-Rémy Falleri, Xavier Blanc, Bruno Legeard, Aymeric Cretin
2024 A conf
ICPC
Corentin Latappy, Thomas Degueule, Jean-Rémy Falleri, Romain Robbes, Xavier Blanc, Cédric Teyton
2024 J jnl
CoRR
Corentin Latappy, Thomas Degueule, Jean-Rémy Falleri, Romain Robbes, Xavier Blanc, Cédric Teyton
2023 A conf
SANER
Corentin Latappy, Quentin Perez, Thomas Degueule, Jean-Rémy Falleri, Christelle Urtado, Sylvain Vauttier, Xavier Blanc, Cédric Teyton
2023 J jnl
CoRR
Corentin Latappy, Quentin Perez, Thomas Degueule, Jean-Rémy Falleri, Christelle Urtado, Sylvain Vauttier, Xavier Blanc, Cédric Teyton
2023 B conf
VL/HCC
Christophe Casseau, Jean-Rémy Falleri, Thomas Degueule, Xavier Blanc
2023 J jnl
CoRR
Christophe Casseau, Jean-Rémy Falleri, Thomas Degueule, Xavier Blanc
2022 J jnl
Softw. Test. Verification Reliab.
Julien Leveau, Xavier Blanc, Laurent Réveillère, Jean-Rémy Falleri, Romain Rouvoy
2021 B conf
ICWE
Wei Chen, Hanyang Cao, Xavier Blanc
2021 B conf
VL/HCC
Christophe Casseau, Jean-Rémy Falleri, Xavier Blanc, Thomas Degueule
2020 A conf
ICST
Julien Leveau, Xavier Blanc, Laurent Réveillère, Jean-Rémy Falleri, Romain Rouvoy
2019 J jnl
Empir. Softw. Eng.
Matthieu Foucault, Xavier Blanc, Jean-Rémy Falleri, Margaret-Anne D. Storey
2019 A conf
ICSME
Mohamed A. Oumaziz, Jean-Rémy Falleri, Xavier Blanc, Tegawendé F. Bissyandé, Jacques Klein
2018 J jnl
CoRR
Matthieu Foucault, Xavier Blanc, Margaret-Anne D. Storey, Jean-Rémy Falleri, Cédric Teyton
2018 A* conf
ASE
Sarra Habchi, Xavier Blanc, Romain Rouvoy
2018 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Rongfei Xu, Li Zhang, Ning Ge, Xavier Blanc
2018 C conf
SEKE
Rongfei Xu, Li Zhang, Ning Ge, Xavier Blanc
2017 A conf
ICSOC
Hanyang Cao, Jean-Rémy Falleri, Xavier Blanc
2017 Misc conf
SAC
Hanyang Cao, Yuxian Peng, Jing Jiang, Jean-Rémy Falleri, Xavier Blanc
2017 B conf
ICSR
Mohamed A. Oumaziz, Alan Charpentier, Jean-Rémy Falleri, Xavier Blanc
2017 A conf
ICSOC
Mohamed A. Oumaziz, Abdelkarim Belkhir, Tristan Vacher, Eric Beaudry, Xavier Blanc, Jean-Rémy Falleri, Naouel Moha
2017 J jnl
Inf. Softw. Technol.
Jing Jiang, Yun Yang, Jia-Huan He, Xavier Blanc, Li Zhang
2016 A conf
ICSOC
Hanyang Cao, Jean-Rémy Falleri, Xavier Blanc, Li Zhang
2016 Misc conf
SAC
William Braik, Floréal Morandat, Jean-Rémy Falleri, Xavier Blanc
2015 conf
ESEC/SIGSOFT FSE
Matthieu Foucault, Marc Palyart, Xavier Blanc, Gail C. Murphy, Jean-Rémy Falleri
2015 J jnl
Inf. Softw. Technol.
Matthieu Foucault, Cédric Teyton, David Lo, Xavier Blanc, Jean-Rémy Falleri
2014 J jnl
J. Softw. Evol. Process.
Cédric Teyton, Jean-Rémy Falleri, Marc Palyart, Xavier Blanc
2014 A conf
EASE
Cédric Teyton, Marc Palyart, Jean-Rémy Falleri, Floréal Morandat, Xavier Blanc
2014 A conf
EASE
Matthieu Foucault, Jean-Rémy Falleri, Xavier Blanc
2014 Misc conf
SAC
Matthieu Foucault, Marc Palyart, Jean-Rémy Falleri, Xavier Blanc
2014 A* conf
ASE
Jean-Rémy Falleri, Floréal Morandat, Xavier Blanc, Matias Martinez, Martin Monperrus
2014 J jnl
Softw. Pract. Exp.
Jean-Rémy Falleri, Xavier Blanc, Reda Bendraou, Marcos Aurélio Almeida da Silva, Cédric Teyton
2014 conf
SIGSOFT FSE
Marc Palyart, Gail C. Murphy, Emerson R. Murphy-Hill, Xavier Blanc
2013 J jnl
CoRR
Cédric Teyton, Jean-Rémy Falleri, Marc Palyart, Xavier Blanc
2013 conf
WCRE
Cédric Teyton, Jean-Rémy Falleri, Xavier Blanc
2013 J jnl
Ingénierie des Systèmes d Inf.
Marcos Aurélio Almeida da Silva, Xavier Blanc, Reda Bendraou, Marie-Pierre Gervais
2013 conf
WCRE
Cédric Teyton, Jean-Rémy Falleri, Floréal Morandat, Xavier Blanc
2013 J jnl
CoRR
Jean-Rémy Falleri, Cédric Teyton, Matthieu Foucault, Marc Palyart, Floréal Morandat, Xavier Blanc
2013 C conf
WETICE
Ibrahima Fall, Reda Bendraou, Marie-Pierre Gervais, Xavier Blanc
2012 conf
USER@ICSE
Quentin Enard, Christine Louberry, Charles Consel, Xavier Blanc
2012 conf
AMT@MoDELS
Anne Etien, Vincent Aranega, Xavier Blanc, Richard F. Paige
2012 J jnl
ERCIM News
Xavier Blanc, Jean-Rémy Falleri
2012 conf
WCRE
Cédric Teyton, Jean-Rémy Falleri, Xavier Blanc
2012 conf
CAiSE Forum
Reda Bendraou, Marcos Aurélio Almeida da Silva, Marie-Pierre Gervais, Xavier Blanc
2011 Misc conf
SAC
Jonathan Michaux, Xavier Blanc, Marc Shapiro, Pierre Sutra
2011 A* conf
ASE
Marcos Aurélio Almeida da Silva, Xavier Blanc, Reda Bendraou
2011 conf
EDOCW
Marcos Aurélio Almeida da Silva, Reda Bendraou, Jacques Robin, Xavier Blanc
2011 B conf
ECMFA
Jérôme Le Noir, Olivier Delande, Daniel Exertier, Marcos Aurélio Almeida da Silva, Xavier Blanc
2011 J jnl
Sci. Comput. Program.
Carlos Parra, Xavier Blanc, Anthony Cleve, Laurence Duchien
2011 J jnl
Ingénierie des Systèmes d Inf.
Sybille Caffiau, Patrick Girard, Laurent Guittet, Xavier Blanc
2010 J jnl
IEEE Trans. Software Eng.
Reda Bendraou, Jean-Marc Jézéquel, Marie-Pierre Gervais, Xavier Blanc
2010 conf
MoDELS (2)
Marcos Aurélio Almeida da Silva, Alix Mougenot, Reda Bendraou, Jacques Robin, Xavier Blanc
2010 Misc conf
SAC
Anne Etien, Alexis Muller, Thomas Legrand, Xavier Blanc
2010 conf
MoDELS (2)
Marcos Aurélio Almeida da Silva, Reda Bendraou, Xavier Blanc, Marie-Pierre Gervais
2010 B conf
ECSA
Carlos Parra, Anthony Cleve, Xavier Blanc, Laurence Duchien
2010 conf
LWI@ASE
Alix Mougenot, Xavier Blanc, Marie-Pierre Gervais
2010 A conf
CAiSE
Marcos Aurélio Almeida da Silva, Alix Mougenot, Xavier Blanc, Reda Bendraou
2009 B conf
SPLC
Carlos Parra, Xavier Blanc, Laurence Duchien
2009 C conf
DAIS
Alix Mougenot, Xavier Blanc, Marie-Pierre Gervais
2009 C conf
ISORC
Tewfik Ziadi, Xavier Blanc, Amine Raji
2009 A conf
CAiSE
Xavier Blanc, Alix Mougenot, Isabelle Mounier, Tom Mens
2009 conf
ECMDA-FA
Alix Mougenot, Alexis Darrasse, Xavier Blanc, Michèle Soria
2008 Misc conf
SAC
Prawee Sriplakich, Xavier Blanc, Marie-Pierre Gervais
2008 A* conf
ICSE
Xavier Blanc, Isabelle Mounier, Alix Mougenot, Tom Mens
2008 A conf
MoDELS
Xavier Blanc
2008 conf
LMO
Reda Bendraou, Marie-Pierre Gervais, Xavier Blanc, Jean-Marc Jézéquel
2007 conf
INFORSID
Xavier Blanc
2007 conf
EUROMICRO-SEAA
Reda Bendraou, Andrey Sadovykh, Marie-Pierre Gervais, Xavier Blanc
2006 A conf
MoDELS
Prawee Sriplakich, Xavier Blanc, Marie-Pierre Gervais
2006 conf
ECMDA-FA
Gregory de Fombelle, Xavier Blanc, Laurent Rioux, Marie-Pierre Gervais
2006 conf
ICSM
Prawee Sriplakich, Xavier Blanc, Marie-Pierre Gervais
2006 Misc conf
SAC
Prawee Sriplakich, Xavier Blanc, Marie-Pierre Gervais
2006 B conf
EDOC
Reda Bendraou, Marie-Pierre Gervais, Xavier Blanc
2005 A conf
MoDELS
Xavier Blanc, Franklin Ramalho, Jacques Robin
2005 conf
Software Engineering Research and Practice
Salim Bouzitouna, Marie-Pierre Gervais, Xavier Blanc
2005 conf
Software Engineering Research and Practice
Xavier Blanc, Prawee Sriplakich, Marie-Pierre Gervais
2005 A conf
MoDELS
Reda Bendraou, Marie-Pierre Gervais, Xavier Blanc
2004 conf
MDAFA
Xavier Blanc, Marie-Pierre Gervais, Prawee Sriplakich
2004 J jnl
Obj. Logiciel Base données Réseaux
Xavier Blanc, Olivier Caron, Arnaud Georgin, Alexis Muller
2002 J jnl
Obj. Logiciel Base données Réseaux
Marie-Pierre Gervais, Xavier Blanc
2001 conf
WOODPECKER
Xavier Blanc, Raymonde Le Delliou
2001 C conf
DAIS
Xavier Blanc, Marie-Pierre Gervais, Raymonde Le Delliou
2000 conf
DOA
Xavier Blanc, Marie-Pierre Gervais, Juliette Le Delliou
2000 B conf
EDOC
Xavier Blanc, Marie-Pierre Gervais, Juliette Le Delliou
1999 B conf
EDOC
Xavier Blanc, Marie-Pierre Gervais, Raymonde Le Delliou
redb/extractors/macho_extractors/macho_imports.py
← Index redb/extractors/macho_extractors/macho_imports.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 MachOImport


class MachOImportExtractor(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_imports"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_imports(self, arch_name=None):
        """Extract import information from the MachO binary for a specific architecture.

        Handles machofile v2026.2.4+ API where get_imported_functions() returns:
        Dict[str, List[Dict]] where each dict has {'name': str, 'sources': [str, ...]}
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get imported functions using API for specific architecture
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            if not imported_functions:
                return None

            # Keep the library→functions mapping (like PE does)
            library_names = []
            imports_with_mapping = []  # List of {library: [(name, source), ...]}

            for dylib_name, functions in imported_functions.items():
                # v2026.2.4+: dylib_name is already str, but handle bytes for compatibility
                if isinstance(dylib_name, bytes):
                    dylib_name = dylib_name.decode('utf-8', errors='replace')
                library_names.append(dylib_name)

                # Process function entries
                func_list = []
                for func_entry in functions:
                    # v2026.2.4+: func_entry is {'name': str, 'sources': [str, ...]}
                    if isinstance(func_entry, dict):
                        func_name = func_entry.get('name', '')
                        # Join sources if multiple, take first if single
                        sources = func_entry.get('sources', [])
                        import_source = sources[0] if sources else None
                        func_list.append((func_name, import_source))
                    else:
                        # Legacy format: func_entry is str or bytes
                        if isinstance(func_entry, bytes):
                            func_entry = func_entry.decode('utf-8', errors='replace')
                        func_list.append((func_entry, None))

                imports_with_mapping.append({dylib_name: func_list})

            # Count total functions
            total_functions = sum(len(list(d.values())[0]) for d in imports_with_mapping)

            # Create import dataclass with mapping preserved
            macho_import = MachOImport(
                macho_imports_total=total_functions,
                macho_import_libraryName=library_names if library_names else None,
                macho_import_functions=imports_with_mapping if imports_with_mapping else None
            )

            return macho_import

        except Exception as e:
            self.log.error(f"Error extracting MachO imports 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 imports for each architecture
                results = []
                for arch_name in architectures:
                    imports = self._extract_imports(arch_name)
                    if imports:
                        imports.arch_identifier = arch_name
                        results.append(imports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_imports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO imports: {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

            # Flatten the data - one row per function import (like PE imports)
            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 imports for this architecture
                macho_import = self._extract_imports(arch_name)
                if not macho_import or not macho_import.macho_import_functions:
                    continue

                # Flatten to one row per (library, function) pair
                for lib_funcs in macho_import.macho_import_functions:
                    for lib, funcs in lib_funcs.items():
                        for func_name, import_source in funcs:
                            data.append([
                                arch_sha256,        # sha256 (arch-specific)
                                lib,                # library_name
                                func_name,          # function_name
                                import_source,      # import_source (chained_fixups, bind_opcodes, symtab)
                                current_time,       # analysis_date
                            ])

            column_names = [
                'sha256',
                'library_name', 'function_name', 'import_source',
                'analysis_date'
            ]

            if not data:
                return None

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

            return (data, column_names, column_type_names)

        return None

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