Kai-Hsiang Chuang

32 papers B 1Journal 27Unranked 4
YearRankTypeTitle / Venue / Authors
2021 J jnl
Int. J. Prod. Res.
Ming-Chuan Chiu, Kai-Hsiang Chuang
2019 J jnl
NeuroImage
Kai-Hsiang Chuang, Hsu-Lei Lee, Zengmin Li, Wei-Tang Chang, Fatima A. Nasrallah, Ling Yun Yeow, Kavita Kaur D/O Ranjit Singh
2019 J jnl
NeuroImage
Hsu-Lei Lee, Zengmin Li, Elizabeth J. Coulson, Kai-Hsiang Chuang
2018 conf
EMBC
Mengjiao Hu, Fang Ji, Zhongkang Lu, Weimin Huang, Reza Khosrowabadi, Ling Zhao, Kai Keng Ang, Kok Soon Phua, Fatima Ali Nasrallah, Kai-Hsiang Chuang, Mary C. Stephenson, John J. Totman, Xudong Jiang, Effie Chew, Cuntai Guan, Juan Helen Zhou
2017 J jnl
NeuroImage
Kai-Hsiang Chuang, Fatima A. Nasrallah
2017 J jnl
NeuroImage
Fatima A. Nasrallah, Kavita Kaur D/O Ranjit Singh, Ling Yun Yeow, Kai-Hsiang Chuang
2017 J jnl
NeuroImage
Anna Ulyanova, Xuan Vinh To, A. B. M. A. Asad, Weiping Han, Kai-Hsiang Chuang
2016 J jnl
NeuroImage
Fatima A. Nasrallah, Xuan Vinh To, Der-Yow Chen, Aryeh Routtenberg, Kai-Hsiang Chuang
2016 J jnl
NeuroImage
Binbin Zhang, Kai-Hsiang Chuang, Ci'en Tjio, Way Cherng Chen, Fwu-Shan Sheu, Aryeh Routtenberg
2016 J jnl
NeuroImage
Monika Sobczak-Edmans, T. H. B. Ng, Y. C. Chan, E. Chew, Kai-Hsiang Chuang, Shen-Hsing Annabel Chen
2015 conf
EMBC
Zhongkang Lu, Kok Soon Phua, Weimin Huang, Xin Hong, Fatima Ali Nasrallah, Kai-Hsiang Chuang, Cuntai Guan
2015 J jnl
NeuroImage
Fatima A. Nasrallah, Ling Yun Yeow, Bharat B. Biswal, Kai-Hsiang Chuang
2015 conf
CE
Li-Wei Ko, Kai-Hsiang Chuang, Ming-Chuan Chiu
2014 J jnl
NeuroImage
Fatima A. Nasrallah, Hui-Chien Tay, Kai-Hsiang Chuang
2014 J jnl
NeuroImage
Fatima A. Nasrallah, Si Kang Lew, Amanda Si-Min Low, Kai-Hsiang Chuang
2014 J jnl
NeuroImage
Fatima A. Nasrallah, Si-Min Amanda Low, Si Kang Lew, Kaina Chen, Kai-Hsiang Chuang
2013 J jnl
IEEE Trans. Biomed. Eng.
Feiniu Yuan, Kai-Hsiang Chuang, Jimin Liu
2012 J jnl
NeuroImage
Fatima A. Nasrallah, Jolena Tan, Kai-Hsiang Chuang
2012 J jnl
NeuroImage
Christoph Leuze, Yuichi Kimura, Jeff Kershaw, Sayaka Shibata, Tsuneo Saga, Kai-Hsiang Chuang, Ichiro Shimoyama, Ichio Aoki
2011 conf
EMBC
S. Hartono, C. H. Thng, Q. S. Ng, C. X. Yong, C.-T. Yang, Wen Shi, Kai-Hsiang Chuang, T. S. Koh
2011 J jnl
NeuroImage
Jun-Cheng Weng, Kai-Hsiang Chuang, Artem G. Goloshevsky, Stephen J. Dodd, Kathryn Sharer
2011 J jnl
IEEE Trans. Image Process.
Nigel Chou, Jiarong Wu, Jordan Bai Bingren, Anqi Qiu, Kai-Hsiang Chuang
2011 J jnl
Expert Syst. Appl.
Min-Yuan Cheng, Hsing-Chih Tsai, Kai-Hsiang Chuang
2010 J jnl
NeuroImage
Kai-Hsiang Chuang, Leonardo Belluscio, Alan P. Koretsky
2009 J jnl
NeuroImage
Jason Tucciarone, Kai-Hsiang Chuang, Steven J. Dodd, Afonso C. Silva, Galit Pelled, Alan P. Koretsky
2009 J jnl
NeuroImage
Kai-Hsiang Chuang, Jung Hee Lee, Afonso C. Silva, Leonardo Belluscio, Alan P. Koretsky
2008 J jnl
NeuroImage
Kai-Hsiang Chuang, Peter van Gelderen, Hellmut Merkle, Jerzy Bodurka, Vasiliki N. Ikonomidou, Alan P. Koretsky, Jeff H. Duyn, S. Lalith Talagala
2007 J jnl
NeuroImage
Galit Pelled, Kai-Hsiang Chuang, Stephen J. Dodd, Alan P. Koretsky
2004 B conf
ECRTS
Jian-Jia Chen, Heng-Ruey Hsu, Kai-Hsiang Chuang, Chia-Lin Yang, Ai-Chun Pang, Tei-Wei Kuo
2002 J jnl
NeuroImage
Ming-Ting Wu, Jer-Ming Sheen, Kai-Hsiang Chuang, Pinchen Yang, Shieuh-Lii Chin, Chin-Ying Tsai, Chung-Jen Chen, Jan-Ray Liao, Ping-Hong Lai, Kuo-An Chu, Huay-Ben Pan, Chien-Fang Yang
2001 J jnl
J. Digit. Imaging
Ming-Jang Chiu, Chung-Chih Lin, Kai-Hsiang Chuang, Jyh-Horng Chen, Kou-Mou Huang
1999 J jnl
IEEE Trans. Medical Imaging
Kai-Hsiang Chuang, Ming-Jang Chiu, Chung-Chih Lin, Kou-Mou Huang, Pei-Jen Chiang, Jyh-Horng Chen
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"