Kai Han

46 papers A* 6A 1Journal 32Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
PeerJ Comput. Sci.
Jie Liu, Kai Han, Lu Liu, Yun Zhang, Yunbin Yan, Hairui Dong
2026 J jnl
CoRR
Hongjun Wang, Wei Liu, Weibo Gu, Xing Sun, Kai Han
2026 J jnl
EAI Endorsed Trans. Scalable Inf. Syst.
Jiwu Liu, Kai Xue, Yachen Wang, Chunguang Ren, Xiaojian Zhang, Kai Han
2026 conf
KDD (1)
Haoyu Liu, Chaoyu Gong, Mengke He, Jiate Li, Kai Han, Siqiang Luo
2025 J jnl
Neural Process. Lett.
Haiyan Wang, Kai Han, Chuang Li, Jian Zhao, Na Che, Xiaotong Liu
2025 J jnl
CoRR
Hang Luo, Nanlin Zhou, Haoxiang Zhang, Kai Han, Ning Zhao, Zhiyuan Yang, Jian Qi, Sikai Zhao, Jie Zhao, Yanhe Zhu
2025 J jnl
CoRR
Jiahuan Zhang, Shunwen Bai, Tianheng Wang, Kaiwen Guo, Kai Han, Guozheng Rao, Kaicheng Yu
2025 J jnl
CoRR
Zhenqi He, Yuanpei Liu, Kai Han
2025 J jnl
CoRR
Chengcheng Wang, Jianyuan Guo, Hongguang Li, Yuchuan Tian, Ying Nie, Chang Xu, Kai Han
2025 J jnl
CoRR
Yuanpei Liu, Kai Han
2025 A* conf
CVPR
Muli Yang, Gabriel James Goenawan, Huaiyuan Qin, Kai Han, Xi Peng, Yanhua Yang, Hongyuan Zhu
2025 J jnl
CoRR
Xiaohu Huang, Hao Zhou, Qiangpeng Yang, Shilei Wen, Kai Han
2025 J jnl
CoRR
Xiaohu Huang, Jingjing Wu, Qunyi Xie, Kai Han
2025 J jnl
CoRR
Kunal Bhosikar, Siddharth Katageri, Vivek Madhavaram, Kai Han, Charu Sharma
2025 A* conf
CVPR
Chang-Bin Zhang, Yujie Zhong, Kai Han
2025 J jnl
Sci. China Inf. Sci.
Hao Liu, Zhen Xu, Yifan Wei, Kai Han, Xin Peng
2025 conf
ACL (Findings)
Xiaohu Huang, Hao Zhou, Kai Han
2025 J jnl
CoRR
Zhenqi He, Yuanpei Liu, Kai Han
2025 J jnl
CoRR
Silin Cheng, Kai Han
2025 J jnl
J. Supercomput.
Xin Chen, Enliang Zhu, Yaolin Zhu, Yan Fu, Kai Han, Bing Liu
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Kai Han, Jin Wang, Yunhui Shi, HanQin Cai, Nam Ling, Baocai Yin
2025 J jnl
CoRR
Haoyu Liu, Chaoyu Gong, Mengke He, Jiate Li, Kai Han, Siqiang Luo
2025 A conf
IROS
Nanlin Zhou, Sikai Zhao, Hang Luo, Kai Han, Zhiyuan Yang, Jian Qi, Ning Zhao, Jie Zhao, Yanhe Zhu
2025 A* conf
CVPR
Chang-Bin Zhang, Jinhong Ni, Yujie Zhong, Kai Han
2025 J jnl
CoRR
Chang-Bin Zhang, Jinhong Ni, Yujie Zhong, Kai Han
2024 J jnl
Adv. Intell. Syst.
Jian Qi, Mingzhu Lai, Zhiyuan Yang, Ning Zhao, Kai Han, Xin Sui, Jie Zhao, Yanhe Zhu
2024 conf
NAS
Peng Wang, Yu Liu, Kai Han, Ziqi Liu, Ke Liu, Mingyang Wang, Ke Zhou, Zhihai Huang
2024 A* conf
ACM Multimedia
Kai Han, Jin Wang, Yunhui Shi, Nam Ling, Baocai Yin
2024 J jnl
IEEE Robotics Autom. Lett.
Zhiyuan Yang, Sikai Zhao, Kai Han, Jian Qi, Ning Zhao, Xin Sui, Jizhuang Fan, Jie Zhao, Yanhe Zhu
2024 J jnl
CoRR
Xiaohu Huang, Hao Zhou, Kun Yao, Kai Han
2024 A* conf
ICLR
Xiaohu Huang, Hao Zhou, Kun Yao, Kai Han
2024 conf
ICKG
Chen Liu, Lequan Yu, Kai Han, Guosheng Yin
2024 J jnl
CoRR
Chang-Bin Zhang, Yujie Zhong, Kai Han
2024 J jnl
CoRR
Jiacheng Zhang, Jie Wu, Weifeng Chen, Yatai Ji, Xuefeng Xiao, Weilin Huang, Kai Han
2024 J jnl
CoRR
Xiaohu Huang, Hao Zhou, Kai Han
2024 J jnl
CoRR
Butian Xiong, Xiaoyu Ye, Tze Ho Elden Tse, Kai Han, Shuguang Cui, Zhen Li
2024 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Kai Han, Yu Liu, Rukai Wei, Ke Zhou, Jinhui Xu, Kun Long
2024 J jnl
CoRR
Silin Cheng, Yuanpei Liu, Kai Han
2024 J jnl
CoRR
Kai Han, Jin Wang, Yunhui Shi, HanQin Cai, Nam Ling, Baocai Yin
2023 J jnl
Adv. Intell. Syst.
Ning Zhao, Liang Gao, Zhiyuan Yang, Jian Qi, Kai Han, Xin Sui, Jie Zhao, Yanhe Zhu
2023 A* conf
ICCV
Cong Han, Yujie Zhong, Dengjie Li, Kai Han, Lin Ma
2023 conf
ICIEAI
Kai Han, Juan Xu
2023 J jnl
CoRR
Cong Han, Yujie Zhong, Dengjie Li, Kai Han, Lin Ma
2022 conf
NEWCAS
Yongqian Du, Jiahao Chen, Guifang Li, Kai Han, Tianxiang Qu, Shibin Liu
2021 J jnl
Int. J. Control
Kai Han, Ximin Rong, Hui Zhao, Suxin Wang
2020 conf
ICITE
Xiaojian Zhang, Zhuopeng Shi, Jiwu Liu, Kai Han, Weiyang Yan, Xiangyu Zhang, Qi 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"