Haijun Yang

50 papers A* 3A 1B 3C 3Journal 33Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
Pattern Recognit.
Zhenyuan Huang, Wenzhong Tang, Hui Zhang, Haijun Yang
2026 J jnl
Eur. J. Oper. Res.
Yuhan Li, Xiaoshan Su, Jiandong Wang, Haijun Yang
2026 A* conf
AAAI
Zhenyuan Huang, Hui Zhang, Wenzhong Tang, Haijun Yang
2026 J jnl
Inf. Fusion
Yanli Meng, Francisco Chiclana, Ping Gong, Sha Wang, Li Wang, Haijun Yang
2026 J jnl
Neurocomputing
Yinchi Ge, Hui Zhang, Haohang Sun, Haijun Yang
2025 J jnl
Ann. Oper. Res.
Yanli Meng, Li Wang, Francisco Chiclana, Haijun Yang, Sha Wang
2025 J jnl
Electron. Commer. Res. Appl.
Ankai Li, Li Wang, Haijun Yang, Harris Wu
2025 J jnl
CoRR
Zhenyuan Huang, Hui Zhang, Wenzhong Tang, Haijun Yang
2025 A* conf
ICDE
Weicheng Wang, Victor Junqiu Wei, Min Xie, Di Jiang, Lixin Fan, Haijun Yang
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zilong Ye, Jianping Huang, Haijun Yang, Wensheng Duan, Ganglin Lei, Subin Zhuang
2024 J jnl
J. Comput. Sci. Technol.
Yuanfeng Song, Yuanqin He, Xuefang Zhao, Hanlin Gu, Di Jiang, Haijun Yang, Lixin Fan
2024 J jnl
Knowl. Based Syst.
Zhenyuan Huang, Hui Zhang, Chengqian Hao, Haijun Yang, Harris Wu
2024 J jnl
Int. J. Digit. Earth
Chengbin Wu, Yaohuan Huang, Haijun Yang, Ling Yao, Yesen Liu, Zhuo Chen
2024 J jnl
CoRR
Qing Shuai, Zhiyuan Yu, Zhize Zhou, Lixin Fan, Haijun Yang, Can Yang, Xiaowei Zhou
2023 J jnl
CoRR
Yuanfeng Song, Yuanqin He, Xuefang Zhao, Hanlin Gu, Di Jiang, Haijun Yang, Lixin Fan, Qiang Yang
2023 J jnl
ACM Trans. Graph.
Qing Shuai, Zhiyuan Yu, Zhize Zhou, Lixin Fan, Haijun Yang, Can Yang, Xiaowei Zhou
2023 conf
BDEIM
Jiaquan Liu, Haijun Yang
2023 J jnl
Decis. Support Syst.
Chao Li, Li Wang, Haijun Yang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yaohuan Huang, Chengbin Wu, Haijun Yang, Haitao Zhu, Mingxing Chen, Jie Yang
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Wentao An, Mingsen Lin, Haijun Yang
2022 J jnl
J. Sensors
Lina Cao, Hongyong Xiang, Jingwen Xu, Yufu Gao, Chenlu Lin, Kun Li, Zhiwei Li, Nana Guo, P. David, Chunguang He, Haijun Yang
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Wentao An, Mingsen Lin, Haijun Yang
2021 J jnl
IEEE Access
Yaohu Lin, Shancun Liu, Haijun Yang, Harris Wu
2020 J jnl
Inf. Syst. Frontiers
Qinghua Zheng, Chutong Yang, Haijun Yang, Jianhe Zhou
2020 J jnl
J. Syst. Sci. Complex.
Zhaoyuan Wang, Shancun Liu, Haijun Yang, Harris Wu
2020 J jnl
Int. J. Wavelets Multiresolution Inf. Process.
Liang Tang, Zhongming Zhao, Ping Tang, Haijun Yang
2020 J jnl
J. Sensors
Hongyong Xiang, Qinghua Cai, Yuan Li, Zhenxing Zhang, Lina Cao, Kun Li, Haijun Yang
2019 J jnl
IEEE Access
Xiaoyu Guo, Hui Zhang, Haijun Yang, Lianyuan Xu, Zhiwen Ye
2019 conf
MultiTemp
Liang Tang, Haijun Yang, Xingang Xie, Junqin Liu
2018 A* conf
EMNLP
Jing Chen, Qingcai Chen, Xin Liu, Haijun Yang, Daohe Lu, Buzhou Tang
2017 conf
NLPCC
Zhihui Zheng, Daohe Lu, Qingcai Chen, Haijun Yang, Yang Xiang, Youcheng Pan, Wei Zhong
2017 J jnl
Remote. Sens.
Yaohuan Huang, Chuanpeng Zhao, Haijun Yang, Xiaoyang Song, Jie Chen, Zhonghua Li
2015 J jnl
Genom. Proteom. Bioinform.
Qiyan Wang, Jian Bai, Amir Abliz, Ying Liu, Kenan Gong, Jingjing Li, Wenjie Shi, Yaqi Pan, Fangfang Liu, Shujuan Lai, Haijun Yang, Changdong Lu, Lixin Zhang, Wei Chen, Ruiping Xu, Hong Cai, Yang Ke, Changqing Zeng
2015 J jnl
Int. J. Inf. Technol. Decis. Mak.
Haijun Yang, Qinghua Zheng, Minqiang Li, Yuzhong Sun
2015 J jnl
IEEE Geosci. Remote. Sens. Lett.
Dengkui Mo, Hans Fuchs, Lutz Fehrmann, Haijun Yang, Yuanchang Lu, Christoph Kleinn
2015 J jnl
Entropy
Haijun Yang, Lin Li, Deshen Wang
2014 J jnl
Int. J. Found. Comput. Sci.
Haijun Yang, Minqiang Li, Qinghua Zheng
2012 conf
CCIS
Qinyun Dai, Haijun Yang, Qinfeng Yao, Yaliang Chen
2010 J jnl
JOCN
Haijun Yang, Zhong Pan, Venkatesh Akella, Chen-Nee Chuah, S. J. Ben Yoo
2010 conf
Geoinformatics
Xu Yu, Ning Chen, Jianbang He, Yanrong Cao, Liguang Ma, Haijun Yang
2009 conf
CSIE (2)
Haijun Yang, Cui Wang
2007 C conf
ISPA
Haijun Yang, Minqiang Li, Qinghua Zheng
2006 A conf
HPDC
Qinghua Zheng, Haijun Yang, Yuzhong Sun
2005 C conf
IGARSS
Quanqin Shao, Haijun Yang, Zhuoqi Chen
2005 B conf
e-Science
Haijun Yang, Zhiwei Xu, Yuzhong Sun, Qinghua Zheng
2005 C conf
ISPA
Haijun Yang, Zhiwei Xu, Yuzhong Sun, Zheng Shen, Changshu Liu
2005 conf
ICC
Haijun Yang, Venkatesh Akella, Chen-Nee Chuah, S. J. Ben Yoo
2004 B conf
GLOBECOM
Haijun Yang, Junqiang Hu, Zhong Pan, Fei Xue, S. J. Ben Yoo
2003 B conf
SMC
Haijun Yang, Minqiang Li, Jisong Kou
2003 J jnl
Sci. China Ser. F Inf. Sci.
Haijun Yang, Minqiang Li
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"