Nan Peng

26 papers A 1Journal 20Unranked 5
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Instrum. Meas.
Nan Peng, Weixing Zhang, Mingxuan Du, Rui Liang, Zhuang Xie, Peng Zhang, Wei Wang
2025 J jnl
IEEE Trans. Instrum. Meas.
Nan Peng, Guangyang Zhou, Rui Liang, Lihua Xu, Peng Zhang
2025 J jnl
IEEE Trans. Smart Grid
Peng Zhang, Meng Hou, Rui Liang, Zehua Tang, Jian Li, Mohan Jin, Zhongyu Sun, Nan Peng
2025 A conf
WACV
Nan Peng, Xun Zhou, Mingming Wang, Xiaojun Yang, Songming Chen, Guisong Chen
2025 J jnl
IEEE Trans. Smart Grid
Nan Peng, Guangyang Zhou, Rui Liang, Zhisheng Wang, Yudong Hu, Peng Zhang, Zhipeng Zhao
2025 J jnl
CoRR
Nan Peng, Xun Zhou, Mingming Wang, Guisong Chen, Wenqi Xu
2024 J jnl
Remote. Sens.
Xuan Yang, Qinghao Li, Jinming Ge, Bo Wang, Nan Peng, Jing Su, Chi Zhang, Jiajing Du
2024 J jnl
IEEE Trans. Ind. Informatics
Nan Peng, Lihua Xu, Rui Liang, Guangyang Zhou, Peng Zhang, Mohan Jin, Meng Hou, Jian Li, Yihang Pan
2024 J jnl
IEEE Trans. Ind. Informatics
Peng Zhang, Mohan Jin, Rui Liang, Zehua Tang, Meng Hou, Nan Peng, Juan Li
2024 J jnl
Sensors
Yuanchang Liu, Nan Peng, Jinlong Kang, Takeshi Onodera, Rui Yatabe
2024 J jnl
CoRR
Nan Peng, Xun Zhou, Mingming Wang, Xiaojun Yang, Songming Chen, Guisong Chen
2023 J jnl
CoRR
Deyun Zhang, Shijia Geng, Yang Zhou, Weilun Xu, Guodong Wei, Kai Wang, Jie Yu, Qiang Zhu, Yongkui Li, Yonghong Zhao, Xingyue Chen, Rui Zhang, Zhaoji Fu, Rongbo Zhou, Yanqi E, Sumei Fan, Qinghao Zhao, Chuandong Cheng, Nan Peng, Liang Zhang, Linlin Zheng, Jianjun Chu, Hongbin Xu, Chen Tan, Jian Liu, Huayue Tao, Tong Liu, Kangyin Chen, Chenyang Jiang, Xingpeng Liu, Shenda Hong
2023 J jnl
Remote. Sens.
Nan Peng, Jing Su, Xinyi Han, Xingzhu Deng, Weiqi Lan, Jinyan Wang
2023 J jnl
IEEE Trans. Ind. Informatics
Peng Zhang, Lingchang Kong, Rui Liang, Bingyin Xu, Nan Peng
2023 J jnl
IEEE Trans. Smart Grid
Nan Peng, Peng Zhang, Rui Liang, Zhengyi Zhang, Xinyu Liu, Hao Wang, Yang Zhao, Xiaofeng Ren, Xiuru Wang
2023 J jnl
IEEE Trans. Ind. Informatics
Nan Peng, Zhengyi Zhang, Rui Liang, Chengrui Jiang, Peng Zhang, Xiaofeng Ren, Xiuru Wang
2022 J jnl
Genom. Proteom. Bioinform.
Khaista Rahman, Muhammad Jamal, Xi Chen, Wei Zhou, Bin Yang, Yanyan Zou, Weize Xu, Yingying Lei, Chengchao Wu, Xiaojian Cao, Rohit Tyagi, Muhammad Ahsan Naeem, Da Lin, Zeshan Habib, Nan Peng, Zhen-Hua Feng, Gang Cao
2022 conf
ECCV (26)
Teng Xi, Yifan Sun, Deli Yu, Bi Li, Nan Peng, Gang Zhang, Xinyu Zhang, Zhigang Wang, Jinwen Chen, Jian Wang, Lufei Liu, Haocheng Feng, Junyu Han, Jingtuo Liu, Errui Ding, Jingdong Wang
2022 J jnl
CoRR
Teng Xi, Yifan Sun, Deli Yu, Bi Li, Nan Peng, Gang Zhang, Xinyu Zhang, Zhigang Wang, Jinwen Chen, Jian Wang, Lufei Liu, Haocheng Feng, Junyu Han, Jingtuo Liu, Errui Ding, Jingdong Wang
2021 J jnl
IEEE Trans. Smart Grid
Nan Peng, Rui Liang, Guanhua Wang, Peng Sun, Chunyu Chen, Tianyu Hou
2021 conf
ICNSC
Nan Peng, Shihua Li, Chen Dai, Qingsong Xu
2020 J jnl
IEEE Trans. Ind. Informatics
Rui Liang, Nan Peng, Lutian Zhou, Xiangzhen Meng, Yihua Hu, Yaochun Shen, Xue Xue
2019 J jnl
IEEE Access
Nan Peng, Kai Ye, Rui Liang, Tianyu Hou, Guanhua Wang, Xuan Chen, Teng Song
2017 conf
ISCID (2)
Nan Peng, Hongya Wang, Wencheng Ding, Yingyuan Xiao, Zhenyu Liu
2017 conf
ISCID (2)
Wencheng Ding, Hongya Wang, Nan Peng, Yingyuan Xiao, Zhenyu Liu
2007 conf
MMM (1)
Nan Peng, Zhiyong Huang, Zujun Hou
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"