Hairong Yu

41 papers B 3C 1Journal 23Unranked 13
YearRankTypeTitle / Venue / Authors
2025 J jnl
Entropy
Yunrui Zhang, Yue Leng, Xiaozhi Li, Wenjing Zhang, Hairong Yu
2024 conf
SII
Tao Han, Feng Wang, Hairong Yu
2024 J jnl
IEEE Trans. Instrum. Meas.
Hairong Yu, Ying Guo, Lin Ye, Tao Han, Steven Weidong Su
2024 J jnl
BMC Medical Imaging
Xiu-li Nie, Chen Hua, Gao Peng, Hairong Yu, Meili Sun, Yan Peng
2023 J jnl
Biomed. Signal Process. Control.
Na Tian, Hairong Yu, Shaofeng Zhao, Guanzheng Liu, Rong Song
2022 J jnl
IEEE Trans. Instrum. Meas.
Hairong Yu, Ying Guo, Lin Ye, Steven Weidong Su
2021 J jnl
IEEE Trans. Instrum. Meas.
Hairong Yu, Lin Ye, Ying Guo, Steven W. Su
2021
Hairong Yu
2021 J jnl
Comput. Biol. Medicine
Hairong Yu, Weiling Xu, Yu Zhuang, Kai-Yu Tong, Rong Song
2020 J jnl
IEEE Access
Hairong Yu, Yi Zhang, Lin Ye, Hamzah Alqudah, Kairui Guo, Ahmadreza Argha, Branko G. Celler, Rong Song, Steven W. Su
2019 conf
EMBC
Kairui Guo, Hairong Yu, Rifai Chai, Hung T. Nguyen, Steven W. Su
2019 J jnl
Neurocomputing
Shixun Wang, Zhi Dou, Deng Chen, Hairong Yu, Yuan Li, Peng Pan
2019 conf
EMBC
Yao Huang, Rong Song, Wenhui Chen, Hairong Yu, Ahmadreza Argha, Branko G. Celler, Steven W. Su
2018 J jnl
IEEE Access
Lianyong Qi, Wanchun Dou, Wenping Wang, Guangshun Li, Hairong Yu, Shaohua Wan
2018 J jnl
Medical Biol. Eng. Comput.
Hairong Yu, Lin Ye, Ganesh R. Naik, Rong Song, Hung T. Nguyen, Steven W. Su
2017 conf
ISSCC
Jun Cao, Delong Cui, Ali Nazemi, Tim He, Guansheng Li, Burak Çatli, Mehdi Khanpour, Kangmin Hu, Tamer A. Ali, Heng Zhang, Hairong Yu, Ben Rhew, Shiwei Sheng, Yonghyun Shim, Bo Zhang, Afshin Momtaz
2017 conf
ISICA (2)
Caicai Zhang, Zongmin Cui, Hairong Yu
2017 conf
EMBC
Kairui Guo, Henry Candra, Hairong Yu, Huiqi Li, Hung T. Nguyen, Steven W. Su
2017 conf
EMBC
Hairong Yu, Kairui Guo, Jie Luo, Kai Cao, Hung T. Nguyen, Steven W. Su
2016 J jnl
Comput. J.
Hairong Yu, Guohui Li, Jianjun Li, LihChyun Shu
2016 J jnl
J. Supercomput.
Hairong Yu, Guohui Li, LihChyun Shu
2015 J jnl
Int. J. Medical Informatics
Jane Taggart, Siaw-Teng Liaw, Hairong Yu
2014 J jnl
Int. J. E Health Medical Commun.
Alireza Rahimi, Nandan Parameswaran, Pradeep Kumar Ray, Jane Taggart, Hairong Yu, Siaw-Teng Liaw
2014 conf
MIE
Siaw-Teng Liaw, Jane Taggart, Hairong Yu
2014 J jnl
J. Biomed. Informatics
Siaw-Teng Liaw, Jane Taggart, Hairong Yu, Simon de Lusignan, Craig E. Kuziemsky, Andrew Hayen
2014 J jnl
Decis. Anal.
Alireza Rahimi, Siaw-Teng Liaw, Pradeep Ray, Jane Taggart, Hairong Yu
2014 J jnl
Int. J. Medical Informatics
Alireza Rahimi, Siaw-Teng Liaw, Jane Taggart, Pradeep Ray, Hairong Yu
2013 conf
ISWC (Posters & Demos)
Hairong Yu, Siaw-Teng Liaw, Jane Taggart, Alireza Rahimi Khorzoughi
2010 C conf
KEOD
John Barton, Hairong Yu
2009 J jnl
J. Assoc. Inf. Sci. Technol.
Howard D. White, Sebastian K. Boell, Hairong Yu, Mari Davis, Concepción S. Wilson, Fletcher T. H. Cole
2008 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Hairong Yu, Mau-Chung Frank Chang
2008 J jnl
J. Informetrics
Hairong Yu, Mari Davis, Concepción S. Wilson, Fletcher T. H. Cole
2007 J jnl
Inf. Syst. E Bus. Manag.
Fethi A. Rabhi, Hairong Yu, Feras T. Dabous, Sunny Y. Wu
2007 J jnl
Inf. Res.
Hairong Yu, Mari Davis
2005 conf
ICEIS (1)
Feras T. Dabous, Fethi A. Rabhi, Hairong Yu, Tariq Al-Naeem
2004 conf
EEE
Fethi A. Rabhi, Feras T. Dabous, Hairong Yu, Boualem Benatallah, Yun Ki Lee
2004 conf
ICEIS (1)
Hairong Yu, Fethi A. Rabhi, Feras T. Dabous
2004 conf
Australian Software Engineering Conference
Feras T. Dabous, Fethi A. Rabhi, Hairong Yu
2003 B conf
WISE
Feras T. Dabous, Fethi A. Rabhi, Hairong Yu
1998 B conf
SMC
Hairong Yu, Arthur Ramer
1997 B conf
IDA
Hairong Yu, Arthur Ramer
redb/extractors/elf_extractors/elf_relocations.py
← Index redb/extractors/elf_extractors/elf_relocations.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 ELFRelocation


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

    def _get_relocation_type_string(self, reloc_type: int, machine_arch: str) -> str:
        """Convert relocation type number to human-readable string based on architecture."""
        # This is a simplified mapping - real implementation would need comprehensive
        # architecture-specific relocation type mappings

        common_types = {
            0: "R_NONE",
            1: "R_DIRECT",
            2: "R_PC_RELATIVE",
            3: "R_GOT",
            4: "R_PLT",
            5: "R_COPY",
            6: "R_GLOB_DAT",
            7: "R_JMP_SLOT",
            8: "R_RELATIVE"
        }

        # Architecture-specific mappings could be added here
        if machine_arch == "x86_64":
            x86_64_types = {
                1: "R_X86_64_64",
                2: "R_X86_64_PC32",
                3: "R_X86_64_GOT32",
                4: "R_X86_64_PLT32",
                5: "R_X86_64_COPY",
                6: "R_X86_64_GLOB_DAT",
                7: "R_X86_64_JUMP_SLOT",
                8: "R_X86_64_RELATIVE"
            }
            return x86_64_types.get(reloc_type, f"R_X86_64_{reloc_type}")
        elif machine_arch == "x86":
            i386_types = {
                1: "R_386_32",
                2: "R_386_PC32",
                3: "R_386_GOT32",
                4: "R_386_PLT32",
                5: "R_386_COPY",
                6: "R_386_GLOB_DAT",
                7: "R_386_JMP_SLOT",
                8: "R_386_RELATIVE"
            }
            return i386_types.get(reloc_type, f"R_386_{reloc_type}")

        return common_types.get(reloc_type, f"R_UNKNOWN_{reloc_type}")

    def _extract_relocation_data(self, relocation, section_name: str, machine_arch: str) -> Dict:
        """Extract data from a single relocation entry."""
        try:
            # Get relocation offset
            relocation_offset = relocation.entry.get('r_offset', 0)

            # Get relocation type
            relocation_type = relocation.entry.get('r_info_type', 0)

            # Get symbol index
            relocation_symbol_index = relocation.entry.get('r_info_sym', 0)

            # Get addend (only present in RELA sections)
            relocation_addend = None
            if hasattr(relocation.entry, 'r_addend'):
                relocation_addend = relocation.entry.get('r_addend', 0)

            # Get symbol name if available
            relocation_symbol_name = ""
            if hasattr(relocation, 'symbol') and relocation.symbol:
                relocation_symbol_name = relocation.symbol.name or f"<symbol_{relocation_symbol_index}>"
            else:
                relocation_symbol_name = f"<symbol_{relocation_symbol_index}>"

            # Get type string mapping
            relocation_type_str = self._get_relocation_type_string(relocation_type, machine_arch)

            return ELFRelocation(
                relocation_offset=relocation_offset,
                relocation_type=relocation_type,
                relocation_type_str=relocation_type_str,
                relocation_symbol_index=relocation_symbol_index,
                relocation_symbol_name=relocation_symbol_name,
                relocation_section=section_name,
                relocation_addend=relocation_addend
            )

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

    def _extract_relocations_from_section(self, section, machine_arch: str) -> List[Dict]:
        """Extract all relocations from a relocation section."""
        relocations = []

        try:
            if not hasattr(section, 'iter_relocations'):
                return relocations

            section_name = section.name or f"<unnamed_section>"

            for relocation in section.iter_relocations():
                reloc_data = self._extract_relocation_data(relocation, section_name, machine_arch)
                if reloc_data:
                    relocations.append(reloc_data)

        except Exception as e:
            self.log.error(f"Error extracting relocations from section {section.name}: {e}")

        return relocations

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

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

            def extract_data(elf):
                # Get architecture for relocation type mapping
                machine_arch = self._get_architecture()
                all_relocations = []

                # Iterate through all sections looking for relocation sections with per-section error handling
                for section_index, section in enumerate(elf.iter_sections()):
                    try:
                        # Check if this is a relocation section (.rel or .rela)
                        if (section.name and
                            (section.name.startswith('.rel') or section.name.startswith('.rela')) and
                            hasattr(section, 'iter_relocations')):

                            section_relocations = self._extract_relocations_from_section(section, machine_arch)
                            all_relocations.extend(section_relocations)
                            self.log.debug(f"Extracted {len(section_relocations)} relocations from section {section.name}")
                    except Exception as e:
                        section_name = getattr(section, 'name', f'section_{section_index}')
                        self.log.warning(f"Error processing relocation section {section_name}: {e}")
                        # Continue processing other sections

                return all_relocations

            if not self._is_elf_file():
                return None

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

            self.elf_relocations = result
            return self.elf_relocations

        except Exception as e:
            self.log.error(f"Error extracting ELF relocations {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_relocations
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no relocations (e.g., statically linked binary)
                # None is reserved for actual errors

                # Prepare data arrays for all relocations
                data = []
                current_time = datetime.now(timezone.utc)
                for reloc in self.elf_relocations:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        reloc.relocation_offset,
                        reloc.relocation_type,
                        reloc.relocation_type_str,
                        reloc.relocation_symbol_index,
                        reloc.relocation_symbol_name,
                        reloc.relocation_addend,
                        reloc.relocation_section,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'relocation_offset', 'relocation_type', 'relocation_type_str',
                    'relocation_symbol_index', 'relocation_symbol_name',
                    'relocation_addend', 'relocation_section',
                    'analysis_date'
                ]

                if not data:
                    return None

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'UInt64', 'UInt32', 'LowCardinality(String)',
                    'UInt32', 'LowCardinality(String)',
                    'Nullable(Int64)', 'LowCardinality(String)',
                    'DateTime64(3, \'UTC\')'
                ]

                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_relocations"