Hang Zhang

64 papers B 1C 1Misc 1Journal 48Unranked 13
YearRankTypeTitle / Venue / Authors
2024 J jnl
Int. J. Satell. Commun. Netw.
Yuan Qin, Hang Zhang, Wen Li, Hongpeng Zhu, Jiong Li
2022 J jnl
IEEE Internet Things J.
Ning Ma, Hang Zhang, Hang Hu, Yuan Qin
2020 J jnl
Wirel. Pers. Commun.
Hang Hu, Xinyu Da, Hang Zhang, Lei Ni
2020 J jnl
IEEE Wirel. Commun. Lett.
Hang Hu, Yangchao Huang, Xinyu Da, Hang Zhang, Lei Ni, Yu Pan
2020 J jnl
IEEE Access
Jing Ren, Hang Zhang, Zhiyong Du, Youming Sun, Hang Hu, Xucheng Zhu
2019 J jnl
IEEE Access
Jing Ren, Hang Zhang, Hang Hu, Fengyi Cheng, Yuan Qin
2019 J jnl
Int. J. Satell. Commun. Netw.
Hua Yang, Hang Zhang, Jiang Zhang, Liu Yang
2019 conf
WISATS (1)
Hua Yang, Hang Zhang, Jiang Zhang, Liu Yang, Pengfei Wang
2019 J jnl
Pattern Recognit.
Jiong Li, Hang Zhang, Pengfei Wang
2019 J jnl
IEEE Access
Hang Hu, Xinyu Da, Lei Ni, Yangchao Huang, Hang Zhang
2019 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Liu Yang, Hang Zhang, Yang Cai, Hua Yang, Qiao Su
2019 J jnl
IEEE Access
Hang Hu, Xinyu Da, Yangchao Huang, Hang Zhang, Lei Ni, Yu Pan
2018 conf
ICCC Workshops
Liu Yang, Hang Zhang, Yang Cai, Liming Hu
2018 J jnl
Circuits Syst. Signal Process.
Liu Yang, Hang Zhang, Yang Cai
2018 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Liu Yang, Hang Zhang, Yang Cai, Qiao Su
2018 J jnl
IEEE Access
Hua Yang, Hang Zhang, Jiong Li, Liu Yang, Wenchun Ding
2018 J jnl
IEEE Access
Liu Yang, Hang Zhang, Yang Cai, Hua Yang
2018 J jnl
IEEE Access
Hua Yang, Hang Zhang, Jiang Zhang, Liu Yang
2018 J jnl
ACM Trans. Embed. Comput. Syst.
Hang Hu, Hang Zhang, Jianxin Guo, Feng Wang
2018 J jnl
Neurocomputing
Jiong Li, Hang Zhang, Menglan Fan, Jiang Zhang
2017 J jnl
Circuits Syst. Signal Process.
Fanglin Gu, Hang Zhang, Wenwu Wang, Shan Wang
2017 J jnl
IEEE Trans. Veh. Technol.
Hang Hu, Ying-Chang Liang, Hang Zhang, Boon-Hee Soong
2017 J jnl
IEEE Access
Jiong Li, Hang Zhang, Menglan Fan
2017 J jnl
Wirel. Pers. Commun.
Hang Hu, Hang Zhang, Weiting Gao, Lei Li, Qian Wang, Yewen Guan
2016 J jnl
Circuits Syst. Signal Process.
Fanglin Gu, Hang Zhang, Wenwu Wang, Chunlin Xiong
2016 conf
WCSP
Liu Yang, Hang Zhang, Jiong Li, Hua Yang, Yang Cai
2016 Misc conf
ICCS
Menglan Fan, Hang Zhang, Hang Hu, Qian Wang
2016 J jnl
J. Optim. Theory Appl.
Hang Hu, Hang Zhang, Hong Yu
2016 J jnl
IEEE Commun. Lett.
Jiong Li, Hang Zhang, Jiang Zhang
2016 J jnl
IEEE Trans. Veh. Technol.
Hang Hu, Hang Zhang, Ning Li
2016 J jnl
IEEE Trans. Commun.
Hang Hu, Hang Zhang, Ying-Chang Liang
2016 J jnl
计算机科学
Hua Yang, Hang Zhang, Jiang Zhang, Liu Yang, Jiong Li
2015 J jnl
Circuits Syst. Signal Process.
Fanglin Gu, Hang Zhang, Shan Wang, Desheng Zhu
2015 J jnl
Comput. Electr. Eng.
Hang Hu, Hang Zhang, Hong Yu, Yi Chen, Javad Jafarian
2015 conf
WCSP
Hua Yang, Hang Zhang, Liu Yang
2015 J jnl
Wirel. Pers. Commun.
Hang Hu, Hang Zhang, Yi Chen
2015 J jnl
计算机科学
Yi Chen, Hang Zhang, Hang Hu
2014 J jnl
Int. J. Commun. Syst.
Xiaobo Tan, Hang Zhang, Zhiwen Liu, Jian Hu
2014 J jnl
Ann. des Télécommunications
Xiaobo Tan, Hang Zhang, Jian Hu
2014 conf
WCSP
Liu Yang, Hang Zhang, Xinhai Tong
2014 J jnl
IET Commun.
Xiaobo Tan, Hang Zhang, Jian Hu
2014 conf
WCSP
Hang Hu, Hang Zhang, Yewen Guan
2014 J jnl
Wirel. Pers. Commun.
Hang Hu, Hang Zhang, Hong Yu
2014 J jnl
Mob. Networks Appl.
Hang Hu, Hang Zhang, Hong Yu
2014 J jnl
IET Commun.
Xiaobo Tan, Hang Zhang, Jian Hu
2014 J jnl
Wirel. Pers. Commun.
Yu-ling Duan, Hang Zhang
2014 J jnl
Trans. Emerg. Telecommun. Technol.
Xiaobo Tan, Hang Zhang, Qian Chen, Jian Hu
2014 J jnl
Circuits Syst. Signal Process.
Fanglin Gu, Hang Zhang, Wenwu Wang, Desheng Zhu
2013 conf
TSP
Fanglin Gu, Hang Zhang, Jiang Zhang, Desheng Zhu, Pan Luo
2013 J jnl
IEEE Commun. Lett.
Xiaobo Tan, Hang Zhang, Jian Hu
2013 conf
WOCC
Xiaobo Tan, Hang Zhang
2013 J jnl
IEEE Signal Process. Lett.
Fanglin Gu, Hang Zhang, Desheng Zhu
2013 J jnl
Digit. Signal Process.
Fanglin Gu, Hang Zhang, Desheng Zhu
2013 J jnl
IET Commun.
Jiang Zhang, Hang Zhang, Zhifu Cui
2013 J jnl
EURASIP J. Adv. Signal Process.
Fanglin Gu, Hang Zhang, Wenwu Wang, Desheng Zhu
2013 B conf
WCNC
Hang Hu, Hang Zhang, Hong Yu, Youyun Xu, Ning Li
2013 conf
WCSP
Fanglin Gu, Hang Zhang, Yi Xiao
2012 J jnl
KSII Trans. Internet Inf. Syst.
Xiaobo Tan, Hang Zhang
2012 conf
WCSP
Jiang Zhang, Hang Zhang
2012 conf
ISSPA
Fanglin Gu, Hang Zhang, Yi Xiao
2012 J jnl
KSII Trans. Internet Inf. Syst.
Hang Hu, Youyun Xu, Zhiwen Liu, Ning Li, Hang Zhang
2011 C conf
UIC
Hang Zhang, Fanglin Gu, Yi Xiao
2010 conf
WCSP
Xiaobo Tan, Hang Zhang, Yanming Sheng, Wei Lu
2010 conf
WCSP
Fanglin Gu, Hang Zhang, Ning Li, Wei Lu
redb/extractors/elf_extractors/elf_symbols.py
← Index redb/extractors/elf_extractors/elf_symbols.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 ELFSymbol


