Orazio Gallo

67 papers A* 13A 4B 2Journal 33Unranked 15
YearRankTypeTitle / Venue / Authors
2025 A* conf
CVPR
Bowen Wen, Matthew Trepte, Joseph Aribido, Jan Kautz, Orazio Gallo, Stan Birchfield
2025 J jnl
CoRR
Bowen Wen, Matthew Trepte, Joseph Aribido, Jan Kautz, Orazio Gallo, Stan Birchfield
2025 J jnl
CoRR
Abhishek Badki, Hang Su, Bowen Wen, Orazio Gallo
2025 J jnl
CoRR
Danial Samadi Vahdati, Tai D. Nguyen, Ekta Prashnani, Koki Nagano, David Luebke, Orazio Gallo, Matthew C. Stamm
2025 A* conf
CVPR
Yiqing Liang, Abhishek Badki, Hang Su, James Tompkin, Orazio Gallo
2025 J jnl
CoRR
Yiqing Liang, Abhishek Badki, Hang Su, James Tompkin, Orazio Gallo
2024 conf
ECCV (15)
Ekta Prashnani, Koki Nagano, Shalini De Mello, David Luebke, Orazio Gallo
2024 conf
3DV
Daniel Lichy, Hang Su, Abhishek Badki, Jan Kautz, Orazio Gallo
2024 J jnl
CoRR
Daniel Lichy, Hang Su, Abhishek Badki, Jan Kautz, Orazio Gallo
2024 J jnl
CoRR
Daniel Lichy, Hang Su, Abhishek Badki, Jan Kautz, Orazio Gallo
2023 J jnl
CoRR
Ekta Prashnani, Koki Nagano, Shalini De Mello, David Luebke, Orazio Gallo
2023 A* conf
CVPR
Jiashun Wang, Xueting Li, Sifei Liu, Shalini De Mello, Orazio Gallo, Xiaolong Wang, Jan Kautz
2023 J jnl
CoRR
Jiashun Wang, Xueting Li, Sifei Liu, Shalini De Mello, Orazio Gallo, Xiaolong Wang, Jan Kautz
2022 A* conf
CVPR
Eric R. Chan, Connor Z. Lin, Matthew A. Chan, Koki Nagano, Boxiao Pan, Shalini De Mello, Orazio Gallo, Leonidas J. Guibas, Jonathan Tremblay, Sameh Khamis, Tero Karras, Gordon Wetzstein
2022 A* conf
CVPR
Atsuhiro Noguchi, Umar Iqbal, Jonathan Tremblay, Tatsuya Harada, Orazio Gallo
2021 A* conf
CVPR
Abhishek Badki, Orazio Gallo, Jan Kautz, Pradeep Sen
2021 J jnl
CoRR
Abhishek Badki, Orazio Gallo, Jan Kautz, Pradeep Sen
2021 J jnl
CoRR
Eric R. Chan, Connor Z. Lin, Matthew A. Chan, Koki Nagano, Boxiao Pan, Shalini De Mello, Orazio Gallo, Leonidas J. Guibas, Jonathan Tremblay, Sameh Khamis, Tero Karras, Gordon Wetzstein
2021 J jnl
CoRR
Chaoyang Wang, Ben Eckart, Simon Lucey, Orazio Gallo
2021 J jnl
CoRR
Ekta Prashnani, Orazio Gallo, Joohwan Kim, Josef B. Spjut, Pradeep Sen, Iuri Frosio
2021 A conf
BMVC
Ekta Prashnani, Orazio Gallo, Joohwan Kim, Josef B. Spjut, Pradeep Sen, Iuri Frosio
2021 J jnl
CoRR
Atsuhiro Noguchi, Umar Iqbal, Jonathan Tremblay, Tatsuya Harada, Orazio Gallo
2020 A* conf
CVPR
Abhishek Badki, Alejandro J. Troccoli, Kihwan Kim, Jan Kautz, Pradeep Sen, Orazio Gallo
2020 J jnl
CoRR
Abhishek Badki, Alejandro J. Troccoli, Kihwan Kim, Jan Kautz, Pradeep Sen, Orazio Gallo
2020 A* conf
NeurIPS
Tewodros Amberbir Habtegebrial, Varun Jampani, Orazio Gallo, Didier Stricker
2020 J jnl
CoRR
Tewodros Habtegebrial, Varun Jampani, Orazio Gallo, Didier Stricker
2020 A* conf
CVPR
Abhishek Badki, Orazio Gallo, Jan Kautz, Pradeep Sen
2020 J jnl
CoRR
Abhishek Badki, Orazio Gallo, Jan Kautz, Pradeep Sen
2020 A* conf
CVPR
Jae Shin Yoon, Kihwan Kim, Orazio Gallo, Hyun Soo Park, Jan Kautz
2020 J jnl
CoRR
Jae Shin Yoon, Kihwan Kim, Orazio Gallo, Hyun Soo Park, Jan Kautz
2019 A conf
WACV
Zhile Ren, Orazio Gallo, Deqing Sun, Ming-Hsuan Yang, Erik B. Sudderth, Jan Kautz
2019 A* conf
ICCV
Inchang Choi, Orazio Gallo, Alejandro J. Troccoli, Min H. Kim, Jan Kautz
2019 A* conf
CVPR
Hang Su, Varun Jampani, Deqing Sun, Orazio Gallo, Erik G. Learned-Miller, Jan Kautz
2019 J jnl
CoRR
Hang Su, Varun Jampani, Deqing Sun, Orazio Gallo, Erik G. Learned-Miller, Jan Kautz
2019 A conf
BMVC
Wei-Sheng Lai, Orazio Gallo, Jinwei Gu, Deqing Sun, Ming-Hsuan Yang, Jan Kautz
2019 J jnl
CoRR
Wei-Sheng Lai, Orazio Gallo, Jinwei Gu, Deqing Sun, Ming-Hsuan Yang, Jan Kautz
2018 J jnl
CoRR
Zhile Ren, Orazio Gallo, Deqing Sun, Ming-Hsuan Yang, Erik B. Sudderth, Jan Kautz
2018 conf
ECCV Workshops (6)
Zhile Ren, Orazio Gallo, Deqing Sun, Ming-Hsuan Yang, Erik B. Sudderth, Jan Kautz
2018 J jnl
CoRR
Inchang Choi, Orazio Gallo, Alejandro J. Troccoli, Min H. Kim, Jan Kautz
2018 J jnl
CoRR
Huaijin G. Chen, Jinwei Gu, Orazio Gallo, Ming-Yu Liu, Ashok Veeraraghavan, Jan Kautz
2018 B conf
ICCP
Huaijin G. Chen, Jinwei Gu, Orazio Gallo, Ming-Yu Liu, Ashok Veeraraghavan, Jan Kautz
2018 conf
ECCV (13)
Patrick Wieschollek, Orazio Gallo, Jinwei Gu, Jan Kautz
2018 conf
ECCV (1)
Qi Guo, Iuri Frosio, Orazio Gallo, Todd E. Zickler, Jan Kautz
2018 J jnl
CoRR
Qi Guo, Iuri Frosio, Orazio Gallo, Todd E. Zickler, Jan Kautz
2017 J jnl
ACM Trans. Graph.
Abhishek Badki, Orazio Gallo, Jan Kautz, Pradeep Sen
2017 J jnl
IEEE Trans. Computational Imaging
Hang Zhao, Orazio Gallo, Iuri Frosio, Jan Kautz
2017 conf
CVPR Workshops
Suren Jayasuriya, Orazio Gallo, Jinwei Gu, Timo Aila, Jan Kautz
2017 J jnl
CoRR
Patrick Wieschollek, Orazio Gallo, Jinwei Gu, Jan Kautz
2016 J jnl
CoRR
Suren Jayasuriya, Orazio Gallo, Jinwei Gu, Jan Kautz
2015 J jnl
CoRR
Orazio Gallo, Alejandro J. Troccoli, Jun Hu, Kari Pulli, Jan Kautz
2015 conf
CVPR Workshops
Orazio Gallo, Alejandro J. Troccoli, Jun Hu, Kari Pulli, Jan Kautz
2015 J jnl
CoRR
Hang Zhao, Orazio Gallo, Iuri Frosio, Jan Kautz
2015 conf
CVPR Workshops
Orazio Gallo, Iuri Frosio, Leonardo Gasparini, Kari Pulli, Massimo Gottardi
2015 J jnl
ACM Trans. Graph.
David E. Jacobs, Orazio Gallo, Emily A. Cooper, Kari Pulli, Marc Levoy
2014 conf
CVPR Workshops
David E. Jacobs, Orazio Gallo, Kari A. Pulli
2013 A* conf
CVPR
Jun Hu, Orazio Gallo, Kari Pulli, Xiaobai Sun
2013 conf
SIGGRAPH Studio Talks
Yun-Ta Tsai, Orazio Gallo, David Pajak, Kari Pulli
2013 conf
SIGGRAPH Mobile
Yun-Ta Tsai, Orazio Gallo, David Pajak, Kari Pulli
2012 conf
ECCV (1)
Jun Hu, Orazio Gallo, Kari Pulli
2012 J jnl
Comput. Graph. Forum
Orazio Gallo, Marius Tico, Roberto Manduchi, Natasha Gelfand, Kari Pulli
2011 J jnl
Pattern Recognit. Lett.
Orazio Gallo, Roberto Manduchi, Abbas Rafii
2011 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Orazio Gallo, Roberto Manduchi
2010 conf
CVPR Workshops
James E. Davis, Joan Arderiu, Hungyu Henry Lin, Zeb Nevins, Sebastian Schuon, Orazio Gallo, Ming-Hsuan Yang
2009 A conf
WACV
Orazio Gallo, Roberto Manduchi
2008 B conf
ICIP
Orazio Gallo, Sonia M. Arteaga, James E. Davis
2008 conf
CVPR Workshops
Orazio Gallo, Roberto Manduchi, Abbas Rafii
2004 conf
WAPCV
Claudio M. Privitera, Orazio Gallo, Giorgio Grimoldi, Toyomi Fujita, Lawrence W. Stark
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"