James Roberts

58 papers A* 5A 9B 4C 2Journal 25Unranked 8
YearRankTypeTitle / Venue / Authors
2025 C conf
DeSE
James Roberts, Hoshang Kolivand, Yasir Hussain, Mostafa Tajdini
2025 A* conf
CHI
Difeng Yu, James Roberts, Kasper Hornbæk, Joanna Bergström
2022 A* conf
INFOCOM
Alessandro Finamore, James Roberts, Massimo Gallo, Dario Rossi
2022 conf
Image-Guided Procedures
Michael B. Allan, Mohammad H. Jafari, Nathan Van Woudenberg, Oron Frenkel, Darra Murphy, Tracee Wee, Rob D'Ortenzio, Yong Wu, James Roberts, Naoya Shatani, Ang Nan Gu, Samira Sojoudi, Purang Abolmaesumi
2022 J jnl
CoRR
James Roberts, Dario Rossi
2022 J jnl
SIGMETRICS Perform. Evaluation Rev.
James Roberts, Dario Rossi
2021 J jnl
CoRR
Alessandro Finamore, James Roberts, Massimo Gallo, Dario Rossi
2021 J jnl
Comput. Networks
Tianzhu Zhang, Leonardo Linguaglossa, Paolo Giaccone, Luigi Iannone, James Roberts
2020 J jnl
IEEE J. Sel. Areas Commun.
Mahdieh Ahmadi, James Roberts, Emilio Leonardi, Ali Movaghar
2020 J jnl
Perform. Evaluation
Mahdieh Ahmadi, James Roberts, Emilio Leonardi, Ali Movaghar
2020 J jnl
CoRR
Tianzhu Zhang, Leonardo Linguaglossa, Paolo Giaccone, Luigi Iannone, James Roberts
2019 B conf
NetSoft
Tianzhu Zhang, Leonardo Linguaglossa, James Roberts, Luigi Iannone, Massimo Gallo, Paolo Giaccone
2019 J jnl
CoRR
Mahdieh Ahmadi, James Roberts, Emilio Leonardi, Ali Movaghar
2019 A conf
CoNEXT
Tianzhu Zhang, Leonardo Linguaglossa, Massimo Gallo, Paolo Giaccone, Luigi Iannone, James Roberts
2019 J jnl
CoRR
Mahdieh Ahmadi, James Roberts, Emilio Leonardi, Ali Movaghar
2019 B conf
Networking
Mahdieh Ahmadi, James Roberts, Emilio Leonardi, Ali Movaghar
2018 B conf
Networking
Vamsi Addanki, Leonardo Linguaglossa, James Roberts, Dario Rossi
2018 conf
SIGCOMM Posters and Demos
Vamsi Addanki, Leonardo Linguaglossa, James Roberts, Dario Rossi
2018 C conf
HPSR
YiXi Gong, James Roberts, Dario Rossi
2018 conf
I2MTC
James Roberts, Alaeddin S. A. Abuabed
2015 A conf
ITC
Salah-Eddine Elayoubi, James Roberts
2015 conf
ICN
Salah-Eddine Elayoubi, James Roberts
2014 conf
ONDM
Raluca-Maria Indre, Jelena Pesic, James Roberts
2013 J jnl
JOCN
Davide Cuda, Raluca-Maria Indre, Esther Le Rouzic, James Roberts
2013 J jnl
CoRR
James Roberts, Nada Sbihi
2013 A conf
ITC
James Roberts, Nada Sbihi
2012 J jnl
CoRR
Christine Fricker, Philippe Robert, James Roberts
2012 A conf
ITC
Christine Fricker, Philippe Robert, James Roberts
2012 A* conf
INFOCOM
Sara Oueslati, James Roberts, Nada Sbihi
2012 conf
ONDM
Davide Cuda, Raluca-Maria Indre, Esther Le Rouzic, James Roberts
2012 J jnl
CoRR
Christine Fricker, Philippe Robert, James Roberts, Nada Sbihi
2012 conf
INFOCOM Workshops
Christine Fricker, Philippe Robert, James Roberts, Nada Sbihi
2011 J jnl
CoRR
Philippe Robert, James Roberts
2011 A conf
ITC
Philippe Robert, James Roberts
2011 J jnl
CoRR
Davide Cuda, Raluca-Maria Indre, Esther Le Rouzic, James Roberts
2011 A conf
ITC
Jordan Augé, Sara Oueslati, James Roberts
2011 J jnl
Queueing Syst. Theory Appl.
Nelson Antunes, Christine Fricker, James Roberts
2010 B conf
GLOBECOM
Nelson Antunes, Christine Fricker, Philippe Robert, James Roberts
2010 J jnl
CoRR
Nelson Antunes, Christine Fricker, Philippe Robert, James Roberts
2010 A conf
ITC
Nelson Antunes, Christine Fricker, Philippe Robert, James Roberts
2010 J jnl
CoRR
Nelson Antunes, Christine Fricker, Philippe Robert, James Roberts
2009 conf
NGI
Ali Ibrahim, Luca Muscariello, James Roberts
2009 A conf
ITC
Ali Ibrahim, James Roberts
2009 J jnl
Ann. des Télécommunications
James Roberts
2007 A conf
ITC
Ali Ibrahim, James Roberts
2003 ch.
QofIS Final Report
Burkhard Stiller, Pere Barlet-Ros, John Cushnie, Jordi Domingo-Pascual, David Hutchison, Rui J. Lopes, Andreas Mauthe, Mihai Popa, James Roberts, Josep Solé-Pareta, Denis Trcek, Carlos Veciana-Nogués
2003 book
Michael Smirnov, Ernst W. Biersack, Chris Blondia, Olivier Bonaventure, Olga Casals, Gunnar Karlsson, George Pavlou, Bruno Quoitin, James Roberts, Ioannis Stavrakakis, Burkhard Stiller, Panos Trimintzios, Piet Van Mieghem
2003 ch.
QofIS Final Report
Gunnar Karlsson, James Roberts, Ioannis Stavrakakis, Antonio Alves, Stefano Avallone, Fernando Boavida, Salvatore D'Antonio, Marcello Esposito, Viktória Fodor, Mauro Gargiulo, Jarmo Harju, Yevgeni Koucheryavy, Fengyi Li, Ian Marsh, Ignacio Más Ivars, Dmitri Moltchanov, Edmundo Monteiro, Antonis Panagakis, Antonio Pescapè, Gonçalo Quadros, Simon Pietro Romano, Giorgio Ventre
2002 J jnl
IEEE Commun. Lett.
Logeshwaran Vijayan, James Roberts
2002 J jnl
IEEE/ACM Trans. Netw.
Laurent Massoulié, James Roberts
2001 A* conf
INFOCOM
Guy Fayolle, Arnaud de La Fortelle, Jean-Marc Lasgouttes, Laurent Massoulié, James Roberts
2001 ed.
QofIS
Mikhail I. Smirnov, Jon Crowcroft, James Roberts, Fernando Boavida
2000 J jnl
Telecommun. Syst.
Laurent Massoulié, James Roberts
2000 ed.
QofIS
Jon Crowcroft, James Roberts, Mikhail I. Smirnov
1999 A* conf
INFOCOM
Laurent Massoulié, James Roberts
1992 J jnl
Perform. Evaluation
James Roberts, Fabrice Guillemin
1987 J jnl
IEEE Trans. Commun.
Ke-Qiang Liao, James Roberts
1986 J jnl
Comput. Networks
James Roberts, Ke-Qiang Liao
redb/extractors/macho_extractors/macho_features.py
← Index redb/extractors/macho_extractors/macho_features.py python
import inspect
import json
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 MachO


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

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

    def _extract_macho_features_for_arch(self, arch_name):
        """Extract basic MachO features for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get general info using new API
            general_info = self.macho.get_general_info()
            if not general_info:
                return None

            # Get header info for this specific architecture
            header_raw = self.macho.get_macho_header(arch=arch_name)
            header_formatted = self.macho.get_macho_header(arch=arch_name, formatted=True)

            if not header_raw or not header_formatted:
                return None

            # Get entry point using new API
            entry_point = None
            try:
                entry_point_info = self.macho.get_entry_point(arch=arch_name)
                if entry_point_info:
                    if isinstance(entry_point_info, dict):
                        entry_point = entry_point_info.get('entryoff') or entry_point_info.get('entry_address')
                    else:
                        entry_point = entry_point_info
            except Exception as e:
                self.log.debug(f"No entry point found: {e}")

            # Get UUID using new API
            uuid = None
            try:
                uuid_info = self.macho.get_uuid(arch=arch_name)
                if uuid_info:
                    uuid = str(uuid_info)
            except Exception as e:
                self.log.debug(f"No UUID found: {e}")

            # Get version info using new API with formatting
            version_info = None
            version_info_str = None
            try:
                version_info = self.macho.get_version_info(arch=arch_name)
                version_info_str = self.macho.get_version_info(arch=arch_name, formatted=True)
            except Exception as e:
                self.log.debug(f"No version info found: {e}")

            # Get segments using new API
            segments = self.macho.get_segments(arch=arch_name)
            number_of_segments = len(segments) if segments else 0

            # Get dylib info using new API
            dylib_names = self.macho.get_dylib_names(arch=arch_name)
            number_of_dylibs = len(dylib_names) if dylib_names else 0

            # Count imports using new API
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            number_of_imports = sum(len(funcs) for funcs in imported_functions.values()) if imported_functions else 0

            # Count exports using new API
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)
            number_of_exports = sum(len(symbols) for symbols in exported_symbols.values()) if exported_symbols else 0

            # Get unique load command types using new API
            load_commands_set = self.macho.get_load_commands_set(arch=arch_name, formatted=True)
            if isinstance(load_commands_set, set):
                load_commands_set = sorted(list(load_commands_set))

            # Get architectures for listing purposes
            architectures = self.macho.get_architectures()

            # Determine binary properties
            is_64bit = header_raw.get('magic') in [0xFEEDFACF, 0xCFFAEDFE]  # MH_MAGIC_64, MH_CIGAM_64
            is_signed = self._is_signed()
            
            # Create MachO dataclass
            macho_features = MachO(
                # Raw values from new API
                magic=header_raw.get('magic', 0),
                cputype=header_raw.get('cputype', 0),
                cpusubtype=header_raw.get('cpusubtype', 0),
                filetype=header_raw.get('filetype', 0),
                ncmds=header_raw.get('ncmds', 0),
                sizeofcmds=header_raw.get('sizeofcmds', 0),
                flags=header_raw.get('flags', 0),
                architecture=header_raw.get('cputype', 0),  # Use cputype as architecture
                architectures=[arch_info.get('cputype', 0) for arch_info in [self.macho.get_macho_header(arch=arch) for arch in architectures] if arch_info],
                # Human-readable values from formatted API
                magic_str=header_formatted.get('magic', ''),
                cputype_str=header_formatted.get('cputype', ''),
                cpusubtype_str=header_formatted.get('cpusubtype', ''),
                filetype_str=header_formatted.get('filetype', ''),
                flags_str=header_formatted.get('flags', '').split(', ') if header_formatted.get('flags') else [],
                architecture_str=header_formatted.get('cputype', ''),
                architectures_str=[arch_info.get('cputype', '') for arch_info in [self.macho.get_macho_header(arch=arch, formatted=True) for arch in architectures] if arch_info],
                # Additional properties
                is_64bit=is_64bit,
                is_signed=is_signed,
                number_of_load_commands=header_raw.get('ncmds', 0),
                load_commands_set=load_commands_set,
                number_of_segments=number_of_segments,
                number_of_dylibs=number_of_dylibs,
                number_of_imports=number_of_imports,
                number_of_exports=number_of_exports,
                entry_point=entry_point,
                uuid=uuid,
                version_info=version_info,
                version_info_str=version_info_str
            )
            
            return macho_features
            
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            if not self.macho:
                return None
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # For FAT binaries, return features for all architectures
            # For single arch, return just the single result
            if len(architectures) > 1:
                # FAT binary - return list of features for each architecture
                results = []
                for arch_name in architectures:
                    features = self._extract_macho_features_for_arch(arch_name)
                    if features:
                        # Add architecture identifier to the result
                        if hasattr(features, '__dict__'):
                            # If it's a dataclass, we can access its dict
                            features.arch_identifier = arch_name
                        results.append(features)
                return results
            else:
                # Single architecture - return single result
                return self._extract_macho_features_for_arch(architectures[0])
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {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 __init__)
            try:
                architectures = self.macho.get_architectures()
            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:
                # Extract features for this specific architecture
                macho_features = self._extract_macho_features_for_arch(arch_name)
                if not macho_features:
                    continue

                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific hash for {arch_name}: {e}")
                    arch_sha256 = self.sha256

                # Architecture field (kept in features table for ORDER BY)
                architecture = macho_features.cputype    # Raw CPU type value

                data.append([
                    arch_sha256,                          # sha256 (architecture-specific)
                    architecture,                         # architecture (raw CPU type)
                    # Raw values
                    macho_features.magic,                 # magic
                    macho_features.cputype,               # cputype
                    macho_features.cpusubtype,            # cpusubtype
                    macho_features.filetype,              # filetype
                    macho_features.ncmds,                 # ncmds
                    macho_features.sizeofcmds,            # sizeofcmds
                    macho_features.flags,                 # flags
                    # Human-readable values
                    macho_features.magic_str,             # magic_str
                    macho_features.cputype_str,           # cputype_str
                    macho_features.cpusubtype_str,        # cpusubtype_str
                    macho_features.filetype_str,          # filetype_str
                    macho_features.flags_str,             # flags_str
                    # Other fields
                    macho_features.is_64bit,              # is_64bit
                    macho_features.is_signed,             # is_signed
                    macho_features.entry_point if macho_features.entry_point else None,           # entry_point
                    macho_features.uuid if macho_features.uuid else None,  # uuid
                    json.dumps(macho_features.version_info) if macho_features.version_info else "{}",  # version_info
                    json.dumps(macho_features.version_info_str) if macho_features.version_info_str else "{}",  # version_info_str
                    macho_features.load_commands_set,     # load_commands_set
                    macho_features.number_of_segments,    # number_of_segments
                    macho_features.number_of_dylibs,      # number_of_dylibs
                    macho_features.number_of_imports,     # number_of_imports
                    macho_features.number_of_exports,     # number_of_exports
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256', 'architecture',
                # Raw values
                'magic', 'cputype', 'cpusubtype', 'filetype', 'ncmds', 'sizeofcmds', 'flags',
                # Human-readable values
                'magic_str', 'cputype_str', 'cpusubtype_str', 'filetype_str', 'flags_str',
                # Other fields
                'is_64bit', 'is_signed',
                'entry_point', 'uuid', 'version_info', 'version_info_str', 'load_commands_set',
                'number_of_segments', 'number_of_dylibs', 'number_of_imports', 'number_of_exports',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'Nullable(UInt32)',
                # Raw values
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32',
                # Human-readable values
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'Array(LowCardinality(String))',
                # Other fields
                'UInt8', 'UInt8',
                'Nullable(UInt64)', 'Nullable(String)', 'JSON', 'JSON', 'Array(Nullable(String))',
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)
        
        return None

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