class ELFSymbolExtractor(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_symbols = []
        self.elastic_index = self.index_prefix + "-elf_symbols"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _map_symbol_type(self, st_type_str: str) -> int:
        """Map symbol type string to enum value."""
        type_map = {
            'STT_NOTYPE': 0,
            'STT_OBJECT': 1,
            'STT_FUNC': 2,
            'STT_SECTION': 3,
            'STT_FILE': 4,
            'STT_COMMON': 5,
            'STT_TLS': 6
        }
        return type_map.get(st_type_str, 0)

    def _map_symbol_bind(self, st_bind_str: str) -> int:
        """Map symbol binding string to enum value."""
        bind_map = {
            'STB_LOCAL': 0,
            'STB_GLOBAL': 1,
            'STB_WEAK': 2
        }
        return bind_map.get(st_bind_str, 0)

    def _map_symbol_visibility(self, st_vis_str: str) -> int:
        """Map symbol visibility string to enum value."""
        vis_map = {
            'STV_DEFAULT': 0,
            'STV_INTERNAL': 1,
            'STV_HIDDEN': 2,
            'STV_PROTECTED': 3
        }
        return vis_map.get(st_vis_str, 0)

    def _extract_symbol_data(self, symbol, is_dynamic: bool = False) -> Dict:
        """Extract data from a single symbol."""
        try:
            # Get symbol name (handle empty names)
            symbol_name = symbol.name if symbol.name else f"<unnamed_{symbol.entry.get('st_name', 0)}>"

            # Get symbol properties
            symbol_value = symbol.entry.get('st_value', 0)
            symbol_size = symbol.entry.get('st_size', 0)

            # Handle section index - can be integer or special string like 'SHN_UNDEF'
            st_shndx_raw = symbol.entry.get('st_shndx', 0)
            if isinstance(st_shndx_raw, str):
                # Map special section index strings to integers
                shndx_map = {
                    'SHN_UNDEF': 0,
                    'SHN_ABS': 65521,  # 0xFFF1
                    'SHN_COMMON': 65522,  # 0xFFF2
                    'SHN_XINDEX': 65535,  # 0xFFFF
                }
                symbol_section_index = shndx_map.get(st_shndx_raw, 0)
                symbol_section_index_str = st_shndx_raw.replace('SHN_', '') if st_shndx_raw.startswith('SHN_') else st_shndx_raw
            else:
                symbol_section_index = st_shndx_raw
                symbol_section_index_str = str(st_shndx_raw)

            # Get symbol type and map to enum
            st_type_str = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
            symbol_type_enum = self._map_symbol_type(st_type_str)
            symbol_type_str = st_type_str.replace('STT_', '') if st_type_str.startswith('STT_') else st_type_str

            # Get symbol binding and map to enum
            st_bind_str = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')
            symbol_bind_enum = self._map_symbol_bind(st_bind_str)
            symbol_bind_str = st_bind_str.replace('STB_', '') if st_bind_str.startswith('STB_') else st_bind_str

            # Get symbol visibility and map to enum
            st_vis_str = symbol.entry.get('st_other', {}).get('visibility', 'STV_DEFAULT')
            symbol_visibility_enum = self._map_symbol_visibility(st_vis_str)
            symbol_visibility_str = st_vis_str.replace('STV_', '') if st_vis_str.startswith('STV_') else st_vis_str

            return ELFSymbol(
                symbol_name=symbol_name,
                symbol_value=symbol_value,
                symbol_size=symbol_size,
                symbol_type=symbol_type_enum,
                symbol_type_str=symbol_type_str,
                symbol_bind=symbol_bind_enum,
                symbol_bind_str=symbol_bind_str,
                symbol_visibility=symbol_visibility_enum,
                symbol_visibility_str=symbol_visibility_str,
                symbol_section_index=symbol_section_index,
                symbol_section_index_str=symbol_section_index_str,
                is_dynamic=1 if is_dynamic else 0
            )

        except Exception as e:
            self.log.error(f"Error extracting symbol data: {e}")
            return None

    def _extract_symbols_from_section(self, elf, section_name: str, is_dynamic: bool = False) -> List[Dict]:
        """Extract symbols from a specific symbol table section."""
        symbols = []

        try:
            section = elf.get_section_by_name(section_name)
            if not section:
                self.log.debug(f"No {section_name} section found")
                return symbols

            if not hasattr(section, 'iter_symbols'):
                self.log.debug(f"Section {section_name} is not a symbol table")
                return symbols

            # Iterate through symbols in the section with per-symbol error handling
            for symbol_index, symbol in enumerate(section.iter_symbols()):
                try:
                    symbol_data = self._extract_symbol_data(symbol, is_dynamic)
                    if symbol_data:
                        symbols.append(symbol_data)
                except Exception as e:
                    self.log.warning(f"Error processing symbol {symbol_index} in {section_name}: {e}")
                    # Continue with other symbols

        except Exception as e:
            self.log.error(f"Error extracting symbols from {section_name}: {e}")

        return symbols

    def tag(self):
        return Tag.ELF_SYMBOLS.value if hasattr(Tag, 'ELF_SYMBOLS') else "elf_symbols"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_symbols = []

                # Extract static symbols from .symtab with individual error handling
                try:
                    static_symbols = self._extract_symbols_from_section(elf, '.symtab', is_dynamic=False)
                    all_symbols.extend(static_symbols)
                    self.log.debug(f"Extracted {len(static_symbols)} static symbols from .symtab")
                except Exception as e:
                    self.log.warning(f"Error extracting static symbols from .symtab: {e}")

                # Extract dynamic symbols from .dynsym with individual error handling
                try:
                    dynamic_symbols = self._extract_symbols_from_section(elf, '.dynsym', is_dynamic=True)
                    all_symbols.extend(dynamic_symbols)
                    self.log.debug(f"Extracted {len(dynamic_symbols)} dynamic symbols from .dynsym")
                except Exception as e:
                    self.log.warning(f"Error extracting dynamic symbols from .dynsym: {e}")

                return all_symbols

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_symbols = result
            return self.elf_symbols

        except Exception as e:
            self.log.error(f"Error extracting ELF symbols {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_symbols
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no symbols (e.g., stripped binary)
                # None is reserved for actual errors

                # Prepare data arrays for all symbols
                data = []
                current_time = datetime.now(timezone.utc)
                for symbol in self.elf_symbols:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        symbol.symbol_name,
                        symbol.symbol_value,
                        symbol.symbol_size,
                        symbol.symbol_type,
                        symbol.symbol_type_str,
                        symbol.symbol_bind,
                        symbol.symbol_bind_str,
                        symbol.symbol_visibility,
                        symbol.symbol_visibility_str,
                        symbol.symbol_section_index,
                        symbol.symbol_section_index_str,
                        symbol.is_dynamic,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'symbol_name', 'symbol_value', 'symbol_size',
                    'symbol_type', 'symbol_type_str',
                    'symbol_bind', 'symbol_bind_str',
                    'symbol_visibility', 'symbol_visibility_str',
                    'symbol_section_index', 'symbol_section_index_str', 'is_dynamic',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt64', 'UInt64',
                    "Enum8('NOTYPE'=0, 'OBJECT'=1, 'FUNC'=2, 'SECTION'=3, 'FILE'=4, 'COMMON'=5, 'TLS'=6)",
                    'LowCardinality(String)',
                    "Enum8('LOCAL'=0, 'GLOBAL'=1, 'WEAK'=2)",
                    'LowCardinality(String)',
                    "Enum8('DEFAULT'=0, 'INTERNAL'=1, 'HIDDEN'=2, 'PROTECTED'=3)",
                    'LowCardinality(String)',
                    'UInt16', 'LowCardinality(String)', 'UInt8',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                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_symbols"