Jacques A. Ferland

54 papers C 2Journal 46Unranked 6
YearRankTypeTitle / Venue / Authors
2019 J jnl
Comput. Electron. Agric.
Sebastián Fuentealba, Lorena Pradenas, Rodrigo Linfati, Jacques A. Ferland
2017 J jnl
IEEE Trans. Engineering Management
John Clarke, Viviane Gascon, Jacques A. Ferland
2016 J jnl
J. Oper. Res. Soc.
Luong Thuan Thanh, Jacques A. Ferland, Bouazza Elbenani, Nguyen Dinh Thuc, Van Hien Nguyen
2015 J jnl
J. Glob. Optim.
Amina Lamghari, Roussos G. Dimitrakopoulos, Jacques A. Ferland
2014 J jnl
J. Oper. Res. Soc.
Amina Lamghari, Roussos G. Dimitrakopoulos, Jacques A. Ferland
2014 J jnl
Math. Program. Comput.
Marius Posta, Jacques A. Ferland, Philippe Michelon
2013 J jnl
Eng. Appl. Artif. Intell.
Lorena Pradenas, Juan Garcés, Víctor Parada, Jacques A. Ferland
2012 J jnl
Comput. Optim. Appl.
Marius Posta, Jacques A. Ferland, Philippe Michelon
2012 J jnl
Expert Syst. Appl.
Bouazza Elbenani, Jacques A. Ferland, Jonathan Bellemare
2011 conf
ICIC (1)
Khoa Trinh, Jacques A. Ferland, Tien Ba Dinh
2011 conf
SoICT
Tuyen Ba Dinh, Tien Dinh, Jacques A. Ferland
2011 J jnl
Eur. J. Oper. Res.
Amina Lamghari, Jacques A. Ferland
2011 J jnl
Discret. Optim.
Marius Posta, Jacques A. Ferland, Philippe Michelon
2011 conf
IJCCI (ECTA-FCTA)
Luong Thuan Thanh, Jacques A. Ferland, Nguyen Dinh Thuc, Van Hien Nguyen
2010 J jnl
Ann. Oper. Res.
Amina Lamghari, Jacques A. Ferland
2009 J jnl
Eur. J. Oper. Res.
Khaled Moumene, Jacques A. Ferland
2008 J jnl
J. Glob. Optim.
Jean-Jacques Strodiot, Jean-Pierre Crouzeix, Jacques A. Ferland, Van Hien Nguyen
2008 J jnl
RAIRO Oper. Res.
Khaled Moumene, Jacques A. Ferland
2007 J jnl
Eur. J. Oper. Res.
Andres Diaz Legües, Jacques A. Ferland, Celso C. Ribeiro, Jorge R. Vera, Andrés Weintraub
2007 J jnl
J. Sched.
Véronique Bouffard, Jacques A. Ferland
2007 conf
CISched
Amina Lamghari, Jacques A. Ferland
2006 C conf
PATAT
Michel Gendreau, Jacques A. Ferland, Bernard Gendron, Noureddine Hail, Brigitte Jaumard, Sophie D. Lapierre, Gilles Pesant, Patrick Soriano
2005 J jnl
Ann. Oper. Res.
Lorena Pradenas, Roger Z. Ríos-Mercado, Jacques A. Ferland, Robert Scherer, Philippe Michelon, Nelson Maculan
2004 J jnl
Electron. Notes Discret. Math.
Lorena Pradenas, Fernando Peñailillo, Jacques A. Ferland
2001 J jnl
RAIRO Oper. Res.
Jacques A. Ferland, Pina Marziliano
2001 J jnl
J. Heuristics
Jacques A. Ferland, Ilham Berrada, Imene Nabli, B. Ahiod, Philippe Michelon, Viviane Gascon, Éric Gagné
2001 J jnl
Comput. Oper. Res.
Jacques A. Ferland, Soumia Ichoua, Alain Lavoie, Éric Gagné
2000 J jnl
Ann. Oper. Res.
Viviane Gascon, Sophie Villeneuve, Philippe Michelon, Jacques A. Ferland
1997 C conf
PATAT
Jacques A. Ferland
1997 J jnl
Math. Oper. Res.
Jean-Pierre Crouzeix, Jacques A. Ferland, Constantin Zalinescu
1996 J jnl
Oper. Res.
Jacques A. Ferland, Alain Hertz, Alain Lavoie
1996 J jnl
Math. Program.
Jean-Pierre Crouzeix, Jacques A. Ferland
1996 J jnl
Ann. Oper. Res.
Charles Fleurent, Jacques A. Ferland
1993 J jnl
Oper. Res.
Charles Fleurent, Jacques A. Ferland
1993 conf
Quadratic Assignment and Related Problems
Charles Fleurent, Jacques A. Ferland
1993 conf
Cliques, Coloring, and Satisfiability
Charles Fleurent, Jacques A. Ferland
1993 J jnl
Ann. Oper. Res.
Michèle Charest, Jacques A. Ferland
1992 J jnl
Discret. Appl. Math.
Jacques A. Ferland, Alain Lavoie
1992 J jnl
Math. Program.
Jean-Pierre Crouzeix, Jacques A. Ferland, Siegfried Schaible
1991 J jnl
Math. Program.
Jean-Pierre Crouzeix, Jacques A. Ferland
1990 J jnl
Oper. Res.
Jacques A. Ferland, Gilles Guénette
1989 J jnl
Comput. Oper. Res.
Jean Aubin, Jacques A. Ferland
1989 J jnl
Math. Program.
Jean-Charles Bernard, Jacques A. Ferland
1988 J jnl
ZOR Methods Model. Oper. Res.
Youssef Benadada, Jacques A. Ferland
1986 J jnl
Math. Program.
Jean-Pierre Dussault, Jacques A. Ferland, Bernard Lemaire
1985 J jnl
Comput. Oper. Res.
Jacques A. Ferland, Serge Roy
1984 J jnl
Transp. Sci.
Teodor Gabriel Crainic, Jacques A. Ferland, Jean-Marc Rousseau
1984 J jnl
Math. Program.
Jean-Pierre Crouzeix, Jacques A. Ferland, Siegfried Schaible
1983 J jnl
Math. Program.
Jean-Pierre Crouzeix, Jacques A. Ferland, Siegfried Schaible
1982 J jnl
Math. Program.
Jean-Pierre Crouzeix, Jacques A. Ferland
1980 J jnl
Comput. Oper. Res.
Gilles Dulac, Jacques A. Ferland, Pierre A. Forgues
1972 J jnl
Math. Program.
Jacques A. Ferland
1972 J jnl
Math. Program.
Jacques A. Ferland
1971 J jnl
Math. Program.
Richard W. Cottle, Jacques A. Ferland
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"