Haigang Yang

49 papers A 4B 6C 7Journal 12Unranked 20
YearRankTypeTitle / Venue / Authors
2022 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Yong Zheng, Haigang Yang, Yi Shu, Yiping Jia, Zhihong Huang
2022 J jnl
IEEE Embed. Syst. Lett.
Yong Zheng, Haigang Yang, Yi Shu, Yiping Jia, Zhihong Huang
2021 C conf
ISCAS
Binghui Wang, Haigang Yang, Yiping Jia
2021 J jnl
Sensors
Fanyang Li, Tao Yin, Haigang Yang
2020 J jnl
J. Circuits Syst. Comput.
Tao Yin, Yueshan Lin, Haigang Yang, Huanming Wu
2019 conf
FPT
Yong Zheng, Haigang Yang, Zhihong Huang, Tianli Li, Yiping Jia
2019 J jnl
IEICE Electron. Express
Tao Yin, Fubin Xin, Fanyang Li, Fei Liu, Haigang Yang
2019 J jnl
Integr.
Xing Wei, Haigang Yang, Wei Li, Zhihong Huang, Tao Yin, Le Yu
2019 conf
SoCC
Xinkai Di, Haigang Yang, Zhihong Huang, Ning Mao
2019 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Tianwen Li, Hongjin Liu, Haigang Yang
2019 conf
FPT
Xinkai Di, Haigang Yang, Zhihong Huang, Ning Mao, Yiping Jia, Yong Zheng
2018 J jnl
J. Circuits Syst. Comput.
Tianyi Li, Xiaodong Xu, Tao Yin, Fubin Xin, Wei Li, Haigang Yang
2018 J jnl
J. Circuits Syst. Comput.
Tao Yin, Guocheng Huang, Xiaodong Xu, Yachao Zhang, Xinxia Cai, Haigang Yang
2018 A conf
FPGA
Ning Mao, Zhihong Huang, Xing Wei, He Zhao, Xinkai Di, Le Yu, Haigang Yang
2017 A conf
FPGA
Zhihong Huang, Xing Wei, Grace Zgheib, Wei Li, Yu Lin, Zhenghong Jiang, Kaihui Tu, Paolo Ienne, Haigang Yang
2016 J jnl
SIGARCH Comput. Archit. News
Colin Yu Lin, Zhenghong Jiang, Cheng Fu, Hayden Kwok-Hay So, Haigang Yang
2015 C conf
ISCAS
Guocheng Huang, Tao Yin, Qisong Wu, Yuanming Zhu, Haigang Yang
2015 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Wen-rui Zhu, Haigang Yang, Tongqiang Gao, Fei Liu, Tao Yin, Dandan Zhang, Hongfeng Zhang
2015 B conf
FPL
Zhenghong Jiang, Grace Zgheib, Colin Yu Lin, David Novo, Zhihong Huang, Liqun Yang, Haigang Yang, Paolo Ienne
2014 conf
CICC
Yuanming Zhu, Fei Liu, Yajuan Yang, Guocheng Huang, Tao Yin, Haigang Yang
2014 conf
ISIC
Tongqiang Gao, Xiaodong Xu, Hongfeng Zhang, Haigang Yang
2014 conf
BioCAS
Tao Yin, Fubin Xin, Tongqiang Gao, Guocheng Huang, Haigang Yang
2014 B conf
FPL
Liqun Yang, Haigang Yang, Wei Li, Zhihua Li, Zhihong Huang, Colin Yu Lin
2014 B conf
FPL
Rui Jia, Colin Yu Lin, Zhenhong Guo, Rui Chen, Fei Wang, Tongqiang Gao, Haigang Yang
2014 B conf
FPL
Zhenghong Jiang, Colin Yu Lin, Liqun Yang, Fei Wang, Haigang Yang
2014 A conf
FPGA
Grace Zgheib, Liqun Yang, Zhihong Huang, David Novo, Hadi Parandeh-Afshar, Haigang Yang, Paolo Ienne
2014 conf
FPT
JunYing Huang, Colin Yu Lin, Yang Liu, Zhihua Li, Haigang Yang
2013 B conf
FPL
Xiaoyan Cheng, Tao Yin, Qisong Wu, Yiping Jia, Haigang Yang
2013 conf
CICC
Dandan Zhang, Haigang Yang, Zhujia Chen, Wei Li, Zhihong Huang, Lijiang Gao, Wen-rui Zhu
2013 J jnl
Sensors
Huanming Wu, Haigang Yang, Tao Yin, Jiwei Jiao
2013 B conf
FPL
Fangqing Du, Colin Yu Lin, Xiuhai Cui, Jiabin Sun, Feng Liu, Fei Liu, Haigang Yang
2011 conf
ASICON
Tao Yin, Huanming Wu, Qisong Wu, Haigang Yang, Jiwei Jiao
2011 conf
NEMS
Tao Yin, Huanming Wu, Qisong Wu, Haigang Yang, Jiwei Jiao
2011 conf
ASICON
Xiaoyu Wang, Haigang Yang, Tao Yin, Fei Liu
2011 C conf
ISCAS
Wen-rui Zhu, Haigang Yang, Tongqiang Gao
2011 C conf
ISCAS
Fanyang Li, Haigang Yang, Yu Wang, Qisong Wu
2011 conf
ASICON
Huanming Wu, Haigang Yang, Xiaoyan Cheng, Tao Yin, Jiwei Jiao
2011 C conf
VLSI-SoC
Le Yu, Haigang Yang, Jia Zhang, Wei Wang
2011 C conf
VLSI-SoC
Jia Zhang, Le Yu, Haigang Yang, Y. L. Xie, F. B. Zhou, Wei Wang
2010 conf
APCCAS
Xin Cheng, Haigang Yang, Tongqiang Gao, Fei Liu
2010 conf
NEMS
Chong Zhang, Qisong Wu, Tao Yin, Haigang Yang
2010 A conf
ICCAD
Le Yu, Haigang Yang, Tom T. Jing, Min Xu, Robert E. Geer, Wei Wang
2010 conf
APCCAS
Hui Zhang, Haigang Yang, Fei Liu, Yuan-feng Wei, Jia Zhang
2009 conf
NanoNet
Ming Liu, Haigang Yang, Sansiri Tanachutiwat, Wei Wang
2009 conf
NANOARCH
Ming Liu, Haigang Yang, Sansiri Tanachutiwat, Wei Wang
2008 C conf
ISCAS
Quan Yuan, Haigang Yang, Fang-yuan Dong, Tao Yin
2006 conf
APCCAS
Tao Yin, Haigang Yang, Quan Yuan, Guoping Cui
2005 conf
IWSOC
Haigang Yang, Hongguang Sun, Jinghong Han, Jinbao Wei, Zengjin Lin, Shanhong Xia, Hua Zhong
2005 conf
Circuits, Signals, and Systems
Zengjin Lin, Haigang Yang, Lungui Zhong, Jiabin Sun, Shanhong Xia
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"