Rama Krishna Sai S. Gorthi

20 papers B 1Journal 11Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
Image Vis. Comput.
Vinayak Nageli, Arshad Jamal, Puneet Goyal, Rama Krishna Sai S. Gorthi
2025 J jnl
Mach. Learn.
Arun Kumar Sivapuram, Komuravelli Prashanth, Rama Krishna Sai S. Gorthi
2024 J jnl
CoRR
Sree Rama Vamsidhar S., Bhargava Satya Nunna, Rama Krishna Sai S. Gorthi
2024 J jnl
Mach. Vis. Appl.
Mohana Murali Dasari, Rama Krishna Sai S. Gorthi
2024 conf
CVPR Workshops
Sree Rama Vamsidhar S., Jayadeep D, Rama Krishna Sai S. Gorthi
2024 J jnl
Vis. Comput.
Mohana Murali Dasari, Rama Krishna Sai S. Gorthi
2024 J jnl
CoRR
Sree Rama Vamsidhar S., Rama Krishna Sai S. Gorthi
2024 J jnl
CoRR
Sree Rama Vamsidhar S., Rama Krishna Sai S. Gorthi
2024 conf
ISBI
Krishna Sumanth Vengala, Rama Krishna Sai S. Gorthi, Subrahmanyam Gorthi
2024 conf
ECCV Workshops (7)
Matej Kristan, Jirí Matas, Pavel Tokmakov, Michael Felsberg, Luka Cehovin Zajc, Alan Lukezic, Khanh-Tung Tran, Xuan-Son Vu, Johanna Björklund, Hyung Jin Chang, Gustavo Fernández, Minasadat Attari, Antoni B. Chan, Liang Chen, Xin Chen, Jaired Collins, Yutao Cui, Ganesh Sai Manas Devarapu, Yinglong Du, Heng Fan, Wan-Cyuan Fan, Zhenhua Feng, Mingqi Gao, Rama Krishna Sai S. Gorthi, Raghav Goyal, Jungong Han, Bijaya Kumar Hatuwal, Zhenyu He, Xiantao Hu, Xingsen Huang, Yuqing Huang, Dongmei Jiang, Ben Kang, Kannappan Palaniappan, Josef Kittler, Simiao Lai, Ning Li, Xiaohai Li, Xin Li, Cheng Liang, Liting Lin, Haibin Ling, Ting Liu, Ziquan Liu, Huchuan Lu, Yifei Luo, Deshui Miao, Juan David Mogollon, Ziqi Pang, Jaswanth Reddy Pochimireddy, Viktor Prutyanov, Gani Rahmon, Aleksandr Romanov, Liangtao Shi, Mennatullah Siam, Leonid Sigal, Arun Kumar Sivapuram, Roman A. Solovyev, Elham Soltani Kazemi, Imad Eddine Toubal, Jia Wan, Limin Wang, Xinying Wang, Yaowei Wang, Yu-Xiong Wang, Zhiquan Wang, Gangshan Wu, Qiangqiang Wu, Xiaojun Wu, Zihao Xia, Jinxia Xie, Chenlong Xu, Tianyang Xu, Yong Xu, Chaocan Xue, Chao Yang, Jinyu Yang, Ming-Hsuan Yang, Chenyang Yu, Ke Yu, Chunhui Zhang, Jiaming Zhang, Zhipeng Zhang, Feng Zheng, Yaozong Zheng, Bineng Zhong, Jinglin Zhou, Junbao Zhou, Yong Zhou, Zikun Zhou, Guibo Zhu, Jiawen Zhu, Xuefeng Zhu, Vladimir V. Zunin
2024 conf
ICPR (21)
Vaishnavi Ravi, Siddharth Parlapalli, Sameer Ranjan, Rama Krishna Sai S. Gorthi
2023 conf
CVIP (3)
Sree Rama Vamsidhar S., Bhargava Satya Nunna, Rama Krishna Sai S. Gorthi
2023 J jnl
Displays
Mohana Murali Dasari, Hari Chandana Kuchibhotla, Aravind Rajiv, Rama Krishna Sai S. Gorthi
2023 conf
CVIP (3)
Vaishnavi Ravi, Krishna Sumanth Vengala, Rama Krishna Sai S. Gorthi, Subrahmanyam Gorthi
2023 J jnl
Medical Image Anal.
Jianning Li, David G. Ellis, Oldrich Kodym, Laurèl Rauschenbach, Christoph Rieß, Ulrich Sure, Karsten H. Wrede, Carlos M. Alvarez, Marek Wodzinski, Mateusz Daniol, Daria Hemmerling, Hamza Mahdi, Allison Clement, Evan Kim, Zachary Fishman, Cari M. Whyne, James G. Mainprize, Michael R. Hardisty, Shashwat Pathak, Chitimireddy Sindhura, Rama Krishna Sai S. Gorthi, Degala Venkata Kiran, Subrahmanyam Gorthi, Bokai Yang, Ke Fang, Xingyu Li, Artem Kroviakov, Lei Yu, Yuan Jin, Antonio Pepe, Christina Gsaxner, Adam Herout, Victor Alves, Michal Spanel, Michele R. Aizenberg, Jens Kleesiek, Jan Egger
2023 J jnl
Neural Networks
Sree Rama Vamsidhar S., Arun Kumar Sivapuram, Vaishnavi Ravi, Gowtham Senthil, Rama Krishna Sai S. Gorthi
2022 J jnl
IEEE Signal Process. Lett.
Krishna Sumanth Vengala, Vaishnavi Ravi, Rama Krishna Sai S. Gorthi
2022 B conf
ICPR
Arun Kumar Sivapuram, Abhijit Pal, Konda Reddy Mopuri, Rama Krishna Sai S. Gorthi
2022 conf
ECCV Workshops (8)
Matej Kristan, Ales Leonardis, Jirí Matas, Michael Felsberg, Roman P. Pflugfelder, Joni-Kristian Kämäräinen, Hyung Jin Chang, Martin Danelljan, Luka Cehovin Zajc, Alan Lukezic, Ondrej Drbohlav, Johanna Björklund, Yushan Zhang, Zhongqun Zhang, Song Yan, Wenyan Yang, Dingding Cai, Christoph Mayer, Gustavo Fernández, Kang Ben, Goutam Bhat, Hong Chang, Guangqi Chen, Jiaye Chen, Shengyong Chen, Xilin Chen, Xin Chen, Xiuyi Chen, Yiwei Chen, Yu-Hsi Chen, Zhixing Chen, Yangming Cheng, Angelo Ciaramella, Yutao Cui, Benjamin Dzubur, Mohana Murali Dasari, Qili Deng, Debajyoti Dhar, Shangzhe Di, Emanuel Di Nardo, Daniel K. Du, Matteo Dunnhofer, Heng Fan, Zhenhua Feng, Zhihong Fu, Shang Gao, Rama Krishna Sai S. Gorthi, Eric Granger, Q. H. Gu, Himanshu Gupta, Jianfeng He, Keji He, Yan Huang, Deepak Jangid, Rongrong Ji, Cheng Jiang, Yingjie Jiang, Felix Järemo Lawin, Ze Kang, Madhu Kiran, Josef Kittler, Simiao Lai, Xiangyuan Lan, Dongwook Lee, Hyunjeong Lee, Seohyung Lee, Hui Li, Ming Li, Wangkai Li, Xi Li, Xianxian Li, Xiao Li, Zhe Li, Liting Lin, Haibin Ling, Bo Liu, Chang Liu, Si Liu, Huchuan Lu, Rafael M. O. Cruz, Bingpeng Ma, Chao Ma, Jie Ma, Yinchao Ma, Niki Martinel, Alireza Memarmoghadam, Christian Micheloni, Payman Moallem, Le Thanh Nguyen-Meidine, Siyang Pan, Changbeom Park, Danda Pani Paudel, Matthieu Paul, Houwen Peng, Andreas Robinson, Litu Rout, Shiguang Shan, Kristian Simonato, Tianhui Song, Xiaoning Song, Chao Sun, Jingna Sun, Zhangyong Tang, Radu Timofte, Chi-Yi Tsai, Luc Van Gool, Om Prakash Verma, Dong Wang, Fei Wang, Liang Wang, Liangliang Wang, Lijun Wang, Limin Wang, Qiang Wang, Gangshan Wu, Jinlin Wu, Xiaojun Wu, Fei Xie, Tianyang Xu, Wei Xu, Yong Xu, Yuanyou Xu, Wanli Xue, Zizheng Xun, Bin Yan, Dawei Yang, Jinyu Yang, Wankou Yang, Xiaoyun Yang, Yi Yang, Yichun Yang, Zongxin Yang, Botao Ye, Fisher Yu, Hongyuan Yu, Jiaqian Yu, Qianjin Yu, Weichen Yu, Kang Ze, Jiang Zhai, Chengwei Zhang, Chunhu Zhang, Kaihua Zhang, Tianzhu Zhang, Wenkang Zhang, Zhibin Zhang, Zhipeng Zhang, Jie Zhao, Shao-Chuan Zhao, Feng Zheng, Haixia Zheng, Min Zheng, Bineng Zhong, Jiawen Zhu, Xuefeng Zhu, Yueting Zhuang
2021 conf
ICCVW
Matej Kristan, Jirí Matas, Ales Leonardis, Michael Felsberg, Roman P. Pflugfelder, Joni-Kristian Kämäräinen, Hyung Jin Chang, Martin Danelljan, Luka Cehovin Zajc, Alan Lukezic, Ondrej Drbohlav, Jani Käpylä, Gustav Häger, Song Yan, Jinyu Yang, Zhongqun Zhang, Gustavo Fernández, Mohamed H. Abdelpakey, Goutam Bhat, Llukman Cerkezi, Hakan Cevikalp, Shengyong Chen, Xin Chen, Miao Cheng, Ziyi Cheng, Yu-Chen Chiu, Ozgun Cirakman, Yutao Cui, Kenan Dai, Mohana Murali Dasari, Qili Deng, Xingping Dong, Daniel K. Du, Matteo Dunnhofer, Zhenhua Feng, Zhiyong Feng, Zhihong Fu, Shiming Ge, Rama Krishna Sai S. Gorthi, Yuzhang Gu, Bilge Günsel, Qing Guo, Filiz Gurkan, Wencheng Han, Yanyan Huang, Felix Järemo Lawin, Shang-Jhih Jhang, Rongrong Ji, Cheng Jiang, Yingjie Jiang, Felix Juefei-Xu, J. Yin, Xiao Ke, Fahad Shahbaz Khan, Byeong Hak Kim, Josef Kittler, Xiangyuan Lan, Jun Ha Lee, Bastian Leibe, Hui Li, Jianhua Li, Xianxian Li, Yuezhou Li, Bo Liu, Chang Liu, Jingen Liu, Li Liu, Qingjie Liu, Huchuan Lu, Wei Lu, Jonathon Luiten, Jie Ma, Ziang Ma, Niki Martinel, Christoph Mayer, Alireza Memarmoghadam, Christian Micheloni, Yuzhen Niu, Danda Pani Paudel, Houwen Peng, Shoumeng Qiu, Aravindh Rajiv, Muhammad Rana, Andreas Robinson, Hasan Saribas, Ling Shao, Mohamed Shehata, Furao Shen, Jianbing Shen, Kristian Simonato, Xiaoning Song, Zhangyong Tang, Radu Timofte, Philip H. S. Torr, Chi-Yi Tsai, Bedirhan Uzun, Luc Van Gool, Paul Voigtlaender, Dong Wang, Guangting Wang, Liangliang Wang, Lijun Wang, Limin Wang, Linyuan Wang, Yong Wang, Yunhong Wang, Chenyan Wu, Gangshan Wu, Xiaojun Wu, Fei Xie, Tianyang Xu, Xiang Xu, Wanli Xue, Bin Yan, Wankou Yang, Xiaoyun Yang, Yu Ye, Jun Yin, Chengwei Zhang, Chunhui Zhang, Haitao Zhang, Kaihua Zhang, Kangkai Zhang, Xiaohan Zhang, Xiaolin Zhang, Xinyu Zhang, Zhibin Zhang, Shao-Chuan Zhao, Ming Zhen, Bineng Zhong, Jiawen Zhu, Xuefeng Zhu
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"