K. Gopakumar

70 papers C 25Journal 34Unranked 11
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Ind. Electron.
Vaidika T. Pardhi, Rohith Pottekkat, Vivek R. S, K. Gopakumar, Loganathan Umanand, Dariusz Zielinski
2025 J jnl
IEEE Trans. Ind. Electron.
Lallumol K. Johny, Jaison Mathew, K. Gopakumar
2025 J jnl
IEEE Trans. Ind. Electron.
Ruman Kalyan Mahapatra, Loganathan Umanand, K. Gopakumar
2025 J jnl
IEEE Trans. Ind. Electron.
Nair Syam Sundar S., Vivek R. S, Vibhore Jain, K. Gopakumar, Loganathan Umanand, Dariusz Zielinski
2024 J jnl
IEEE Trans. Ind. Electron.
Vivek R. S, Tutan Debnath, K. Gopakumar, Loganathan Umanand, Dariusz Zielinski
2024 C conf
IECON
Rohith Pottekkat, Vivek R. S, K. Gopakumar, Loganathan Umanand, B. Subba Reddy, Leopoldo García Franquelo
2024 conf
ICIT
Anchal S. Thakur, Vivek R. S, Rohith, K. Gopakumar, Loganathan Umanand, Subba Reddy B
2024 C conf
IECON
Vaidika T. Pardhi, Rohith Pottekkat, Nair Syam Sundar, Vivek R. S, K. Gopakumar, Loganathan Umanand
2024 C conf
IECON
Nair Syam Sundar S., Loganathan Umanand, K. Gopakumar
2023 C conf
IECON
Vivek R. S, Tutan Debnath, K. Gopakumar, Loganathan Umanand, Dariusz Zielinski
2022 C conf
IECON
Prashant Surana, Mriganka Ghosh Majumder, K. Gopakumar, Loganathan Umanand, Leopoldo García Franquelo
2022 J jnl
IEEE Trans. Ind. Electron.
Tutan Debnath, Rakesh R, Mriganka Ghosh Majumder, Mohammed Imthias, K. Gopakumar, Loganathan Umanand, Leopoldo García Franquelo
2022 J jnl
IEEE Trans. Ind. Electron.
Rahul Dewani, K. Gopakumar, Loganathan Umanand, Leopoldo García Franquelo, Kaushik Rajashekara
2022 J jnl
IEEE Trans. Ind. Electron.
Souradeep Pal, Mriganka Ghosh Majumder, Rakesh Resalayyan, K. Gopakumar, Loganathan Umanand, Mariusz Malinowski, Dariusz Zielinski
2022 J jnl
IEEE Trans. Ind. Electron.
Rakesh R, Mriganka Ghosh Majumder, Rahul Dewani, K. Gopakumar, Loganathan Umanand, Wojciech Jarzyna, Leopoldo García Franquelo
2022 C conf
IECON
Tutan Debnath, K. Gopakumar, Loganathan Umanand
2022 C conf
IECON
Nair Syam Sundar S., Prathap B. Reddy, Subhabrata Basak, Loganathan Umanand, K. Gopakumar
2022 C conf
IECON
Ruman Kalyan Mahapatra, Loganathan Umanand, K. Gopakumar
2021 C conf
IECON
Prashant Surana, Rakesh R, K. Gopakumar, Loganathan Umanand
2021 J jnl
IEEE Trans. Ind. Electron.
Rakesh R, Mriganka Ghosh Majumder, K. Gopakumar, Loganathan Umanand, Dariusz Zielinski, Wojciech Jarzyna, Kamal Al-Haddad
2021 J jnl
IEEE Trans. Ind. Electron.
Rahul Dewani, Rakesh R, K. Gopakumar, Loganathan Umanand, Dariusz Zielinski, Leopoldo García Franquelo
2021 C conf
IECON
Rahul Dewani, K. Gopakumar, Loganathan Umanand, Leopoldo García Franquelo, Kaushik Rajashekara
2021 C conf
IECON
Rahul Dewani, K. Gopakumar, Loganathan Umanand, S. Bhattacharya
2020 J jnl
IEEE Trans. Ind. Electron.
Mriganka Ghosh Majumder, Apurv Kumar Yadav, K. Gopakumar, Krishna Raj R, Loganathan Umanand, Leopoldo García Franquelo
2020 conf
ISIE
Rakesh R, Mriganka Ghosh Majumder, K. Gopakumar, Loganathan Umanand, Leopoldo García Franquelo, Wojciech Jarzyna
2020 C conf
IECON
Rakesh R, Mriganka Ghosh Majumder, K. Gopakumar, Loganathan Umanand, Dariusz Zieliski, Leopoldo García Franquelo
2020 conf
ISIE
Souradeep Pal, Mriganka Ghosh Majumder, Rakesh R, Ruman Kalyan Mahapatra, K. Gopakumar, Loganathan Umanand
2020 J jnl
IEEE Trans. Ind. Electron.
Mriganka Ghosh Majumder, Rakesh R, Mohammed Imthias, K. Gopakumar, Loganathan Umanand, Wojciech Jarzyna
2020 conf
ISIE
Rahul Dewani, Mriganka Ghosh Majumder, Rakesh R, K. Gopakumar, Loganathan Umanand, Dariusz Zieliski, Wojciech Jarzyna
2020 J jnl
IEEE Trans. Ind. Electron.
Mohammed Imthias, Krishna Raj R, Apurv Kumar Yadav, K. Gopakumar, Loganathan Umanand, Carlo Cecati
2020 J jnl
IEEE Access
Mateusz Litwin, Dariusz Zielinski, K. Gopakumar
2020 conf
ISIE
Ruman Kalyan Mahapatra, Souradeep Pal, Loganathan Umanand, K. Gopakumar
2019 conf
ISIE
Rakesh R, Apurv Kumar Yadav, Krishna Raj R, K. Gopakumar, Loganathan Umanand
2019 C conf
IECON
Mriganka Ghosh Majumder, Rakesh R, Mohammed Imthias, K. Gopakumar, Loganathan Umanand, Kamal Al-Haddad, Leopoldo García Franquelo
2019 J jnl
IEEE Trans. Ind. Electron.
Krishna Raj R, K. Gopakumar, Mathews Boby, Apurv Kumar Yadav, Leopoldo García Franquelo, Sheldon S. Williamson
2018 C conf
IECON
Apurv Kumar Yadav, K. Gopakumar, Krishna Raj R, Loganathan Umanand, Subhashish Bhattacharya, Wojciech Jarzyna
2018 C conf
IECON
Krishna Raj R, K. Gopakumar, Apurv Kumar Yadav, Loganathan Umanand, Mariusz Malinowski, Wojciech Jarzyna
2018 J jnl
IEEE Trans. Ind. Electron.
Viju Nair R, K. Gopakumar, Leopoldo García Franquelo
2018 conf
ISIE
Mohammed Imthias, Krishna Raj R, Apurv Kumar Yadav, K. Gopakumar, Carlo Cecati
2017 J jnl
IEEE Trans. Ind. Electron.
Krishna Raj R, K. Gopakumar, Mathews Boby, Mariusz Malinowski, Marek Jasinski
2017 C conf
IECON
R. Sudharshan Kaarthik, Jaison Mathew, K. Gopakumar
2017 J jnl
IEEE Trans. Ind. Electron.
Abhijit Kshirsagar, R. Sudharshan Kaarthik, K. Gopakumar, Loganathan Umanand, Kaushik Rajashekara
2017 conf
ISIE
Apurv Kumar Yadav, Mathews Boby, Sumit Pramanick, K. Gopakumar, Leopoldo García Franquelo
2017 J jnl
IEEE Trans. Ind. Electron.
Viju Nair R, S. Arun Rahul, Sumit Pramanick, K. Gopakumar, Leopoldo García Franquelo
2017 C conf
IECON
Krishna Raj R, K. Gopakumar, Mathews Boby, Apurv Kumar Yadav, Leopoldo García Franquelo, Sheldon S. Williamson
2017 conf
ICIT
R. Viju Nair, S. Arun Rahul, K. Gopakumar, Leopoldo García Franquelo, Sheldon S. Williamson
2016 J jnl
IEEE Trans. Ind. Electron.
S. Arun Rahul, R. Sudharshan Kaarthik, K. Gopakumar, Leopoldo García Franquelo, Jose Ignacio León Galván
2016 J jnl
IEEE Trans. Ind. Electron.
Sumit Pramanick, Mathews Boby, Najath Abdul Azeez, K. Gopakumar, Sheldon S. Williamson
2016 conf
ISIE
Viju Nair R, S. Arun Rahul, Sumit Pramanick, K. Gopakumar, Leopoldo García Franquelo
2016 C conf
IECON
Viju Nair Rajankutty, Arun Rahul S, K. Gopakumar, Biswarup Basak, Leopoldo García Franquelo
2016 J jnl
IEEE Trans. Ind. Electron.
S. Arun Rahul, Sumit Pramanick, Mathews Boby, K. Gopakumar, Leopoldo García Franquelo
2016 J jnl
IEEE Trans. Ind. Electron.
Mathews Boby, Sumit Pramanick, R. Sudharshan Kaarthik, S. Arun Rahul, K. Gopakumar, Loganathan Umanand
2016 C conf
IECON
Abhijit Kshirsagar, R. Sudharshan Kaarthik, S. Arun Rahul, K. Gopakumar, Loganathan Umanand, Sujit Biswas, Carlo Cecati
2016 J jnl
IEEE Trans. Ind. Electron.
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2015 J jnl
IEEE Trans. Ind. Electron.
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2015 conf
ICIT
R. Sudharshan Kaarthik, P. Roshan Kumar, K. Gopakumar, José I. Leon, Leopoldo García Franquelo
2015 J jnl
IEEE Trans. Ind. Electron.
Sumit Pramanick, Najath Abdul Azeez, R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati
2015 J jnl
IEEE Trans. Ind. Electron.
R. Sudharshan Kaarthik, K. Gopakumar, Jaison Mathew, Tore Undeland
2015 C conf
IECON
Abhijit Kshirsagar, R. Sudharshan Kaarthik, Loganathan Umanand, K. Gopakumar, Kaushik Rajashekara
2015 C conf
IECON
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2014 C conf
IECON
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2014 J jnl
IEEE Trans. Ind. Electron.
Najath Abdul Azeez, K. Gopakumar, Jaison Mathew, Carlo Cecati
2014 J jnl
IEEE Trans. Ind. Electron.
Najath Abdul Azeez, Anubrata Dey, K. Mathew, Jaison Mathew, K. Gopakumar, Marian P. Kazmierkowski
2013 C conf
IECON
Najath Abdul Azeez, Jaison Mathew, K. Gopakumar, Carlo Cecati
2013 C conf
IECON
P. Roshan Kumar, R. Sudharshan Kaarthik, K. Gopakumar, P. P. Rajeevan, José I. Leon, Leopoldo García Franquelo
2012 C conf
IECON
K. Mathew, K. Gopakumar, Jaison Mathew, Najath Abdul Azeez, Anubrata Dey, Loganathan Umanand
2010 J jnl
IEEE Trans. Ind. Electron.
Mariusz Malinowski, K. Gopakumar, José R. Rodríguez, Marcelo A. Pérez
2010 J jnl
IEEE Trans. Ind. Electron.
Samir Kouro, Mariusz Malinowski, K. Gopakumar, Josep Pou, Leopoldo García Franquelo, Bin Wu, José R. Rodríguez, Marcelo A. Pérez, Jose Ignacio León Galván
2005 J jnl
IEEE Trans. Ind. Electron.
V. T. Somasekhar, K. Gopakumar, M. R. Baiju, Krushna Keshaba Mohapatra, Loganathan Umanand
2003 J jnl
IEEE Trans. Ind. Electron.
Krushna Keshaba Mohapatra, K. Gopakumar, V. T. Somasekhar, Loganathan Umanand
redb/extractors/elf_extractors/elf_segments.py
← Index redb/extractors/elf_extractors/elf_segments.py python
import inspect
import hashlib
import math
from collections import Counter
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 ELFSegment


