Varun Ratnakar

54 papers A* 3A 6B 10Misc 4Journal 9Unranked 22
YearRankTypeTitle / Venue / Authors
2025 J jnl
J. Open Source Softw.
Varun Ratnakar, Deborah Khider
2022 B conf
CogSci
Yolanda Gil, Deborah Khider, Maximiliano Osorio, Varun Ratnakar, Hernán Vargas, Daniel Garijo, Suzanne A. Pierce
2021 J jnl
ACM Trans. Interact. Intell. Syst.
Yolanda Gil, Daniel Garijo, Deborah Khider, Craig A. Knoblock, Varun Ratnakar, Maximiliano Osorio, Hernán Vargas, Minh Pham, Jay Pujara, Basel Shbita, Binh Vu, Yao-Yi Chiang, Dan Feldman, Yijun Lin, Hayley Song, Vipin Kumar, Ankush Khandelwal, Michael S. Steinbach, Kshitij Tayal, Shaoming Xu, Suzanne A. Pierce, Lissa Pearson, Daniel Hardesty-Lewis, Ewa Deelman, Rafael Ferreira da Silva, Rajiv Mayani, Armen R. Kemanian, Yuning Shi, Lorne Leonard, Scott D. Peckham, Maria Stoica, Kelly M. Cobourn, Zeya Zhang, Christopher J. Duffy, Lele Shu
2021 B conf
e-Science
Yolanda Gil, Maximiliano Osorio, Varun Ratnakar, Suzanne A. Pierce, Je'aime H. Powell, Nick Thorne, Peter Lubbs
2019 conf
IUI Companion
Daniel Garijo, Deborah Khider, Varun Ratnakar, Yolanda Gil, Ewa Deelman, Rafael Ferreira da Silva, Craig A. Knoblock, Yao-Yi Chiang, Minh Pham, Jay Pujara, Binh Vu, Dan Feldman, Rajiv Mayani, Kelly M. Cobourn, Christopher J. Duffy, Armen R. Kemanian, Lele Shu, Vipin Kumar, Ankush Khandelwal, Kshitij Tayal, Scott D. Peckham, Maria Stoica, Anna Dabrowski, Daniel Hardesty-Lewis, Suzanne A. Pierce
2019 conf
eScience
Daniel Garijo, Maximiliano Osorio, Deborah Khider, Varun Ratnakar, Yolanda Gil
2019 Misc conf
PSB
Arunima Srivastava, Ravali Adusumilli, Hunter Boyce, Daniel Garijo, Varun Ratnakar, Rajiv Mayani, Thomas Yu, Raghu Machiraju, Yolanda Gil, Parag Mallick
2019 conf
Poly/DMAH@VLDB
Daniel Garijo, Shobeir Fakhraei, Varun Ratnakar, Qifan Yang, Hanna Endrias, Yibo Ma, Regina Wang, Michael Bornstein, Joanna Bright, Yolanda Gil, Neda Jahanshad
2017 conf
ISWC (2)
Yolanda Gil, Daniel Garijo, Varun Ratnakar, Deborah Khider, Julien Emile-Geay, Nicholas McKay
2017 conf
SemSci@ISWC
Mihyun Jang, Tejal Patted, Yolanda Gil, Daniel Garijo, Varun Ratnakar, Jie Ji, Prince Wang, Aggie McMahon, Paul M. Thompson, Neda Jahanshad
2017 conf
K-CAP Workshops
Yolanda Gil, Daniel Garijo, Margaret Knoblock, Alyssa Deng, Ravali Adusumilli, Varun Ratnakar, Parag Mallick
2017 conf
K-CAP Workshops
Daniel Garijo, Yolanda Gil, Varun Ratnakar
2017 A* conf
AAAI
Yolanda Gil, Daniel Garijo, Varun Ratnakar, Rajiv Mayani, Ravali Adusumilli, Hunter Boyce, Arunima Srivastava, Parag Mallick
2016 conf
ICSC
Yolanda Gil, Varun Ratnakar
2016 conf
eScience
Yolanda Gil, Daniel Garijo, Saurabh Mishra, Varun Ratnakar
2015 conf
ESWC (Satellite Events)
Yolanda Gil, Felix Michel, Varun Ratnakar, Matheus Hauder
2015 B conf
e-Science
Yolanda Gil, Felix Michel, Varun Ratnakar, Matheus Hauder, Christopher J. Duffy, Hilary Dugan, Paul C. Hanson
2015 conf
IUI Companion
Felix Michel, Yolanda Gil, Varun Ratnakar, Matheus Hauder
2015 conf
AMCIS
Yolanda Gil, Matheus Hauder, Felix Michel, Varun Ratnakar
2015 conf
ASE Workshops
Chris A. Mattmann, Ji-Hyun Oh, Tyler Palsulich, Lewis John McGibbney, Yolanda Gil, Varun Ratnakar
2015 B conf
K-CAP
Yolanda Gil, Varun Ratnakar, Daniel Garijo
2015 B conf
ESWC
Yolanda Gil, Felix Michel, Varun Ratnakar, Jordan S. Read, Matheus Hauder, Christopher J. Duffy, Paul C. Hanson, Hilary Dugan
2015 B conf
K-CAP
Yolanda Gil, Dipsy Kapoor, Reed Markham, Varun Ratnakar
2013 B conf
K-CAP
Yolanda Gil, Varun Ratnakar
2013 conf
ICSC
Yolanda Gil, Angela Knight, Kevin Zhang, Larry Zhang, Varun Ratnakar, Ricky J. Sethi
2013 conf
WORKS@SC
Yolanda Gil, Varun Ratnakar, Rishi Verma, Andrew F. Hart, Paul M. Ramirez, Chris Mattmann, Arni Sumarlidason, Samuel L. Park
2012 J jnl
ACM Trans. Interact. Intell. Syst.
Yolanda Gil, Varun Ratnakar, Timothy Chklovski, Paul Groth, Denny Vrandecic
2012 conf
LISC@ISWC
Yolanda Gil, Varun Ratnakar, Paul C. Hanson
2011 J jnl
J. Exp. Theor. Artif. Intell.
Yolanda Gil, Pedro A. González-Calero, Jihie Kim, Joshua Moody, Varun Ratnakar
2011 conf
ISWC (2)
Yolanda Gil, Pedro A. Szekely, Sandra Villamizar, Thomas C. Harmon, Varun Ratnakar, Shubham Gupta, Maria Muslea, Fabio Silva, Craig A. Knoblock
2011 J jnl
J. Web Semant.
Denny Vrandecic, Varun Ratnakar, Markus Krötzsch, Yolanda Gil
2011 A conf
IUI
Yolanda Gil, Varun Ratnakar, Christian Fritz
2011 A conf
IUI
Denny Vrandecic, Yolanda Gil, Varun Ratnakar
2011 J jnl
IEEE Intell. Syst.
Yolanda Gil, Varun Ratnakar, Jihie Kim, Pedro A. González-Calero, Paul Groth, Joshua Moody, Ewa Deelman
2010 conf
AAAI Fall Symposium: Proactive Assistant Agents
Yolanda Gil, Varun Ratnakar, Christian Fritz
2010 J jnl
Clust. Comput.
Vijay S. Kumar, Tahsin M. Kurç, Varun Ratnakar, Jihie Kim, Gaurang Mehta, Karan Vahi, Yoon-Ju Lee Nelson, P. Sadayappan, Ewa Deelman, Yolanda Gil, Mary W. Hall, Joel H. Saltz
2010 conf
AAAI Fall Symposium: Proactive Assistant Agents
Yolanda Gil, Paul Groth, Varun Ratnakar
2009 A conf
HPDC
Vijay S. Kumar, P. Sadayappan, Gaurang Mehta, Karan Vahi, Ewa Deelman, Varun Ratnakar, Jihie Kim, Yolanda Gil, Mary W. Hall, Tahsin M. Kurç, Joel H. Saltz
2009 conf
eScience
Yolanda Gil, Paul Groth, Varun Ratnakar, Christian Fritz
2009 B conf
K-CAP
Yolanda Gil, Jihie Kim, Gonzalo Flórez Puga, Varun Ratnakar, Pedro A. González-Calero
2008 A* conf
AAAI
Yolanda Gil, Varun Ratnakar
2008 A conf
IPDPS
Vijay S. Kumar, Mary W. Hall, Jihie Kim, Yolanda Gil, Tahsin M. Kurç, Ewa Deelman, Varun Ratnakar, Joel H. Saltz
2008 J jnl
Concurr. Comput. Pract. Exp.
Jihie Kim, Ewa Deelman, Yolanda Gil, Gaurang Mehta, Varun Ratnakar
2008 J jnl
Concurr. Comput. Pract. Exp.
Luc Moreau, Bertram Ludäscher, Ilkay Altintas, Roger S. Barga, Shawn Bowers, Steven P. Callahan, George Chin Jr., Ben Clifford, Shirley Cohen, Sarah Cohen Boulakia, Susan B. Davidson, Ewa Deelman, Luciano A. Digiampietri, Ian T. Foster, Juliana Freire, James Frew, Joe Futrelle, Tara Gibson, Yolanda Gil, Carole A. Goble, Jennifer Golbeck, Paul Groth, David A. Holland, Sheng Jiang, Jihie Kim, David Koop, Ales Krenek, Timothy M. McPhillips, Gaurang Mehta, Simon Miles, Dominic Metzger, Steve Munroe, Jim Myers, Beth Plale, Norbert Podhorszki, Varun Ratnakar, Emanuele Santos, Carlos Eduardo Scheidegger, Karen Schuchardt, Margo I. Seltzer, Yogesh L. Simmhan, Cláudio T. Silva, Peter Slaughter, Eric G. Stephan, Robert Stevens, Daniele Turi, Huy T. Vo, Michael Wilde, Jun Zhao, Yong Zhao
2008 A conf
IUI
Yolanda Gil, Varun Ratnakar
2007 A* conf
AAAI
Yolanda Gil, Varun Ratnakar, Ewa Deelman, Gaurang Mehta, Jihie Kim
2006 conf
IPAW
Yolanda Gil, Varun Ratnakar, Ewa Deelman
2006 Misc conf
ISWC
Jihie Kim, Yolanda Gil, Varun Ratnakar
2006 conf
OWLED
Yolanda Gil, Jihie Kim, Varun Ratnakar, Ewa Deelman
2005 A conf
IUI
Timothy Chklovski, Varun Ratnakar, Yolanda Gil
2002 Misc conf
FLAIRS
Yolanda Gil, Varun Ratnakar
2002 B conf
EKAW
Yolanda Gil, Varun Ratnakar
2002 B conf
EKAW
Yolanda Gil, Varun Ratnakar
2002 Misc conf
ISWC
Yolanda Gil, Varun Ratnakar
redb/extractors/macho_extractors/macho_universal.py
← Index redb/extractors/macho_extractors/macho_universal.py python
import hashlib
import inspect
import json
from datetime import datetime, timezone
from typing import Any, List

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOUniversal


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

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

    def _extract_universal_info(self):
        """Extract Universal/FAT binary architecture information using new API."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Parse at Universal level first (new API requirement)
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # Check if this is a FAT binary
            is_fat = len(architectures) > 1

            architecture_info = []

            # Extract info for each architecture
            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    # Get header info for this architecture
                    header_info = self.macho.get_macho_header(arch=arch_name)

                    # Get architecture-specific MachO instance for detailed analysis
                    arch_macho = self.macho.get_macho_for_arch(arch_name)

                    # Calculate architecture slice hash (if we can access the raw data)
                    arch_sha256 = None
                    arch_md5 = None
                    arch_sha1 = None

                    # For FAT binaries, try to get slice-specific info
                    if is_fat and arch_macho:
                        try:
                            # This would require access to the slice data
                            # For now, we'll use the general file info
                            arch_sha256 = general_info.get('SHA256', '') if general_info else ''
                            arch_md5 = general_info.get('MD5', '') if general_info else ''
                            arch_sha1 = general_info.get('SHA1', '') if general_info else ''
                        except Exception as e:
                            self.log.debug(f"Could not extract slice hash for {arch_name}: {e}")

                    architecture_info.append({
                        'architecture': arch_name,
                        'arch_sha256': arch_sha256,
                        'arch_md5': arch_md5,
                        'arch_sha1': arch_sha1,
                        'cputype': header_info.get('cputype') if header_info else None,
                        'cpusubtype': header_info.get('cpusubtype') if header_info else None,
                        'filetype': header_info.get('filetype') if header_info else None
                    })

                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            # Create Universal dataclass
            macho_universal = MachOUniversal(
                is_fat=is_fat,
                architecture_count=len(architectures),
                architectures=architectures,
                architecture_info=architecture_info,
                fat_hash=self.sha256,
                fat_md5=self.md5,
                fat_sha1=self.sha1
            )

            return macho_universal

        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def _extract_fat_architecture_mappings(self):
        """Extract detailed FAT binary architecture mappings for database relationships."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return []

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return []  # Not a FAT binary

            mappings = []
            current_time = datetime.now(timezone.utc)

            # For each architecture, create a mapping record
            for arch_name in architectures:
                try:
                    # Get general info
                    general_info = self.macho.get_general_info()

                    # Create mapping record for FAT binary architecture table
                    mapping = {
                        'fat_hash': self.sha256,  # SHA256 of the FAT binary
                        'architecture': arch_name,
                        'arch_sha256': general_info.get('SHA256', '') if general_info else '',  # Will need proper slice extraction
                        'arch_md5': general_info.get('MD5', '') if general_info else '',
                        'arch_sha1': general_info.get('SHA1', '') if general_info else '',
                        'arch_filename': f"{general_info.get('Filename', '')}.{arch_name}" if general_info else '',
                        'analysis_date': current_time
                    }
                    mappings.append(mapping)

                except Exception as e:
                    self.log.warning(f"Error creating mapping for architecture {arch_name}: {e}")
                    continue

            return mappings

        except Exception as e:
            self.log.error(f"Error extracting FAT architecture mappings: {e}")
            return []

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            universal_info = self._extract_universal_info()
            return universal_info
        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def extract_fat_binary_basic_properties_data(self):
        """Extract data needed for creating multiple BasicProperties records for FAT binaries.

        Returns:
            Tuple: (is_fat, fat_sha256, architectures_info) where:
                - is_fat: bool indicating if this is a FAT binary
                - fat_sha256: SHA256 of the FAT wrapper
                - architectures_info: dict with arch names and their hashes
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return False, None, {}

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return False, None, {}  # Not a FAT binary

            # This is a FAT binary
            architectures_info = {}

            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    if general_info:
                        architectures_info[arch_name] = {
                            'sha256': general_info.get('SHA256', ''),
                            'md5': general_info.get('MD5', ''),
                            'sha1': general_info.get('SHA1', ''),
                            'filename': general_info.get('Filename', ''),
                            'filesize': general_info.get('Filesize', 0)
                        }
                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            return True, self.sha256, architectures_info

        except Exception as e:
            self.log.error(f"Error extracting FAT binary data: {e}")
            return False, None, {}

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            universal_info = self.extract()
            if universal_info is None:
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Get architecture info for the binary
            try:
                if universal_info.is_fat:
                    # For FAT binaries, architecture fields should be NULL since it contains multiple
                    architecture_raw = None
                    architecture_str = None
                else:
                    # For single-arch binaries, get the actual architecture info
                    header_info = self.macho.get_macho_header()
                    architecture_raw = header_info.get('cputype', 0) if header_info else 0
                    architecture_str = universal_info.architectures[0] if universal_info.architectures else None
            except Exception as e:
                self.log.warning(f"Could not get architecture info for binary: {e}")
                architecture_raw = None
                architecture_str = None

            # Main Universal binary record
            data.append([
                self.sha256,                              # sha256
                self.md5,                                 # md5
                self.sha1,                                # sha1
                None,                                     # parent_sha256 (always None for main FAT binary)
                architecture_raw,                         # architecture (raw CPU type)
                architecture_str,                         # architecture_str (human-readable)
                universal_info.is_fat,                    # is_fat
                universal_info.architecture_count,       # architecture_count
                universal_info.architectures,            # architectures (array)
                json.dumps(universal_info.architecture_info[0] if len(universal_info.architecture_info) == 1 else {"architectures": universal_info.architecture_info}) if universal_info.architecture_info else None,  # architecture_info (JSON)
                current_time,                             # analysis_date
            ])

            column_names = [
                'sha256', 'md5', 'sha1', 'parent_sha256', 'architecture', 'architecture_str',
                'is_fat', 'architecture_count', 'architectures', 'architecture_info',
                'analysis_date'
            ]

            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'Nullable(FixedString(64))', 'Nullable(UInt32)', 'LowCardinality(Nullable(String))',
                'UInt8', 'UInt32', 'Array(LowCardinality(String))', 'JSON',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def prepare_fat_architecture_export_data(self) -> Any:
        """Prepare export data for the FAT binary architecture mapping table."""
        mappings = self._extract_fat_architecture_mappings()
        if not mappings:
            return None

        data = []
        for mapping in mappings:
            data.append([
                mapping['fat_hash'],
                mapping['architecture'],
                mapping['arch_sha256'],
                mapping['arch_md5'],
                mapping['arch_sha1'],
                mapping['arch_filename'],
                mapping['analysis_date'],
            ])

        column_names = [
            'fat_hash', 'architecture', 'arch_sha256', 'arch_md5', 'arch_sha1',
            'arch_filename', 'analysis_date'
        ]

        column_type_names = [
            'FixedString(64)', 'LowCardinality(String)', 'FixedString(64)',
            'FixedString(32)', 'FixedString(40)', 'String',
            'DateTime64(3, \'UTC\')'
        ]

        return (data, column_names, column_type_names)

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

    # def get_fat_architecture_table(self) -> str:
    #     """Return table name for FAT binary architecture mappings."""
    #     return "redb_fat_binary_architectures"