Jan C. van Gemert

143 papers A* 23A 7B 13C 1Journal 62Unranked 37
YearRankTypeTitle / Venue / Authors
2025 C conf
ISCAS
Sjoerd Groot, Qinyu Chen, Jan C. van Gemert, Chang Gao
2024 J jnl
CoRR
Sjoerd Groot, Qinyu Chen, Jan C. van Gemert, Chang Gao
2024 J jnl
CoRR
Nergis Tomen, Silvia L. Pintea, Jan C. van Gemert
2024 conf
VISIGRAPP (4): VISAPP
Athanasios Masouris, Jan C. van Gemert
2024 conf
ECCV Workshops (12)
Alexandru Bobe, Jan C. van Gemert
2024 J jnl
CoRR
Alexandru Bobe, Jan C. van Gemert
2024 conf
ECCV Workshops (9)
Thomas C. Markhorst, Jan C. van Gemert, Osman Semih Kayhan
2024 J jnl
CoRR
Thomas C. Markhorst, Jan C. van Gemert, Osman Semih Kayhan
2023 A* conf
ICCV
Silvia L. Pintea, Yancong Lin, Jouke Dijkstra, Jan C. van Gemert
2023 J jnl
CoRR
Silvia L. Pintea, Yancong Lin, Jouke Dijkstra, Jan C. van Gemert
2023 conf
ICCV (Workshops)
Ombretta Strafforello, Klamer Schutte, Jan C. van Gemert
2023 A* conf
ICCV
Yunqiang Li, Jan C. van Gemert, Torsten Hoefler, Bert Moons, Evangelos Eleftheriou, Bram-Ernst Verhoef
2023 J jnl
CoRR
Yunqiang Li, Jan C. van Gemert, Torsten Hoefler, Bert Moons, Evangelos Eleftheriou, Bram-Ernst Verhoef
2023 conf
ICCV (Workshops)
Frans de Boer, Jan C. van Gemert, Jouke Dijkstra, Silvia L. Pintea
2023 J jnl
CoRR
Frans de Boer, Jan C. van Gemert, Jouke Dijkstra, Silvia L. Pintea
2023 A* conf
ICCV
Xin Liu, Fatemeh Karimi Nejadasl, Jan C. van Gemert, Olaf Booij, Silvia L. Pintea
2023 J jnl
CoRR
Xin Liu, Fatemeh Karimi Nejadasl, Jan C. van Gemert, Olaf Booij, Silvia L. Pintea
2023 conf
ICCV (Workshops)
Casper C. J. van Engelenburg, Seyran Khademi, Jan C. van Gemert
2023 conf
ICCV (Workshops)
Tom Edixhoven, Attila Lengyel, Jan C. van Gemert
2022 B conf
ICPR
Burak Yildiz, Seyran Khademi, Ronald Maria Siebes, Jan C. van Gemert
2022 A conf
BMVC
Liang Zeng, Attila Lengyel, Nergis Tomen, Jan C. van Gemert
2022 A* conf
CVPR
Yancong Lin, Ruben Wiersma, Silvia L. Pintea, Klaus Hildebrandt, Elmar Eisemann, Jan C. van Gemert
2022 J jnl
CoRR
Yancong Lin, Ruben Wiersma, Silvia L. Pintea, Klaus Hildebrandt, Elmar Eisemann, Jan C. van Gemert
2022 A* conf
AAAI
Yunqiang Li, Silvia-Laura Pintea, Jan C. van Gemert
2022 J jnl
CoRR
Osman Semih Kayhan, Jan C. van Gemert
2022 B conf
ICIP
Yeshwanth Napolean, Anwesh Marwade, Nergis Tomen, Puck Alkemade, Thijs Eijsvogels, Jan C. van Gemert
2022 A conf
BMVC
Yancong Lin, Silvia-Laura Pintea, Jan C. van Gemert
2021 J jnl
CoRR
Yunqiang Li, Silvia L. Pintea, Jan C. van Gemert
2021 J jnl
CoRR
Attila Lengyel, Jan C. van Gemert
2021 J jnl
CoRR
David W. Romero, Robert-Jan Bruintjes, Jakub M. Tomczak, Erik J. Bekkers, Mark Hoogendoorn, Jan C. van Gemert
2021 A conf
BMVC
Nikhil Saldanha, Silvia-Laura Pintea, Jan C. van Gemert, Nergis Tomen
2021 J jnl
CoRR
Nikhil Saldanha, Silvia L. Pintea, Jan C. van Gemert, Nergis Tomen
2021 B conf
ICIP
Osman Semih Kayhan, Bart Vredebregt, Jan C. van Gemert
2021 J jnl
CoRR
Osman Semih Kayhan, Bart Vredebregt, Jan C. van Gemert
2021 conf
ICCVW
Andrea Alfieri, Yancong Lin, Jan C. van Gemert
2021 J jnl
CoRR
Andrea Alfieri, Yancong Lin, Jan C. van Gemert
2021 A* conf
CVPR
Xin Liu, Silvia L. Pintea, Fatemeh Karimi Nejadasl, Olaf Booij, Jan C. van Gemert
2021 J jnl
CoRR
Xin Liu, Silvia L. Pintea, Fatemeh Karimi Nejadasl, Olaf Booij, Jan C. van Gemert
2021 J jnl
IEEE Trans. Image Process.
Silvia L. Pintea, Nergis Tomen, Stanley F. Goes, Marco Loog, Jan C. van Gemert
2021 J jnl
CoRR
Silvia L. Pintea, Nergis Tomen, Stanley F. Goes, Marco Loog, Jan C. van Gemert
2021 A* conf
ICCV
Nergis Tomen, Jan C. van Gemert
2021 J jnl
CoRR
Yapkan Choi, Yeshwanth Napolean, Jan C. van Gemert
2021 B conf
ICIP
Yapkan Choi, Yeshwanth Napolean, Jan C. van Gemert
2021 A* conf
ICCV
Attila Lengyel, Sourav Garg, Michael Milford, Jan C. van Gemert
2021 J jnl
CoRR
Attila Lengyel, Sourav Garg, Michael Milford, Jan C. van Gemert
2020 conf
ECCV (22)
Yancong Lin, Silvia L. Pintea, Jan C. van Gemert
2020 J jnl
CoRR
Yancong Lin, Silvia L. Pintea, Jan C. van Gemert
2020 J jnl
IEEE Access
Reza Serajeh, Seyran Khademi, Amir Mousavinia, Jan C. van Gemert
2020 A* conf
CVPR
Osman Semih Kayhan, Jan C. van Gemert
2020 J jnl
CoRR
Osman Semih Kayhan, Jan C. van Gemert
2020 J jnl
IEEE Access
Marcos Baptista-Ríos, Roberto Javier López-Sastre, Fabian Caba Heilbron, Jan C. van Gemert, Francisco Javier Acevedo-Rodríguez, Saturnino Maldonado-Bascón
2020 B conf
ICPR
Rafal Pytel, Osman Semih Kayhan, Jan C. van Gemert
2020 J jnl
CoRR
Rafal Pytel, Osman Semih Kayhan, Jan C. van Gemert
2020 conf
CVPR Workshops
Ioannis Lelekas, Nergis Tomen, Silvia L. Pintea, Jan C. van Gemert
2020 J jnl
CoRR
Ioannis Lelekas, Nergis Tomen, Silvia L. Pintea, Jan C. van Gemert
2020 conf
ICPR Workshops (4)
Soroosh Poorgholi, Osman Semih Kayhan, Jan C. van Gemert
2020 J jnl
CoRR
Soroosh Poorgholi, Osman Semih Kayhan, Jan C. van Gemert
2019 conf
ICCV Workshops
Xin Liu, Seyran Khademi, Jan C. van Gemert
2019 J jnl
CoRR
Xin Liu, Seyran Khademi, Jan C. van Gemert
2019 J jnl
CoRR
Xiangwei Shi, Seyran Khademi, Jan C. van Gemert
2019 J jnl
IEEE Trans. Image Process.
Tobias Stahl, Silvia L. Pintea, Jan C. van Gemert
2019 J jnl
CoRR
Amogh Gudi, Marian Bittner, Roelof Lochmans, Jan C. van Gemert
2019 conf
MMSports@MM
Yeshwanth Napolean, Priadi Teguh Wibowo, Jan C. van Gemert
2019 J jnl
CoRR
Yeshwanth Napolean, Priadi Teguh Wibowo, Jan C. van Gemert
2018 J jnl
CoRR
Silvia L. Pintea, Jan C. van Gemert, Arnold W. M. Smeulders
2018 J jnl
Pattern Recognit. Lett.
Silvia L. Pintea, Jan C. van Gemert, Arnold W. M. Smeulders
2018 J jnl
IEEE Trans. Vis. Comput. Graph.
Nicola Pezzotti, Thomas Höllt, Jan C. van Gemert, Boudewijn P. F. Lelieveldt, Elmar Eisemann, Anna Vilanova
2018 J jnl
CoRR
Silvia L. Pintea, Jan C. van Gemert, Arnold W. M. Smeulders
2018 J jnl
CoRR
Silvia L. Pintea, Pascal S. M. Mettes, Jan C. van Gemert, Arnold W. M. Smeulders
2018 conf
ECCV Workshops (6)
Silvia L. Pintea, Jian Zheng, Xilin Li, Paulina J. M. Bank, Jacobus J. van Hilten, Jan C. van Gemert
2018 J jnl
CoRR
Silvia L. Pintea, Jian Zheng, Xilin Li, Paulina J. M. Bank, Jacobus J. van Hilten, Jan C. van Gemert
2018 B conf
ICIP
Silvia L. Pintea, Yue Liu, Jan C. van Gemert
2018 J jnl
CoRR
Silvia L. Pintea, Yue Liu, Jan C. van Gemert
2018 conf
eScience
Seyran Khademi, Xiangwei Shi, Tino Mager, Ronald Siebes, Carola Hein, Victor de Boer, Jan C. van Gemert
2018 conf
ECCV Workshops (6)
Omar Hommos, Silvia L. Pintea, Pascal S. M. Mettes, Jan C. van Gemert
2018 J jnl
CoRR
Omar Hommos, Silvia L. Pintea, Pascal S. M. Mettes, Jan C. van Gemert
2017 A* conf
ICCV
Miriam W. Huijser, Jan C. van Gemert
2017 J jnl
CoRR
Miriam W. Huijser, Jan C. van Gemert
2017 J jnl
IEEE Trans. Image Process.
Sezer Karaoglu, Ran Tao, Jan C. van Gemert, Theo Gevers
2017 A conf
BMVC
Amogh Gudi, Nicolai van Rosmalen, Marco Loog, Jan C. van Gemert
2017 J jnl
CoRR
Amogh Gudi, Nicolai van Rosmalen, Marco Loog, Jan C. van Gemert
2017 conf
ICIAP (1)
Vedran Vukotic, Silvia-Laura Pintea, Christian Raymond, Guillaume Gravier, Jan C. van Gemert
2017 J jnl
CoRR
Vedran Vukotic, Silvia-Laura Pintea, Christian Raymond, Guillaume Gravier, Jan C. van Gemert
2017 J jnl
Int. J. Comput. Vis.
Mihir Jain, Jan C. van Gemert, Hervé Jégou, Patrick Bouthemy, Cees G. M. Snoek
2017 A* conf
CVPR
Yichao Zhang, Silvia L. Pintea, Jan C. van Gemert
2017 J jnl
CoRR
Yichao Zhang, Silvia L. Pintea, Jan C. van Gemert
2016 conf
ECCV (8)
Julian F. P. Kooij, Jan C. van Gemert
2016 conf
MMM (1)
Svetlana Kordumova, Jan C. van Gemert, Cees G. M. Snoek
2016 B conf
ICIP
Silvia L. Pintea, Pascal Mettes, Jan C. van Gemert, Arnold W. M. Smeulders
2016 J jnl
Comput. Vis. Image Underst.
Silvia L. Pintea, Sezer Karaoglu, Jan C. van Gemert, Arnold W. M. Smeulders
2016 conf
ECCV Workshops (3)
Silvia L. Pintea, Jan C. van Gemert
2016 J jnl
CoRR
Silvia L. Pintea, Jan C. van Gemert
2016 J jnl
Comput. Vis. Image Underst.
Pascal Mettes, Jan C. van Gemert, Cees G. M. Snoek
2016 J jnl
CoRR
Svetlana Kordumova, Jan C. van Gemert, Cees G. M. Snoek, Arnold W. M. Smeulders
2016 conf
ECCV (5)
Pascal Mettes, Jan C. van Gemert, Cees G. M. Snoek
2016 J jnl
CoRR
Pascal Mettes, Jan C. van Gemert, Cees G. M. Snoek
2016 A* conf
CVPR
Jörn-Henrik Jacobsen, Jan C. van Gemert, Zhongyu Lou, Arnold W. M. Smeulders
2016 J jnl
CoRR
Jörn-Henrik Jacobsen, Jan C. van Gemert, Zhongyu Lou, Arnold W. M. Smeulders
2016 J jnl
CoRR
Mihir Jain, Jan C. van Gemert, Hervé Jégou, Patrick Bouthemy, Cees G. M. Snoek
2015 A conf
BMVC
Jan C. van Gemert, Mihir Jain, Ella Gati, Cees G. M. Snoek
2015 B conf
ICMR
Pascal Mettes, Jan C. van Gemert, Spencer Cappallo, Thomas Mensink, Cees G. M. Snoek
2015 J jnl
CoRR
Pascal Mettes, Jan C. van Gemert, Cees G. M. Snoek
2015 A* conf
ICCV
Mihir Jain, Jan C. van Gemert, Thomas Mensink, Cees G. M. Snoek
2015 J jnl
CoRR
Mihir Jain, Jan C. van Gemert, Thomas Mensink, Cees G. M. Snoek
2015 B conf
ICIP
Sezer Karaoglu, Ivo Everts, Jan C. van Gemert, Theo Gevers
2015 A* conf
CVPR
Mihir Jain, Jan C. van Gemert, Cees G. M. Snoek
2014 A* conf
CVPR
Mihir Jain, Jan C. van Gemert, Hervé Jégou, Patrick Bouthemy, Cees G. M. Snoek
2014 conf
ECCV (3)
Silvia L. Pintea, Jan C. van Gemert, Arnold W. M. Smeulders
2014 J jnl
IEEE Trans. Image Process.
Ivo Everts, Jan C. van Gemert, Theo Gevers
2014 conf
ECCV Workshops (1)
Jan C. van Gemert, Camiel R. Verschoor, Pascal Mettes, Kitso Epema, Lian Pin Koh, Serge A. Wich
2014 J jnl
IEEE Trans. Image Process.
Ivo Everts, Jan C. van Gemert, Thomas Mensink, Theo Gevers
2014 B conf
ICMR
Thomas Mensink, Jan C. van Gemert
2013 A* conf
ACM Multimedia
Morris Franken, Jan C. van Gemert
2013 A* conf
ACM Multimedia
Sezer Karaoglu, Jan C. van Gemert, Theo Gevers
2013 A* conf
CVPR
Ivo Everts, Jan C. van Gemert, Theo Gevers
2013 A* conf
ACM Multimedia
H. Emrah Tasli, Jan C. van Gemert, Theo Gevers
2012 conf
ECCV Workshops (3)
Sezer Karaoglu, Jan C. van Gemert, Theo Gevers
2012 conf
ECCV (6)
Ivo Everts, Jan C. van Gemert, Theo Gevers
2011 B conf
ICMR
Jan C. van Gemert
2011 conf
IEEE VAST
Malgorzata Migut, Jan C. van Gemert, Marcel Worring
2010 J jnl
Comput. Vis. Image Underst.
Jan C. van Gemert, Cees G. M. Snoek, Cor J. Veenman, Arnold W. M. Smeulders, Jan-Mark Geusebroek
2010 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Jan C. van Gemert, Cor J. Veenman, Arnold W. M. Smeulders, Jan-Mark Geusebroek
2009 J jnl
IEEE Trans. Multim.
Jan C. van Gemert, Cor J. Veenman, Jan-Mark Geusebroek
2008 B conf
ICIP
Victoria Yanulevskaya, Jan C. van Gemert, Katharina Roth, Ann-Katrin Herbold, Nicu Sebe, Jan-Mark Geusebroek
2008 conf
ECCV (3)
Jan C. van Gemert, Jan-Mark Geusebroek, Cor J. Veenman, Arnold W. M. Smeulders
2008 conf
TRECVID
Duy-Dinh Le, Xiaomeng Wu, Shin'ichi Satoh, Sheetal Rajgure, Jan C. van Gemert
2008 conf
TRECVID
Cees G. M. Snoek, Koen E. A. van de Sande, Ork de Rooij, Bouke Huurnink, Jan C. van Gemert, Jasper R. R. Uijlings, Jiyin He, Xirong Li, Ivo Everts, Vladimir Nedovic, M. van Liempt, Richard van Balen, Maarten de Rijke, Jan-Mark Geusebroek, Theo Gevers, Marcel Worring, Arnold W. M. Smeulders, Dennis C. Koelma, Fei Yan, Muhammad Atif Tahir, Krystian Mikolajczyk, Josef Kittler
2007 conf
TRECVID
Cees G. M. Snoek, Ivo Everts, Jan C. van Gemert, Jan-Mark Geusebroek, Bouke Huurnink, Dennis C. Koelma, M. van Liempt, Ork de Rooij, Koen E. A. van de Sande, Arnold W. M. Smeulders, Jasper R. R. Uijlings, Marcel Worring
2006 J jnl
Int. J. Imaging Syst. Technol.
Jan C. van Gemert, Gertjan J. Burghouts, Frank J. Seinstra, Jan-Mark Geusebroek
2006 conf
SAMT (Posters and Demos)
Cees G. M. Snoek, Marcel Worring, Bouke Huurnink, Jan C. van Gemert, Koen E. A. van de Sande, Dennis C. Koelma, Ork de Rooij
2006 conf
CVPR Workshops
Jan C. van Gemert, Jan-Mark Geusebroek, Cor J. Veenman, Cees G. M. Snoek, Arnold W. M. Smeulders
2006 conf
TRECVID
Cees G. M. Snoek, Jan C. van Gemert, Theo Gevers, Bouke Huurnink, Dennis C. Koelma, M. van Liempt, Ork de Rooij, Koen E. A. van de Sande, Frank J. Seinstra, Arnold W. M. Smeulders, Andrew H. C. Thean, Cor J. Veenman, Marcel Worring
2006 A* conf
ACM Multimedia
Cees Snoek, Marcel Worring, Jan C. van Gemert, Jan-Mark Geusebroek, Arnold W. M. Smeulders
2006 A* conf
ACM Multimedia
Jan C. van Gemert, Cees Snoek, Cor J. Veenman, Arnold W. M. Smeulders
2006 A* conf
ACM Multimedia
Marcel Worring, Cees G. M. Snoek, Bouke Huurnink, Jan C. van Gemert, Dennis C. Koelma, Ork de Rooij
2005 conf
TRECVID
Thijs Westerveld, Jan C. van Gemert, Roberto Cornacchia, Djoerd Hiemstra, Arjen P. de Vries
2005 A* conf
ACM Multimedia
Cees Snoek, Marcel Worring, Jan C. van Gemert, Jan-Mark Geusebroek, Dennis C. Koelma, Giang P. Nguyen, Ork de Rooij, Frank J. Seinstra
2005 conf
TRECVID
Cees G. M. Snoek, Jan C. van Gemert, Jan-Mark Geusebroek, Bouke Huurnink, Dennis C. Koelma, Giang P. Nguyen, Ork de Rooij, Frank J. Seinstra, Arnold W. M. Smeulders, Cor J. Veenman, Marcel Worring
2004 conf
HLT-NAACL (Short Papers)
Vijay Divi, Clifton Forlines, Jan C. van Gemert, Bhiksha Raj, Bent Schmidt-Nielsen, Kent Wittenburg, Joseph Woelfel, Fang-Fang Zhang
2004 A conf
ICME
Marcel Worring, Giang P. Nguyen, Laura Hollink, Jan C. van Gemert, Dennis C. Koelma
2004 A conf
INTERSPEECH
Peter Wolf, Joseph Woelfel, Jan C. van Gemert, Bhiksha Raj, David Wong
2002 conf
ICPR (1)
Jan-Mark Geusebroek, Minh Anh Hoang, Jan C. van Gemert, Marcel Worring
2002 B conf
SOFSEM
Marcel Worring, Andrew D. Bagdanov, Jan C. van Gemert, Jan-Mark Geusebroek, Hoang Minh, Guus Schreiber, Cees Snoek, Jeroen Vendrig, Jan Wielemaker, Arnold W. M. Smeulders
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"