Ramakrishnan Swaminathan

79 papers C 1Journal 26Unranked 52
YearRankTypeTitle / Venue / Authors
2025 conf
ICACDS
Praveen Kumar Govarthan, Jac Fredo Agastinose Ronickom, Ramakrishnan Swaminathan
2025 J jnl
Comput. Methods Programs Biomed.
Rohini Palanisamy, Shruthi Gokul, Gokul Manoj, Abinaya Srinivasan, Sandhya Sundaram, Ramakrishnan Swaminathan
2025 J jnl
Medical Biol. Eng. Comput.
Sreelakshmi Shaji, Rohini Palanisamy, Ramakrishnan Swaminathan
2024 conf
ISBI
Subham C., Sreelakshmi Shaji, Anandh Kilpattu Ramaniharan, Swathi S., Ramakrishnan Swaminathan
2024 J jnl
IEEE Trans. Instrum. Meas.
Remya R. Nair, G. Venugopal, Ramakrishnan Swaminathan
2024 conf
EMBC
Yedukondala Rao Veeranki, Ramakrishnan Swaminathan, Hugo F. Posada-Quintero
2024 conf
MIE
Himanshu Kumar, Nagarajan Ganapathy, Ramakrishnan Swaminathan
2024 J jnl
IEEE Access
Yedukondala Rao Veeranki, Nagarajan Ganapathy, Ramakrishnan Swaminathan, Hugo F. Posada-Quintero
2024 J jnl
IEEE Access
Sourabh Banik, Himanshu Kumar, Nagarajan Ganapathy, Ramakrishnan Swaminathan
2023 conf
ICIMTH
Priyanka Jadhav, Vinothini Selvaraju, Ramakrishnan Swaminathan
2023 conf
MeMeA
S. Sowmya, Shib Sundar Banerjee, Ramakrishnan Swaminathan
2023 C conf
CoDIT
S. Sowmya, Shib Sundar Banerjee, Ramakrishnan Swaminathan
2023 conf
EMBC
Omkar Pande, Navaneethakrishna Makaram, Ramakrishnan Swaminathan
2023 conf
EMBC
P. A. Karthick, Vinothini Selvaraju, Ramakrishnan Swaminathan
2023 J jnl
Biomed. Signal Process. Control.
Sukanta Kumar Tulo, Satyavratan Govindarajan, Palaniappan Ramu, Ramakrishnan Swaminathan
2023 J jnl
Int. J. Neural Syst.
Philippa Hüpen, Himanshu Kumar, Aliaksandra Shymanskaya, Ramakrishnan Swaminathan, Ute Habel
2023 conf
EMBC
Pooja Vardhini Natesan, Shib Sundar Banerjee, Ramakrishnan Swaminathan
2023 conf
EMBC
Sreelekshmi Palliyil Sreekumar, Rohini Palanisamy, Ramakrishnan Swaminathan
2023 conf
EMBC
Priyanka Jadhav, Vinothini Selvaraju, Sarith P. Sathian, Ramakrishnan Swaminathan
2022 conf
Bildverarbeitung für die Medizin
Vinothini Selvaraju, Nicolai Spicher, Ramakrishnan Swaminathan, Thomas M. Deserno
2022 conf
ICIMTH
Sreelekshmi Palliyil Sreekumar, Rohini Palanisamy, Ramakrishnan Swaminathan
2022 conf
MeMeA
J. V. Alamelu, Mythili Asaithambi, Ramakrishnan Swaminathan
2022 conf
EMBC
Himanshu Kumar, Nagarajan Ganapathy, Subha D. Puthankattil, Ramakrishnan Swaminathan
2022 conf
ICIMTH
Shabina Shaikh, Nagarajan Ganapathy, Ramakrishnan Swaminathan
2022 conf
MIE
Yedukondala Rao Veeranki, Nagarajan Ganapathy, Ramakrishnan Swaminathan
2022 conf
MIE
Himanshu Kumar, Nagarajan Ganapathy, Subha D. Puthankattil, Ramakrishnan Swaminathan
2022 J jnl
Sensors
Vinothini Selvaraju, Nicolai Spicher, Ju Wang, Nagarajan Ganapathy, Joana M. Warnecke, Steffen Leonhardt, Ramakrishnan Swaminathan, Thomas M. Deserno
2022 conf
MIE
Sreelekshmi Palliyil Sreekumar, Rohini Palanisamy, Ramakrishnan Swaminathan
2022 conf
ICIMTH
Sreelakshmi Shaji, Rohini Palanisamy, Ramakrishnan Swaminathan
2022 J jnl
IEEE Trans. Instrum. Meas.
Shib Sundar Banerjee, Divya Bharathi Krishnamani, Periyamolapalayam Allimuthu Karthick, Arockiarajan Arunachalakasi, Ramakrishnan Swaminathan
2022 conf
EMBC
Omkar Pande, Harikrishna Makaram, Ramakrishnan Swaminathan
2022 conf
EMBC
Kumar Nandan Sinha, Navaneethakrishna Makaram, Abhijit Chaudhuri, Ramakrishnan Swaminathan
2022 conf
MeMeA
Shib Sundar Banerjee, Arockiarajan Arunachalakasi, Ramakrishnan Swaminathan
2022 J jnl
Expert Syst. Appl.
Sreelakshmi Shaji, Jac Fredo Agastinose Ronickom, Anandh Kilpattu Ramaniharan, Ramakrishnan Swaminathan
2022 conf
MeMeA
Himanshu Kumar, Ramakrishnan Swaminathan
2022 conf
EMBC
Vinothini Selvaraju, Nicolai Spicher, Ramakrishnan Swaminathan, Thomas M. Deserno
2021 J jnl
IEEE Access
Yedukondala Rao Veeranki, Himanshu Kumar, Nagarajan Ganapathy, Balasubramaniam Natarajan, Ramakrishnan Swaminathan
2021 J jnl
Comput. Methods Programs Biomed.
Nagarajan Ganapathy, Ramakrishnan Swaminathan, Thomas M. Deserno
2021 conf
MIE
Sukanta Kumar Tulo, Palaniappan Ramu, Ramakrishnan Swaminathan
2021 J jnl
IEEE Trans. Instrum. Meas.
Navaneethakrishna Makaram, Periyamolapalayam Allimuthu Karthick, Ramakrishnan Swaminathan
2021 conf
MIE
Vinothini Selvaraju, P. A. Karthick, Ramakrishnan Swaminathan
2021 J jnl
Appl. Intell.
Satyavratan Govindarajan, Ramakrishnan Swaminathan
2021 conf
MIE
Sreelakshmi Shaji, Nagarajan Ganapathy, Ramakrishnan Swaminathan
2021 J jnl
Appl. Intell.
Satyavratan Govindarajan, Ramakrishnan Swaminathan
2021 J jnl
J. Medical Syst.
Nagarajan Ganapathy, Yedukondala Rao Veeranki, Himanshu Kumar, Ramakrishnan Swaminathan
2021 conf
MIE
Jayendhra Shiva, Navaneethakrishna Makaram, Periyamolapalayam Allimuthu Karthick, Ramakrishnan Swaminathan
2021 conf
MIE
Himanshu Kumar, Nagarajan Ganapathy, Subha D. Puthankattil, Ramakrishnan Swaminathan
2021 J jnl
Comput. Methods Programs Biomed.
Satyavratan Govindarajan, Ramakrishnan Swaminathan
2021 conf
EMBC
Harikrishna Makaram, Ramakrishnan Swaminathan
2021 conf
MIE
Yedukondala Rao Veeranki, Nagarajan Ganapathy, Ramakrishnan Swaminathan
2021 conf
MIE
Satyavratan Govindarajan, Ramakrishnan Swaminathan
2021 conf
MIE
Navaneethakrishna Makaram, Sridhar P. Arjunan, Dinesh Kant Kumar, Ramakrishnan Swaminathan
2020 J jnl
J. Ambient Intell. Humaniz. Comput.
Krishnamurthy Kamalanand, Sujatha C. Manoharan, Ramakrishnan Swaminathan
2020 conf
EMBC
Lakshmi Madathil Hari, Venugopal Gopinathakaimal, Ramakrishnan Swaminathan
2020 conf
MIE
Navaneethakrishna Makaram, Ramakrishnan Swaminathan
2020 conf
MIE
Satyavratan Govindarajan, Sukanta Kumar Tulo, Ramakrishnan Swaminathan
2020 J jnl
Expert Syst. Appl.
Nagarajan Ganapathy, Yedukondala Rao Veeranki, Ramakrishnan Swaminathan
2020 conf
MIE
Nagarajan Ganapathy, Ramakrishnan Swaminathan
2020 conf
APSIPA
Divya Bharathi Krishnamani, P. A. Karthick, Ramakrishnan Swaminathan
2020 conf
MIE
Rohini Palanisamy, Ramakrishnan Swaminathan
2020 J jnl
IET Signal Process.
Divya Bharathi Krishnamani, P. A. Karthick, Ramakrishnan Swaminathan
2019 conf
ICBSP
Satyavratan Govindarajan, Neeraj Rajkumar Parmaar, Ramakrishnan Swaminathan
2019 conf
EMBC
Navaneethakrishna Makaram, Ramakrishnan Swaminathan
2019 J jnl
J. Medical Syst.
Satyavratan Govindarajan, Ramakrishnan Swaminathan
2019 conf
EMBC
Kanchana Devanathan, Nagarajan Ganapathy, Ramakrishnan Swaminathan
2019 conf
EFMI-STC
Nagarajan Ganapathy, Ramakrishnan Swaminathan
2019 J jnl
IEEE J. Biomed. Health Informatics
Punitha Namadurai, Vardhini Padmanabhan, Ramakrishnan Swaminathan
2018 conf
EMBC
Navaneethakrishna Makaram, Ramakrishnan Swaminathan
2017 conf
ICCBB
Arun S. Balaji, Navaneethakrishna Makaram, Sriram Balasubramanian, Ramakrishnan Swaminathan
2017 conf
EMBC
Kiran Marri, Diptasree Maitra Ghosh, Ramakrishnan Swaminathan
2017 conf
ICCBB
Diptasree Maitra Ghosh, Ramakrishnan Swaminathan
2016 conf
EMBC
Kiran Marri, Ramakrishnan Swaminathan
2016 J jnl
Expert Syst. Appl.
S. Edward Jero, Palaniappan Ramu, Ramakrishnan Swaminathan
2016 J jnl
Expert Syst. Appl.
Anandh Kilpattu Ramaniharan, Sujatha C. Manoharan, Ramakrishnan Swaminathan
2015 conf
FSKD
Kiran Marri, Ramakrishnan Swaminathan
2015 J jnl
Biomed. Signal Process. Control.
S. Edward Jero, Palaniappan Ramu, Ramakrishnan Swaminathan
2015 conf
EMBC
S. Edward Jero, Palaniappan Ramu, Ramakrishnan Swaminathan
2014 conf
SEMCCO
Navaneethakrishna Makaram, Ramakrishnan Swaminathan
2014 J jnl
J. Medical Syst.
S. Edward Jero, Palaniappan Ramu, Ramakrishnan Swaminathan
redb/extractors/elf_extractors/elf_symbols.py
← Index redb/extractors/elf_extractors/elf_symbols.py python
import inspect
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSymbol


class ELFSymbolExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_symbols = []
        self.elastic_index = self.index_prefix + "-elf_symbols"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _map_symbol_type(self, st_type_str: str) -> int:
        """Map symbol type string to enum value."""
        type_map = {
            'STT_NOTYPE': 0,
            'STT_OBJECT': 1,
            'STT_FUNC': 2,
            'STT_SECTION': 3,
            'STT_FILE': 4,
            'STT_COMMON': 5,
            'STT_TLS': 6
        }
        return type_map.get(st_type_str, 0)

    def _map_symbol_bind(self, st_bind_str: str) -> int:
        """Map symbol binding string to enum value."""
        bind_map = {
            'STB_LOCAL': 0,
            'STB_GLOBAL': 1,
            'STB_WEAK': 2
        }
        return bind_map.get(st_bind_str, 0)

    def _map_symbol_visibility(self, st_vis_str: str) -> int:
        """Map symbol visibility string to enum value."""
        vis_map = {
            'STV_DEFAULT': 0,
            'STV_INTERNAL': 1,
            'STV_HIDDEN': 2,
            'STV_PROTECTED': 3
        }
        return vis_map.get(st_vis_str, 0)

    def _extract_symbol_data(self, symbol, is_dynamic: bool = False) -> Dict:
        """Extract data from a single symbol."""
        try:
            # Get symbol name (handle empty names)
            symbol_name = symbol.name if symbol.name else f"<unnamed_{symbol.entry.get('st_name', 0)}>"

            # Get symbol properties
            symbol_value = symbol.entry.get('st_value', 0)
            symbol_size = symbol.entry.get('st_size', 0)

            # Handle section index - can be integer or special string like 'SHN_UNDEF'
            st_shndx_raw = symbol.entry.get('st_shndx', 0)
            if isinstance(st_shndx_raw, str):
                # Map special section index strings to integers
                shndx_map = {
                    'SHN_UNDEF': 0,
                    'SHN_ABS': 65521,  # 0xFFF1
                    'SHN_COMMON': 65522,  # 0xFFF2
                    'SHN_XINDEX': 65535,  # 0xFFFF
                }
                symbol_section_index = shndx_map.get(st_shndx_raw, 0)
                symbol_section_index_str = st_shndx_raw.replace('SHN_', '') if st_shndx_raw.startswith('SHN_') else st_shndx_raw
            else:
                symbol_section_index = st_shndx_raw
                symbol_section_index_str = str(st_shndx_raw)

            # Get symbol type and map to enum
            st_type_str = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
            symbol_type_enum = self._map_symbol_type(st_type_str)
            symbol_type_str = st_type_str.replace('STT_', '') if st_type_str.startswith('STT_') else st_type_str

            # Get symbol binding and map to enum
            st_bind_str = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')
            symbol_bind_enum = self._map_symbol_bind(st_bind_str)
            symbol_bind_str = st_bind_str.replace('STB_', '') if st_bind_str.startswith('STB_') else st_bind_str

            # Get symbol visibility and map to enum
            st_vis_str = symbol.entry.get('st_other', {}).get('visibility', 'STV_DEFAULT')
            symbol_visibility_enum = self._map_symbol_visibility(st_vis_str)
            symbol_visibility_str = st_vis_str.replace('STV_', '') if st_vis_str.startswith('STV_') else st_vis_str

            return ELFSymbol(
                symbol_name=symbol_name,
                symbol_value=symbol_value,
                symbol_size=symbol_size,
                symbol_type=symbol_type_enum,
                symbol_type_str=symbol_type_str,
                symbol_bind=symbol_bind_enum,
                symbol_bind_str=symbol_bind_str,
                symbol_visibility=symbol_visibility_enum,
                symbol_visibility_str=symbol_visibility_str,
                symbol_section_index=symbol_section_index,
                symbol_section_index_str=symbol_section_index_str,
                is_dynamic=1 if is_dynamic else 0
            )

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

    def _extract_symbols_from_section(self, elf, section_name: str, is_dynamic: bool = False) -> List[Dict]:
        """Extract symbols from a specific symbol table section."""
        symbols = []

        try:
            section = elf.get_section_by_name(section_name)
            if not section:
                self.log.debug(f"No {section_name} section found")
                return symbols

            if not hasattr(section, 'iter_symbols'):
                self.log.debug(f"Section {section_name} is not a symbol table")
                return symbols

            # Iterate through symbols in the section with per-symbol error handling
            for symbol_index, symbol in enumerate(section.iter_symbols()):
                try:
                    symbol_data = self._extract_symbol_data(symbol, is_dynamic)
                    if symbol_data:
                        symbols.append(symbol_data)
                except Exception as e:
                    self.log.warning(f"Error processing symbol {symbol_index} in {section_name}: {e}")
                    # Continue with other symbols

        except Exception as e:
            self.log.error(f"Error extracting symbols from {section_name}: {e}")

        return symbols

    def tag(self):
        return Tag.ELF_SYMBOLS.value if hasattr(Tag, 'ELF_SYMBOLS') else "elf_symbols"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_symbols = []

                # Extract static symbols from .symtab with individual error handling
                try:
                    static_symbols = self._extract_symbols_from_section(elf, '.symtab', is_dynamic=False)
                    all_symbols.extend(static_symbols)
                    self.log.debug(f"Extracted {len(static_symbols)} static symbols from .symtab")
                except Exception as e:
                    self.log.warning(f"Error extracting static symbols from .symtab: {e}")

                # Extract dynamic symbols from .dynsym with individual error handling
                try:
                    dynamic_symbols = self._extract_symbols_from_section(elf, '.dynsym', is_dynamic=True)
                    all_symbols.extend(dynamic_symbols)
                    self.log.debug(f"Extracted {len(dynamic_symbols)} dynamic symbols from .dynsym")
                except Exception as e:
                    self.log.warning(f"Error extracting dynamic symbols from .dynsym: {e}")

                return all_symbols

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_symbols = result
            return self.elf_symbols

        except Exception as e:
            self.log.error(f"Error extracting ELF symbols {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_symbols
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no symbols (e.g., stripped binary)
                # None is reserved for actual errors

                # Prepare data arrays for all symbols
                data = []
                current_time = datetime.now(timezone.utc)
                for symbol in self.elf_symbols:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        symbol.symbol_name,
                        symbol.symbol_value,
                        symbol.symbol_size,
                        symbol.symbol_type,
                        symbol.symbol_type_str,
                        symbol.symbol_bind,
                        symbol.symbol_bind_str,
                        symbol.symbol_visibility,
                        symbol.symbol_visibility_str,
                        symbol.symbol_section_index,
                        symbol.symbol_section_index_str,
                        symbol.is_dynamic,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'symbol_name', 'symbol_value', 'symbol_size',
                    'symbol_type', 'symbol_type_str',
                    'symbol_bind', 'symbol_bind_str',
                    'symbol_visibility', 'symbol_visibility_str',
                    'symbol_section_index', 'symbol_section_index_str', 'is_dynamic',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt64', 'UInt64',
                    "Enum8('NOTYPE'=0, 'OBJECT'=1, 'FUNC'=2, 'SECTION'=3, 'FILE'=4, 'COMMON'=5, 'TLS'=6)",
                    'LowCardinality(String)',
                    "Enum8('LOCAL'=0, 'GLOBAL'=1, 'WEAK'=2)",
                    'LowCardinality(String)',
                    "Enum8('DEFAULT'=0, 'INTERNAL'=1, 'HIDDEN'=2, 'PROTECTED'=3)",
                    'LowCardinality(String)',
                    'UInt16', 'LowCardinality(String)', 'UInt8',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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