Wei Chen

51 papers B 1C 3Misc 1Journal 34Unranked 12
YearRankTypeTitle / Venue / Authors
2024 C conf
IV
Luyao Du, Wei Chen, Xingzhuo Yan, Jing Ji, Bingming Tong, Wenwang Yang
2022 J jnl
Comput. Intell. Neurosci.
Luyao Du, Wei Chen, Jing Ji, Zhonghui Pei, Bingming Tong, Hongjiang Zheng
2021 J jnl
Sensors
Jing Ji, Yuting Liu, Wei Chen, Di Wu, Hongyang Lu, Jiantong Zhang
2021 J jnl
Sensors
Fang Li, Wei Chen, Yishui Shui
2021 J jnl
Sensors
Zhonghui Pei, Xiaojun Wang, Zhen Lei, Hongjiang Zheng, Luyao Du, Wei Chen
2021 conf
ICCCS
Zhonghui Pei, Wei Chen, Luyao Du, Hongjiang Zheng
2021 J jnl
Phys. Commun.
Fuxing Chang, Changzhen Li, Hongjiang Zheng, Junyi Yu, Kun Yang, Wei Chen
2020 J jnl
Sensors
Luyao Du, Jing Ji, Zhonghui Pei, Wei Chen
2020 J jnl
IEEE Access
Jing Ji, Jiantong Zhang, Hongyang Lu, Yuting Liu, Di Wu, Wei Chen
2020 J jnl
Int. J. Distributed Sens. Networks
Gaoli Zhao, Jianping Wang, Junping Song, Wei Chen
2020 J jnl
IEEE Trans. Wirel. Commun.
Junyi Yu, Wei Chen, Fang Li, Changzhen Li, Kun Yang, Yi Liu, Fuxing Chang
2020 J jnl
IET Commun.
Changzhen Li, Shoufeng Wang, Junyi Yu, Wei Chen, Kun Yang
2020 J jnl
Comput. Intell. Neurosci.
Luyao Du, Wei Chen, Zhonghui Pei, Hongjiang Zheng, Shuaizhi Fu, Kang Chen, Di Wu
2020 J jnl
IET Commun.
Junyi Yu, Wei Chen, Fang Li, Changzhen Li, Kehao Wang, Kun Yang, Fuxing Chang
2020 J jnl
Mob. Inf. Syst.
Zhonghui Pei, Wei Chen, Hongjiang Zheng, Luyao Du
2020 J jnl
KSII Trans. Internet Inf. Syst.
Jing Zhang, Changzhen Li, Luyao Du, Wei Chen
2020 J jnl
IEEE Access
Jianping Wang, Yingying Lv, Wei Chen, Guohong Gao, Peixin Qu, Zhou Yu
2020 J jnl
IEEE Access
Fang Li, Wei Chen, Yishui Shui
2019 J jnl
J. Inf. Sci. Eng.
Jianping Wang, Wei Chen, Shu-Jing Zhang, Xiangang Zuo, Zhou Yu
2019 J jnl
J. Sensors
Gaoli Zhao, Jianping Wang, Wei Chen, Junping Song
2019 J jnl
IEEE Access
Jianping Wang, Guohong Gao, Peixin Qu, Wei Chen, Shujing Zhang, Xiangang Zuo, Zhou Yu
2019 J jnl
J. Sensors
Jianping Wang, Dechuan Kong, Wei Chen, Shujing Zhang
2019 J jnl
Phys. Commun.
Fang Li, Wei Chen, Yishui Shui, Ji Wang, Kun Yang, Lida Xu, Junyi Yu, Changzhen Li
2019 J jnl
IET Commun.
Lin Chen, Kaigui Bian, Xiaohu Ge, Wei Chen, Qingsong Ai, Kehao Wang
2019 J jnl
Sensors
Shoujun Liu, Kehao Wang, Kezhong Liu, Wei Chen
2019 conf
ICC
Changzhen Li, Junyi Yu, Wei Chen, Kun Yang, Fang Li
2019 J jnl
IEEE Access
Fuxing Chang, Wei Chen, Junyi Yu, Changzhen Li, Fang Li, Kun Yang
2018 conf
NaNA
Jianping Wang, Shujing Zhang, Guohong Gao, Lei Cai, Xiangang Zuo, Zhou Yu, Wei Chen
2018 J jnl
Int. J. Distributed Sens. Networks
Jianping Wang, Shujing Zhang, Wei Chen, Dechuan Kong, Zhou Yu
2018 J jnl
IEEE Access
Jianping Wang, Shujing Zhang, Wei Chen, Dechuan Kong, Xiangang Zuo, Zhou Yu
2018 conf
ITST
Fang Li, Wei Chen, Ji Wang, Yishui Shui, Kun Yang, Lida Xu, Junyi Yu, Changzhen Li
2018 J jnl
Int. J. Distributed Sens. Networks
Shoujun Liu, Kezhong Liu, Jie Ma, Wei Chen
2018 J jnl
IEEE Trans. Veh. Technol.
Kehao Wang, Lin Chen, Jihong Yu, Qingju Fan, Yang Zhang, Wei Chen, Pan Zhou, Yi Zhong
2018 Misc conf
ICCS
Xuanhao Shu, Changzhen Li, Wei Chen, Junyi Yu, Kun Yang
2018 conf
ITST
Kun Yang, Ning Zhou, Andreas F. Molisch, Terje Roste, Egil Eide, Torbjörn Ekman, Junyi Yu, Fang Li, Wei Chen
2018 J jnl
IEEE Access
Changzhen Li, Kun Yang, Junyi Yu, Fang Li, Yishui Shui, Fuxing Chang, Wei Chen
2018 J jnl
IET Commun.
Changzhen Li, Wei Chen, Junyi Yu, Kun Yang, Fang Li, Yishui Shui
2017 C conf
ICCC
Fang Li, Wei Chen, Yishui Shui, Lida Xu, Junyi Yu, Changzhen Li, Kun Yang
2017 conf
ICMLSC
Zhengkai Weng, Tao Xie, Fei Chen, Wei Chen
2017 J jnl
Int. J. Distributed Sens. Networks
Jianping Wang, Lijuan Ma, Wei Chen
2017 B conf
PIMRC
Changzhen Li, Junyi Yu, Kun Yang, Wei Chen, Fang Li, Yishui Shui
2016 J jnl
Int. J. Online Eng.
Yishui Shui, Fang Li, Yichen Chen, Wei Chen
2016 conf
VTC Spring
Junyi Yu, Changzhen Li, Kun Yang, Wei Chen
2015 conf
BIC-TA
Di Wu, Jing Ji, Jing Li, Dongming Zhao, Wei Chen
2015 J jnl
IEEE Trans. Commun.
Huixian Wang, Ren Ping Liu, Wei Ni, Wei Chen, Iain B. Collings
2014 conf
ICC
Huixian Wang, Ren Ping Liu, Wei Ni, Wei Chen, Iain B. Collings
2014 conf
CyberC
Shoujun Liu, Kezhong Liu, Wei Chen
2014 J jnl
Wirel. Pers. Commun.
Hongjiang Zheng, Wei Chen, Rongbo Zhu, Wei Feng
2014 conf
IOV
Shoujun Liu, Kezhong Liu, Wei Chen
2012 C conf
IGARSS
Hailan Kuang, William Perrie, Wei Chen, Tao Xie, Xin-hua Liu, Biao Zhang
2009 conf
CNSR
Wei Chen, Zhiyi He, Tao Xie, Wei Zhou
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"