Xavier N. Fernando

87 papers B 5C 1Misc 3Journal 38Unranked 40
YearRankTypeTitle / Venue / Authors
2021 conf
CAMAD
Bhagawat Adhikari, Xavier N. Fernando
2021 J jnl
Int. J. Intell. Syst.
Ramkumar Devendiran, Padmanathan Kasinathan, Vigna K. Ramachandaramurthy, Umashankar Subramaniam, Uma Govindarajan, Xavier N. Fernando
2020 J jnl
IEEE Access
Ahasanun Nessa, Bhagawat Adhikari, Fatima Hussain, Xavier N. Fernando
2020 J jnl
IEEE Consumer Electron. Mag.
Essa Jafer, Sattar Hussain, Xavier N. Fernando
2020 conf
CNS
Ahasanun Nessa, Fatima Hussain, Xavier N. Fernando
2020 J jnl
IEEE Consumer Electron. Mag.
Xavier N. Fernando
2020 conf
VTC Spring
Alston Lloyed Emmanuel, Xavier N. Fernando, Fatima Hussain, Wisam Farjow
2019 J jnl
IET Commun.
Ajmery Sultana, Lian Zhao, Xavier N. Fernando
2019 J jnl
IEEE Trans. Veh. Technol.
Salam Al-Juboori, Xavier N. Fernando, Yansha Deng, Arumugam Nallanathan
2019 J jnl
IEEE Trans. Veh. Technol.
Noha Hassan, Xavier N. Fernando
2019 J jnl
Comput. Electr. Eng.
Pasumpon Pandian, Xavier N. Fernando, Tomonobu Senjyu
2019 J jnl
Autom.
Dan Song, Ratnasingham Tharmarasa, Mihai Cristian Florea, Nicolas Duclos-Hindie, Xavier N. Fernando, Thiagalingam Kirubarajan
2019 Misc conf
ACSSC
Nima Nikvand, Zhou Wang, Wisam Farjow, Xavier N. Fernando, S. Younes Sadat-Nejad
2019 Misc conf
ICNC
Oleg Surnin, Fatima Hussain, Rasheed Hussain, Svetlana Ostrovskaya, Andrey Polovinkin, Jooyoung Lee, Xavier N. Fernando
2019 J jnl
Soft Comput.
Pasumpon Pandian, Xavier N. Fernando, Tomonobu Senjyu
2019 conf
SmartCloud
Mohammad Aazam, Xavier N. Fernando
2018 conf
GLOBECOM Workshops
Hasan Farahneh, Fatima Hussain, Rasheed Hussain, Xavier N. Fernando
2018 conf
ICC Workshops
Hasan Farahneh, Sikder M. Kamruzzaman, Xavier N. Fernando
2018 Misc conf
ACSSC
Nima Nikvand, Zhou Wang, Wisam Farjow, Xavier N. Fernando
2018 J jnl
IEEE Trans. Intell. Transp. Syst.
Dan Song, Ratnasingham Tharmarasa, Thiagalingam Kirubarajan, Xavier N. Fernando
2018 J jnl
IEEE Trans. Veh. Technol.
Salam Al-Juboori, Xavier N. Fernando
2018 J jnl
EURASIP J. Wirel. Commun. Netw.
Hasan Farahneh, Fatima Hussain, Xavier N. Fernando
2018 conf
ICC
Noha Hassan, Xavier N. Fernando
2018 conf
CCECE
Ekaterina Korolkova, Danil Kudinov, Konstantin Artemev, Wisam Farjow, Xavier N. Fernando
2017 conf
IHTC
Hasan Farahneh, Fatima Hussain, Xavier N. Fernando
2017 conf
VTC Fall
Arif Obaid, Fatima Hussain, Xavier N. Fernando
2017 J jnl
Peer-to-Peer Netw. Appl.
Ajmery Sultana, Xavier N. Fernando, Lian Zhao
2017 conf
IHTC
Maryam Rastgar-Jazi, Xavier N. Fernando
2017 J jnl
IEEE Trans. Veh. Technol.
Ajmery Sultana, Lian Zhao, Xavier N. Fernando
2017 conf
IHTC
Sikder M. Kamruzzaman, Xavier N. Fernando, Muhammad Jaseemuddin
2017 conf
VTC Fall
Mohammad Aazam, Xavier N. Fernando
2017 B conf
PIMRC
Christopher Mekhiel, Xavier N. Fernando
2017 conf
IHTC
Dewan Ishtiaque Ahmed, Xavier N. Fernando
2017 conf
IHTC
Sattar Hussain, Predrag Pesikan, Xavier N. Fernando
2017 conf
VTC Spring
Fatima Hussain, Hasan Farahneh, Xavier N. Fernando, Alexander Ferworn
2017 B conf
LCN
Sikder M. Kamruzzaman, Muhammad Jaseemuddin, Xavier N. Fernando, Peyman Moeini
2017 conf
IHTC
Abdul Salam Mahmood, Essa Jafer, Sattar Hussain, Xavier N. Fernando
2017 conf
IHTC
Arif Obaid, Xavier N. Fernando
2016 J jnl
IEEE Embed. Syst. Lett.
Hooman Samani, Xavier N. Fernando
2016 B conf
GLOBECOM
Salam Al-Juboori, Xavier N. Fernando
2016 J jnl
Int. J. Commun. Networks Inf. Secur.
S. M. Kamruzzaman, Xavier N. Fernando, Mohammad Jaseemuddin
2016 conf
CAMAD
Christopher Mekhiel, Xavier N. Fernando
2016 conf
CAMAD
Noha Hassan, Kaamran Raahemifar, Xavier N. Fernando
2016 conf
VTC Fall
F. Levstek, Muhammad Jaseemuddin, Xavier N. Fernando
2016 conf
VTC Fall
Ajmery Sultana, Lian Zhao, Xavier N. Fernando
2016 conf
CCECE
Hasan Farahneh, Christopher Mekhiel, Alá F. Khalifeh, Wisam Farjow, Xavier N. Fernando
2016 conf
GlobalSIP
Peter He, Lian Zhao, Xavier N. Fernando
2015 conf
ICC
Asif Akbar, Muhammad Jaseemuddin, Xavier N. Fernando, Wisam Farjow
2015 conf
CCECE
Hasan Farahneh, Xavier N. Fernando
2015 conf
CCECE
Hesam Akbari, Xavier N. Fernando
2015 conf
CCECE
Noha Hassan, Khalid Elkhazeen, Kaarman Raahemiafar, Xavier N. Fernando
2015 C conf
WOWMOM
Salam Al-Juboori, Xavier N. Fernando
2014 J jnl
Wirel. Pers. Commun.
Amir Sepasi Zahmati, Xavier N. Fernando, Ali Grami
2014 J jnl
IEEE Trans. Veh. Technol.
Sattar Hussain, Xavier N. Fernando
2014 J jnl
IET Wirel. Sens. Syst.
Amir Sepasi Zahmati, Xavier N. Fernando, Ali Grami
2014 conf
CCECE
Hasan Farahneh, Xavier N. Fernando
2014 J jnl
IEEE Trans. Commun.
Sattar Hussain, Xavier N. Fernando
2014 conf
CCECE
Sagar Chandra Kar, Sattar Hussain, Xavier N. Fernando
2013 conf
OnlineGreenComm
Sajjadul Latif, Xavier N. Fernando, Alan Fung, Farrokh Janabi-Sharifi
2013 J jnl
IET Wirel. Sens. Syst.
Amir Sepasi Zahmati, Xavier N. Fernando, Ali Grami
2013 J jnl
Wirel. Pers. Commun.
Sattar Hussain, Xavier N. Fernando
2012 J jnl
Int. J. Commun. Networks Distributed Syst.
Amir Sepasi Zahmati, Xavier N. Fernando, Ali Grami
2012 J jnl
IET Commun.
Sattar Hussain, Xavier N. Fernando
2012 conf
SECURIT
Xavier N. Fernando, Kuganeswaran Thambu
2012 J jnl
IEEE Commun. Mag.
B. S. Chowdhry, Xavier N. Fernando, Pradeep Balachandran, Rong Sun, Bin Song, Rashid Mehmood, Alexey V. Vinel, Marion Berbineau
2012 J jnl
Int. J. Commun. Networks Distributed Syst.
Sathish Viswanathan, Srikanth Subramanian, Xavier N. Fernando
2012 J jnl
Int. J. Commun. Networks Distributed Syst.
Sattar Hussain, Xavier N. Fernando
2012 J jnl
IEEE Commun. Mag.
S. Srikanth, P. A. Murugesa Pandian, Xavier N. Fernando
2011 conf
CCECE
Mohamed Daoud, Wissam Farjow, Xavier N. Fernando
2011 conf
CCECE
Abdellah Chehri, Wissam Farjow, Hussein T. Mouftah, Xavier N. Fernando
2011 B conf
WCNC
Wissam Farjow, Abdellah Chehri, Hussein T. Mouftah, Xavier N. Fernando
2010 conf
Visual Information Processing and Communication
Kuganeswaran Thambu, Xavier N. Fernando, Ling Guan
2010 J jnl
IEEE Trans. Commun.
Stephen Z. Pinter, Xavier N. Fernando
2010 J jnl
Comput. Electr. Eng.
Lloyd Emmanuel, Xavier N. Fernando
2007 conf
AccessNets
Baskaran Dhivagar, Ganesh Madhan Muthu, Xavier N. Fernando
2007 J jnl
IET Commun.
Stephen Z. Pinter, Xavier N. Fernando
2007 J jnl
EURASIP J. Wirel. Commun. Netw.
Stephen Z. Pinter, Xavier N. Fernando
2007 conf
AccessNets
Bharath Umasankar, Xavier N. Fernando
2006 B conf
PIMRC
Roland Yuen, Xavier N. Fernando
2006 conf
AccessNets
Xavier N. Fernando
2005 J jnl
IEEE Trans. Veh. Technol.
Xavier N. Fernando, Abu B. Sesay
2005 J jnl
EURASIP J. Wirel. Commun. Netw.
Xavier N. Fernando, Balakanthan Balendran
2005 J jnl
Wirel. Pers. Commun.
Roland Yuen, Xavier N. Fernando
2004 conf
ICC
Xavier N. Fernando, Alagan Anpalagan
2002 J jnl
IEEE Trans. Veh. Technol.
Xavier N. Fernando, Abraham O. Fapojuwo
2002 J jnl
IEEE Trans. Veh. Technol.
Xavier N. Fernando, Abu B. Sesay
2000 conf
ICC (1)
Xavier N. Fernando, Abu B. Sesay
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"