Ranjana K. Mehta

51 papers A* 2A 1B 4Journal 34Unranked 10
YearRankTypeTitle / Venue / Authors
2026 J jnl
ACM Trans. Hum. Robot Interact.
Aakash Yadav, Sarah K. Hopko, Prabhakar R. Pagilla, Ranjana K. Mehta
2026 J jnl
CoRR
Cassidy R. Nelson, Joseph L. Gabbard, Jason B. Moats, Ranjana K. Mehta
2026 J jnl
Hum. Factors
John Kang, Stephanie C. Payne, Farzan Sasangohar, Ranjana K. Mehta
2026 A* conf
HRI
Aakash Yadav, Prabhakar R. Pagilla, Ranjana K. Mehta
2025 J jnl
Hum. Factors
Ran Wei, Anthony D. McDonald, Ranjana K. Mehta, Alfredo García
2025 J jnl
Frontiers Robotics AI
Ranjana K. Mehta, Yibo Zhu, Eric B. Weston, William S. Marras
2025 J jnl
Frontiers Virtual Real.
Ranjana K. Mehta, John Kang, Yangming Shi, Jing Du
2025 J jnl
IEEE Trans. Learn. Technol.
Ronak R. Mohanty, Peter Selly, Lindsey J. Brenner, Shantanu Vyas, Cassidy R. Nelson, Jason B. Moats, Joseph L. Gabbard, Ranjana K. Mehta
2025 J jnl
CoRR
Alan Ta, Nilsu Salgin, Mustafa Demir, Kala Phillips Reindel, Ranjana K. Mehta, Anthony D. McDonald, Carly McCord, Farzan Sasangohar
2025 conf
ISMAR-Adjunct
Cassidy R. Nelson, Joseph L. Gabbard, Jason B. Moats, Ranjana K. Mehta
2024 J jnl
Hum. Factors
Rohith Karthikeyan, Joshua Carrizales, Connor Johnson, Ranjana K. Mehta
2024 J jnl
Int. J. Hum. Comput. Interact.
Shantanu Vyas, Shivangi Dwivedi, Lindsey J. Brenner, Isabella Pedron, Joseph L. Gabbard, Vinayak R. Krishnamurthy, Ranjana K. Mehta
2024 conf
ICHMS
Tiash Rana Mukherjee, Tiago Xavier Do Vale Gunter, Eshan Manchanda, Oshin Tyagi, Ranjana K. Mehta, Prabhakar R. Pagilla
2024 conf
HRI (Companion)
Aakash Yadav, Ranjana K. Mehta
2024 J jnl
ACM Trans. Hum. Robot Interact.
Sarah K. Hopko, Yinsu Zhang, Aakash Yadav, Prabhakar R. Pagilla, Ranjana K. Mehta
2024 J jnl
IEEE Internet Things J.
Yuhao Zhong, Yalun Wen, Sarah K. Hopko, Adithyaa Karthikeyan, Prabhakar R. Pagilla, Ranjana K. Mehta, Satish T. S. Bukkapatnam
2024 conf
SSRR
Ranjana K. Mehta, Aakash Yadav, Robin R. Murphy, S. Camille Peres
2024 conf
HRI (Companion)
Yinsu Zhang, Aakash Yadav, Sarah K. Hopko, Ranjana K. Mehta
2024 J jnl
Hum. Factors
Oshin Tyagi, Ranjana K. Mehta
2024 J jnl
Hum. Factors
Sarah K. Hopko, Ranjana K. Mehta
2023 conf
SSRR
S. Camille Peres, Robin M. Murphy, Ranjana K. Mehta
2023 J jnl
CoRR
Moein Razavi, Anthony D. McDonald, Ranjana K. Mehta, Farzan Sasangohar
2023 J jnl
Hum. Factors
Oshin Tyagi, Sarah K. Hopko, John Kang, Yangming Shi, Jing Du, Ranjana K. Mehta
2023 B conf
RO-MAN
Jay K. Shah, Aakash Yadav, Sarah K. Hopko, Ranjana K. Mehta, Prabhakar R. Pagilla
2023 J jnl
IEEE Trans. Affect. Comput.
Rohith Karthikeyan, Anthony D. McDonald, Ranjana K. Mehta
2022 conf
AIED (2)
Linda Molnar, Ranjana K. Mehta, Robby Robson
2022 J jnl
Adv. Eng. Informatics
Yang Ye, Yangming Shi, Pengxiang Xia, John Kang, Oshin Tyagi, Ranjana K. Mehta, Jing Du
2022 J jnl
Biomed. Signal Process. Control.
Lilia Aljihmani, Oussama Kerdjidj, Goran Petrovski, Madhav Erraguntla, Farzan Sasangohar, Ranjana K. Mehta, Khalid A. Qaraqe
2022 J jnl
Frontiers Robotics AI
Sarah K. Hopko, Jingkun Wang, Ranjana K. Mehta
2022 J jnl
AI Mag.
Ranjana K. Mehta, Jason Moats, Rohith Karthikeyan, Joseph L. Gabbard, Divya Srinivasan, Eric Jing Du, Alexander Leonessa, Garret Burks, Andrew Stephenson, Ron Fernandes
2022 J jnl
J. Comput. Civ. Eng.
Yangming Shi, Connor Johnson, Pengxiang Xia, John Kang, Oshin Tyagi, Ranjana K. Mehta, Jing Du
2022 A conf
IROS
Apostolos Kalatzis, Sarah K. Hopko, Ranjana K. Mehta, Laura M. Stanley, Mike P. Wittie
2022 A* conf
ISMAR
Cassidy R. Nelson, Joseph L. Gabbard, Jason B. Moats, Ranjana K. Mehta
2021 J jnl
IEEE Robotics Autom. Lett.
Sarah K. Hopko, Riya Khurana, Ranjana K. Mehta, Prabhakar R. Pagilla
2021 J jnl
Hum. Factors
Ranjana K. Mehta, Joseph K. Nuamah
2020 J jnl
Adv. Eng. Informatics
Yangming Shi, Yibo Zhu, Ranjana K. Mehta, Eric Jing Du
2020 conf
CHI Extended Abstracts
Ann McNamara, Ranjana K. Mehta
2020 J jnl
Sensors
Lilia Aljihmani, Oussama Kerdjidj, Yibo Zhu, Ranjana K. Mehta, Madhav Erraguntla, Farzan Sasangohar, Khalid A. Qaraqe
2020 J jnl
Hum. Factors
Farzan Sasangohar, Jason Moats, Ranjana K. Mehta, S. Camille Peres
2020 conf
UbiComp/ISWC Adjunct
Apostolos Kalatzis, Laura M. Stanley, Rohith Karthikeyan, Ranjana K. Mehta
2020 J jnl
Hum. Factors
Yibo Zhu, Carolina Rodriguez-Paras, Joohyun Rhee, Ranjana K. Mehta
2020 B conf
SMC
Yibo Zhu, Connor Johnson, Shuo-Hsiu James Chang, Ranjana K. Mehta
2020 B conf
SMC
Rohith Karthikeyan, Ranjana K. Mehta
2019 J jnl
BMC Medical Informatics Decis. Mak.
Joseph K. Nuamah, Farzan Sasangohar, Madhav Erraguntla, Ranjana K. Mehta
2019 conf
ISC2
Lilia Aljihmani, Hasan T. Abbas, Yibo Zhu, Ranjana K. Mehta, Farzan Sasangohar, Madhav Erraguntla, Mark Lawley, Qammer H. Abbasi, Khalid A. Qaraqe
2019 J jnl
Hum. Factors
Pankaj Parag Sharma, Ranjana K. Mehta, Adam Pickens, Gang Han, Mark Benden
2019 B conf
CBMS
Lilia Aljihmani, Yibo Zhu, Hasan T. Abbas, Ranjana K. Mehta, Farzan Sasangohar, Madhav Erraguntla, Qammer H. Abbasi, Khalid A. Qaraqe
2019 J jnl
BMC Medical Informatics Decis. Mak.
Joseph K. Nuamah, Farzan Sasangohar, Madhav Erraguntla, Ranjana K. Mehta
2017 J jnl
Hum. Factors
Ryan McKendrick, Ranjana K. Mehta, Hasan Ayaz, Melissa R. Scheldrup, Raja Parasuraman
2017 J jnl
Hum. Factors
Ranjana K. Mehta, Lora A. Cavuoto
2014 J jnl
Hum. Factors
Ranjana K. Mehta, Raja Parasuraman
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.py python
import inspect
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 MachOExport


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

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

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {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 base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            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:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'UInt32', 'Array(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

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