class ELFSegmentExtractor(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_segments = []
        self.elastic_index = self.index_prefix + "-elf_segments"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _is_empty_result(self, extracted_data) -> bool:
        """
        Override: Empty segments is an ERROR, not a valid empty case.
        A valid ELF file must have segments (program headers).
        """
        # Always return False - empty segments should be treated as an error
        return False

    def _calculate_entropy(self, data: bytes) -> float:
        """Calculate Shannon entropy of data."""
        if not data:
            return 0.0

        try:
            # Count frequency of each byte
            byte_counts = Counter(data)
            data_len = len(data)

            # Calculate entropy
            entropy = 0.0
            for count in byte_counts.values():
                if count > 0:
                    frequency = count / data_len
                    entropy -= frequency * math.log2(frequency)

            return entropy
        except Exception as e:
            self.log.error(f"Error calculating entropy: {e}")
            return 0.0

    def _map_segment_type(self, p_type_str: str) -> int:
        """Map segment type string to enum value."""
        type_map = {
            'PT_NULL': 0,
            'PT_LOAD': 1,
            'PT_DYNAMIC': 2,
            'PT_INTERP': 3,
            'PT_NOTE': 4,
            'PT_SHLIB': 5,
            'PT_PHDR': 6,
            'PT_TLS': 7
        }
        return type_map.get(p_type_str, 0)

    def _decode_segment_flags(self, flags: int) -> List[str]:
        """Decode segment flags to human-readable strings."""
        flag_strings = []

        if flags & 0x1:  # PF_X
            flag_strings.append('EXECUTE')
        if flags & 0x2:  # PF_W
            flag_strings.append('WRITE')
        if flags & 0x4:  # PF_R
            flag_strings.append('READ')

        return flag_strings if flag_strings else ['NONE']

    def _extract_segment_data(self, segment) -> ELFSegment:
        """Extract data from a single segment with granular error handling."""
        # Initialize with safe defaults
        segment_type = 0
        segment_type_str = 'unknown'
        segment_flags = 0
        segment_flags_str = ['NONE']
        segment_offset = 0
        segment_vaddr = 0
        segment_paddr = 0
        segment_filesz = 0
        segment_memsz = 0
        segment_align = 0
        segment_entropy = 0.0
        segment_sha256 = ""
        segment_md5 = ""

        # Try to get segment header
        header = None
        try:
            header = segment.header
        except Exception as e:
            self.log.warning(f"Could not access segment header: {e}")
            return ELFSegment(
                segment_type=segment_type, segment_type_str=segment_type_str,
                segment_flags=segment_flags, segment_flags_str=segment_flags_str,
                segment_offset=segment_offset, segment_vaddr=segment_vaddr,
                segment_paddr=segment_paddr, segment_filesz=segment_filesz,
                segment_memsz=segment_memsz, segment_align=segment_align,
                segment_entropy=segment_entropy, segment_sha256=segment_sha256,
                segment_md5=segment_md5
            )

        # Extract segment type
        try:
            p_type_str = header.get('p_type', 'PT_NULL')
            segment_type = self._map_segment_type(p_type_str)
            segment_type_str = p_type_str.replace('PT_', '') if p_type_str.startswith('PT_') else p_type_str
        except Exception as e:
            self.log.warning(f"Could not extract segment type: {e}")

        # Extract segment flags
        try:
            segment_flags = header.get('p_flags', 0)
            segment_flags_str = self._decode_segment_flags(segment_flags)
        except Exception as e:
            self.log.warning(f"Could not extract segment flags: {e}")

        # Extract segment addresses and sizes
        try:
            segment_offset = header.get('p_offset', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment offset: {e}")

        try:
            segment_vaddr = header.get('p_vaddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment vaddr: {e}")

        try:
            segment_paddr = header.get('p_paddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment paddr: {e}")

        try:
            segment_filesz = header.get('p_filesz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment filesz: {e}")

        try:
            segment_memsz = header.get('p_memsz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment memsz: {e}")

        try:
            segment_align = header.get('p_align', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment align: {e}")

        # Calculate entropy and hashes for segment data (most likely to fail)
        try:
            if segment_filesz > 0:
                segment_data = segment.data()
                if segment_data:
                    # Calculate entropy
                    segment_entropy = self._calculate_entropy(segment_data)

                    # Calculate hashes
                    segment_sha256 = hashlib.sha256(segment_data).hexdigest()
                    segment_md5 = hashlib.md5(segment_data).hexdigest()
        except Exception as e:
            self.log.warning(f"Could not read segment data for hashing: {e}")
            # Keep defaults (0.0, "", "")

        return ELFSegment(
            segment_type=segment_type,
            segment_type_str=segment_type_str,
            segment_flags=segment_flags,
            segment_flags_str=segment_flags_str,
            segment_offset=segment_offset,
            segment_vaddr=segment_vaddr,
            segment_paddr=segment_paddr,
            segment_filesz=segment_filesz,
            segment_memsz=segment_memsz,
            segment_align=segment_align,
            segment_entropy=segment_entropy,
            segment_sha256=segment_sha256,
            segment_md5=segment_md5
        )

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

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

            def extract_segments(elf):
                segments_data = []

                # Iterate through all segments with per-segment error handling
                for segment_index, segment in enumerate(elf.iter_segments()):
                    try:
                        segment_data = self._extract_segment_data(segment)
                        if segment_data:
                            segments_data.append(segment_data)
                        else:
                            self.log.warning(f"Failed to extract data for segment {segment_index}")
                    except Exception as e:
                        self.log.warning(f"Error processing segment {segment_index}: {e}")
                        # Continue processing other segments

                return segments_data

            # Check if file is valid ELF
            if not self._is_elf_file():
                self.log.error(f"No valid ELF file for {self.hash.sha256}")
                return None

            segments_data = self._with_elf_file(extract_segments)
            if segments_data is None:
                return None

            self.elf_segments = segments_data
            return self.elf_segments

        except Exception as e:
            self.log.error(f"Error extracting ELF segments {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_segments
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_segments:
                    return None

                # Prepare data arrays for all segments
                data = []
                current_time = datetime.now(timezone.utc)
                for segment in self.elf_segments:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        segment.segment_type,
                        segment.segment_type_str,
                        segment.segment_flags,
                        segment.segment_flags_str,
                        segment.segment_offset,
                        segment.segment_vaddr,
                        segment.segment_paddr,
                        segment.segment_filesz,
                        segment.segment_memsz,
                        segment.segment_align,
                        segment.segment_entropy,
                        segment.segment_sha256,
                        segment.segment_md5,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'segment_type', 'segment_type_str', 'segment_flags', 'segment_flags_str',
                    'segment_offset', 'segment_vaddr', 'segment_paddr',
                    'segment_filesz', 'segment_memsz', 'segment_align',
                    'segment_entropy', 'segment_sha256', 'segment_md5',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('NULL'=0, 'LOAD'=1, 'DYNAMIC'=2, 'INTERP'=3, 'NOTE'=4, 'SHLIB'=5, 'PHDR'=6, 'TLS'=7)",
                    'LowCardinality(String)',
                    'UInt32',
                    'Array(LowCardinality(String))',
                    'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64',
                    'Float64',
                    'FixedString(64)', 'FixedString(32)',
                    '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_segments"