Jack Jansen

63 papers A* 13A 4B 14Journal 17Unranked 12
YearRankTypeTitle / Venue / Authors
2026 B conf
NOSSDAV
Matthias De Fré, Jeroen van der Hooft, Jack Jansen, Silvia Rossi, Thomas Röggla, Tim Wauters, Filip De Turck, Irene Viola, Pablo César
2025 conf
VR Workshops
Karolina Wylezek, Irene Viola, Pablo César, Jack Jansen, Suzanne Mulder, Dylan Eno, Wytze Koppelman, Marta Franceschini, Marco Rendina, Ninke Bloemberg
2025 B conf
QoMEX
Sam Van Damme, Jack Jansen, Silvia Rossi, Pablo César
2025 A conf
ICME
Ashutosh Singla, Irene Viola, Jack Jansen, Pablo César
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Xuemei Zhou, Irene Viola, Evangelos Alexiou, Jack Jansen, Pablo César
2025 A* conf
ACM Multimedia
Guillaume Gautier, Xuemei Zhou, Thong Nguyen, Jack Jansen, Louis Fréneau, Marko Viitanen, Uyen Phan, Jani Käpylä, Irene Viola, Alexandre Mercat, Pablo César, Jarno Vanne
2024 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Carlos Cortés, Irene Viola, Jesús Gutiérrez, Jack Jansen, Shishir Subramanyam, Evangelos Alexiou, Pablo Pérez, Narciso García, Pablo César
2024 A* conf
ACM Multimedia
Jack Jansen, Thomas Röggla, Silvia Rossi, Irene Viola, Pablo César
2024 J jnl
ERCIM News
Irene Viola, Jack Jansen, Pablo César
2023 A* conf
ISMAR
Xuemei Zhou, Irene Viola, Evangelos Alexiou, Jack Jansen, Pablo César
2023 J jnl
IEEE Multim.
Irene Viola, Jack Jansen, Shishir Subramanyam, Ignacio Reimat, Pablo César
2022 A* conf
ACM Multimedia
Shishir Subramanyam, Irene Viola, Jack Jansen, Evangelos Alexiou, Alan Hanjalic, Pablo César
2022 J jnl
CoRR
Shishir Subramanyam, Irene Viola, Jack Jansen, Evangelos Alexiou, Alan Hanjalic, Pablo César
2022 A* conf
ACM Multimedia
Ignacio Reimat, Yanni Mei, Evangelos Alexiou, Jack Jansen, Jie Li, Shishir Subramanyam, Irene Viola, Johan Oomen, Pablo César
2022 B conf
QoMEX
Shishir Subramanyam, Irene Viola, Jack Jansen, Evangelos Alexiou, Alan Hanjalic, Pablo César
2021 conf
VR Workshops
Ana Revilla, Sergio Zamarvide, Ignacio Lacosta, Fernando Pérez, Javier Lajara, Bart Kevelham, Valérie Juillard, Brian Rochat, Michelle Drocco, Natasha Devaud, Olivier Barbeau, Caecilia Charbonnier, Patrick de Lange, Jie Li, Yanni Mei, Kinga Lawicka, Jack Jansen, Nacho Reimat, Shishir Subramanyam, Pablo César
2021 A conf
MMSys
Ignacio Reimat, Evangelos Alexiou, Jack Jansen, Irene Viola, Shishir Subramanyam, Pablo César
2021 A* conf
ISMAR
Jie Li, Shishir Subramanyam, Jack Jansen, Yanni Mei, Ignacio Reimat, Kinga Lawicka, Pablo César
2021 conf
MMVE@MMSys
Silvia Rossi, Irene Viola, Jack Jansen, Shishir Subramanyam, Laura Toni, Pablo César
2020 A conf
MMSys
Jack Jansen, Shishir Subramanyam, Romain Bouqueau, Gianluca Cernigliaro, Marc Martos Cabré, Fernando Pérez, Pablo César
2020 A* conf
CHI
Abdallah El Ali, Xingyu Yang, Swamy Ananthanarayan, Thomas Röggla, Jack Jansen, Jess Hartcher-O'Brien, Kaspar Jansen, Pablo César
2019 conf
CHI Extended Abstracts
Thomas Röggla, Jie Li, Stefan Fjellsten, Jack Jansen, Ian Kegel, Luke Pilgrim, Martin Trimby, Doug Williams, Pablo César
2019 J jnl
ERCIM News
Ivan H. Gorbanov, Jack Jansen, Steven Pemberton
2018 conf
TVX
Jie Li, Thomas Röggla, Maxine Glancy, Jack Jansen, Pablo César
2018 conf
CHI Extended Abstracts
Sergio Barros, Jack Jansen, Pablo César, Thomas Röggla, David A. Shamma
2018 conf
FNC/MobiSPC
Pauline Sia Wen Shieng, Jack Jansen, Steven Pemberton
2018 ch.
MediaSync, Handbook on Multimedia Synchronization
Mario Montagud, Pablo César, Fernando Boronat, Jack Jansen
2018 book
Mario Montagud, Pablo César, Fernando Boronat, Jack Jansen
2018 B conf
DocEng
Jack Jansen, Pablo César, Dick C. A. Bulterman
2017 conf
TVX (Adjunct)
Ian Kegel, James Walker, Mark Lomas, Jack Jansen, John Wyver
2017 A conf
MMSys
Sergio Cabrero, Jack Jansen, Thomas Röggla, John Alexis Guerra Gómez, David A. Shamma, Pablo César
2017 J jnl
Multim. Tools Appl.
Erik Geelhoed, Kuldip Singh-Barmi, Ian Biscoe, Pablo César, Jack Jansen, Chen Wang, Rene Kaiser
2017 B conf
Creativity & Cognition
Thomas Röggla, Chen Wang, Lilia Perez Romero, Jack Jansen, Pablo César
2017 conf
CHI Extended Abstracts
Thomas Röggla, Sergio Cabrero, Demosthenis Katsouris, Zhiyuan Zheng, Amritpal Singh Gill, Jack Jansen, Judith A. Redi, Pablo César, David A. Shamma
2016 B conf
QoMEX
Chen Wang, Jacqueline Wong, Xintong Zhu, Thomas Röggla, Jack Jansen, Pablo César
2015 A* conf
ACM Multimedia
Douglas L. Williams, Ian C. Kegel, Marian Florin Ursu, Pablo César, Jack Jansen, Erik Geelhoed, Andras Horti, Michael Frantzis, Bill Scott
2015 J jnl
IEEE Multim.
Doug Williams, Ian Kegel, Pablo César, Jack Jansen, Marian Florin Ursu, Erik Geelhoed
2015 B conf
DocEng
Jack Jansen, Michael Frantzis, Pablo César
2014 conf
WebMedia
Rodrigo Laiola Guimarães, Dick C. A. Bulterman, Pablo César, Jack Jansen
2014 conf
MoVid@MMSys
Simon N. B. Gunkel, Jack Jansen, Ian Kegel, Dick C. A. Bulterman, Pablo César
2014 A* conf
ACM Multimedia
Jack Jansen
2013 B conf
ACM Symposium on Document Engineering
Jack Jansen, Pablo César, Dick C. A. Bulterman
2013 B conf
NOSSDAV
Jack Jansen, Dick C. A. Bulterman
2012 J jnl
Multim. Tools Appl.
Erik Mannens, Davy Van Deursen, Raphaël Troncy, Silvia Pfeiffer, Conrad Parker, Yves Lafon, Jack Jansen, Michael Hausenblas, Rik Van de Walle
2012 A* conf
ACM Multimedia
Ian Kegel, Pablo César, Jack Jansen, Dick C. A. Bulterman, Tim Stevens, Joke Kort, Nikolaus Färber
2012 B conf
ACM Symposium on Document Engineering
Jack Jansen, Pablo César, Rodrigo Laiola Guimarães, Dick C. A. Bulterman
2011 B conf
NOSSDAV
Bo Gao, Jack Jansen, Pablo César, Dick C. A. Bulterman
2011 J jnl
IEEE Trans. Multim.
Jack Jansen, Pablo César, Dick C. A. Bulterman, Tim Stevens, Ian Kegel, J. Issing
2010 B conf
ACM Symposium on Document Engineering
Jack Jansen, Pablo César, Dick C. A. Bulterman
2010 J jnl
IEEE Trans. Consumer Electron.
Bo Gao, Jack Jansen, Pablo César, Dick C. A. Bulterman
2009 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Pablo César, Dick C. A. Bulterman, Jack Jansen, David Geerts, Hendrik Knoche, William Seager
2009 J jnl
Multim. Syst.
Pablo César, Dick C. A. Bulterman, Jack Jansen
2009 J jnl
Multim. Tools Appl.
Jack Jansen, Dick C. A. Bulterman
2009 ch.
Social Interactive Television
Dick C. A. Bulterman, Pablo César, Jack Jansen, Rodrigo Laiola Guimarães
2008 J jnl
ERCIM News
Pablo César, Dick C. A. Bulterman, Jack Jansen
2008 B conf
ACM Symposium on Document Engineering
Jack Jansen, Dick C. A. Bulterman
2008 A* conf
ACM Multimedia
Pablo César, Dick C. A. Bulterman, David Geerts, Jack Jansen, Hendrik Knoche, William Seager
2008 B conf
ACM Symposium on Document Engineering
Pablo César, Dick C. A. Bulterman, Jack Jansen, Maria da Graça Campos Pimentel, Simone Diniz Junqueira Barbosa
2004 A* conf
ACM Multimedia
Dick C. A. Bulterman, Jack Jansen, Kleanthis Kleanthous, Kees Blom, Daniel Benden
2003 conf
IPT/EGVE
Jurriaan D. Mulder, Jack Jansen, Arjen van Rhijn
1998 J jnl
Comput. Networks
Dick C. A. Bulterman, Lynda Hardman, Jack Jansen, K. Sjoerd Mullender, Lloyd Rutledge
1993 A* conf
ACM Multimedia
Guido van Rossum, Jack Jansen, K. Sjoerd Mullender, Dick C. A. Bulterman
1992 J jnl
Concurr. Pract. Exp.
Henri E. Bal, M. Frans Kaashoek, Andrew S. Tanenbaum, Jack Jansen
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"