Victor W. Chu

43 papers A* 1A 4B 1C 1Journal 14Unranked 22
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Shoujin Wang, Mingze Ni, Wei Liu, Victor W. Chu, Bryan Zheng, Ayush Kanwal, Roy Jing Yang, Kenneth Sabir, Fang Chen
2025 conf
PAKDD (Workshops)
Boyuan Zheng, Zhitan Wu, Victor W. Chu
2025 J jnl
CoRR
Boyuan Zheng, Victor W. Chu
2025 J jnl
CoRR
Boyuan Zheng, Victor W. Chu, Zhidong Li, Evan Webster, Ashley Rootsey
2025 A* conf
SIGIR
Zhuo Cai, Shoujin Wang, Victor W. Chu, Usman Naseem, Yang Wang, Fang Chen
2024 J jnl
Int. J. Data Sci. Anal.
Eunkyung Park, Raymond K. Wong, Junbum Kwon, Victor W. Chu
2023 A conf
ECAI
Eunkyung Park, Raymond K. Wong, Victor W. Chu
2022 J jnl
ACM Trans. Knowl. Discov. Data
Hangbin Zhang, Raymond K. Wong, Victor W. Chu
2021 conf
WISE (1)
Eunkyung Park, Raymond K. Wong, Junbum Kwon, Victor W. Chu
2021 B conf
IJCNN
Hangbin Zhang, Raymond K. Wong, Victor W. Chu
2021 J jnl
J. Supercomput.
Jinyan Li, Yaoyang Wu, Simon Fong, Raymond K. Wong, Victor W. Chu, Kok-Leong Ong, Kelvin Kian Loong Wong
2021 conf
PAKDD (1)
Eunkyung Park, Raymond K. Wong, Junbum Kwon, Victor W. Chu
2021 J jnl
Int. J. Data Sci. Anal.
Simon Luo, Victor W. Chu, Zhidong Li, Yang Wang, Jianlong Zhou, Fang Chen, Raymond K. Wong
2020 conf
ICDM (Workshops)
Hangbin Zhang, Raymond K. Wong, Victor W. Chu
2019 conf
PRICAI (1)
Eunkyung Park, Raymond K. Wong, Victor W. Chu
2019 J jnl
Data Knowl. Eng.
Victor W. Chu, Raymond K. Wong, Fang Chen, Ivan Ho, Joe Lee
2019 conf
SCC
Bowen Zhou, Raymond K. Wong, Victor W. Chu, Tengyue Li, Simon Fong, Chi-Hung Chi
2019 conf
PAKDD (1)
Simon Luo, Victor W. Chu, Zhidong Li, Yang Wang, Jianlong Zhou, Fang Chen, Raymond K. Wong
2019 conf
PRICAI (2)
Hangbin Zhang, Raymond K. Wong, Victor W. Chu
2018 J jnl
Inf. Fusion
Jinyan Li, Simon Fong, Raymond K. Wong, Victor W. Chu
2018 conf
SCC
Victor W. Chu, Raymond K. Wong, Chi-Hung Chi, Fang Chen
2017 conf
BigData Congress
Simon Luo, Victor W. Chu, Jianlong Zhou, Fang Chen, Raymond K. Wong, Weidong Huang
2017 J jnl
IEEE Trans. Serv. Comput.
Victor W. Chu, Raymond K. Wong, Simon Fong, Chi-Hung Chi
2017 conf
SCC
Victor W. Chu, Raymond K. Wong, Fang Chen, Chi-Hung Chi
2017 conf
SCDS
Jinyan Li, Simon Fong, Shimin Hu, Victor W. Chu, Raymond K. Wong, Sabah Mohammed, Nilanjan Dey
2017 J jnl
Inf. Syst. Frontiers
Victor W. Chu, Raymond K. Wong, Chi-Hung Chi, Wei Zhou, Ivan Ho
2016 conf
BigComp
Victor W. Chu, Fang Chen, Raymond K. Wong, Ivan Ho, Joe Lee
2016 C conf
ADMA
Victor W. Chu, Raymond K. Wong, Fang Chen, Chi-Hung Chi
2016 conf
ACSW
Victor W. Chu, Raymond K. Wong, Fang Chen, Ivan Ho, Joe Lee
2016 J jnl
J. Comput. Syst. Sci.
Victor W. Chu, Raymond K. Wong, Fang Chen, Simon Fong, Patrick C. K. Hung
2016 conf
SCC
Victor W. Chu, Raymond K. Wong, Fang Chen, Chi-Hung Chi
2015 conf
BigData Congress
Victor W. Chu, Raymond K. Wong, Fang Chen, Chi-Hung Chi
2014 conf
DASFAA (1)
Victor W. Chu, Raymond K. Wong, Wei Liu, Fang Chen
2014 A conf
CIKM
Victor W. Chu, Raymond K. Wong, Fang Chen, Chi-Hung Chi
2014 J jnl
Pers. Ubiquitous Comput.
Raymond K. Wong, Victor W. Chu, Tianyong Hao
2014 conf
IEEE SCC
Victor W. Chu, Raymond K. Wong, Wei Liu, Fang Chen, Chang-Shing Perng
2014 A conf
ICWS
Victor W. Chu, Raymond K. Wong, Chi-Hung Chi, Patrick C. K. Hung
2013 conf
BigData Congress
Badari N. Thyamagondlu, Victor W. Chu, Raymond K. Wong
2013 conf
IEEE SCC
Zhiwei Yu, Victor W. Chu, Raymond K. Wong
2013 A conf
ICWS
Victor W. Chu, Raymond K. Wong, Chi-Hung Chi
2013 conf
IEEE SCC
Victor W. Chu, Raymond K. Wong, Wuhui Chen, Incheon Paik, Chi-Hung Chi
2012 conf
ICCVE
Raymond K. Wong, Victor W. Chu, Tianyong Hao, Jian Wang
2012 J jnl
Int. J. Web Serv. Res.
Victor W. Chu, Raymond K. Wong, Chi-Hung Chi
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"