H. Yang

38 papers A* 4C 2Misc 1Journal 16Unranked 14
YearRankTypeTitle / Venue / Authors
2026 conf
ISSCC
D. Shin, H. Yang, S. Jeon, J. Park, S. Han, J. Lee, J. Kim, H. Kim, Y. Oh, M. Kim, C. Jung, W. Kim, S. Kim, H. Jeong, G. Kim, K. Lee, G. Song, Y. Min, C. Song, A. Kanybek, Y. Jung, J. Song, S. Cho, H. Na, D. Si, B. Lee, B. Park, H. Jeon
2026 J jnl
IEEE Robotics Autom. Lett.
Fernando Ruiz, H. Yang, Yegor Piskarev, Begoña C. Arrue, Aníbal Ollero
2025 conf
ECOC
F. Nogueira Sampaio, Trung-Hien Nguyen, Loig Godard, Sheherazade Lamkadmi Azouigui, H. Yang, H. Qiu, Guo. Q, Sami Mumtaz, Gabriel Charlet, Abel Lorences-Riesgo
2024 conf
IRPS
M. Kang, M. Chang, Y. Park, C. Noh, S. H. Hong, B. Park, Y. H. Park, Y. C. Jung, W. S. Lim, G. H. Kim, Y. Lee, H. Yang, D. Shin, J. G. Yang, K. H. Cho, W. C. Jeong, H.-J. Cho, Wook-Hyeon Kwon, D. W. Kim, K. Rim, J. H. Song
2024 conf
VLSI Technology and Circuits
H. Yang, Y. Li, Jianshi Tang, R. An, Y. Zhang, L. Gao, N. Gao, H. Xu, Y. Du, Z. Liu, X. Ma, G. Wang, C. Zhao, J. Xiang, J. Zhao, W. Bu, K. Zheng, J. Kang, Bin Gao, H. Qian, H. Wu
2019 conf
IRPS
Jia Hao Lim, Nagarajan Raghavan, Vinayak Bharat Naik, Jae Hyun Kwon, Kazutaka Yamane, H. Yang, K. H. Lee, Kin Leong Pey
2019 conf
IRPS
Vinayak Bharat Naik, J. H. Lim, K. Yamane, Dinggui Zeng, H. Yang, N. Thiyagarajah, Jae Hyun Kwon, N. L. Chung, R. Chao, T. Ling, K. Lee
2018 J jnl
J. Intell. Fuzzy Syst.
Duo Wang, H. Chen, H. Yang, S. Xue
2017 J jnl
Int. J. Bifurc. Chaos
Junyi Duan, Guo-Ping Jiang, H. Yang
2016 J jnl
Comput. Networks
Dewei Yi, H. Yang
2016 C conf
CCA
Rafael M. Morales, H. Yang
2015 conf
ECOC
M. U. Sadiq, Hongyu Zhang, Michael Gleeson, Nan Ye, Brendan Roycroft, Niamh Kavanagh, C. Robert, H. Yang, Kevin Thomas, Agnieszka Gocalinska, Zhihong Li, Yong Chen, Natalie V. Wheeler, John R. Hayes, Shaif-Ul Alam, Francesco Poletti, Marco N. Petrovich, David J. Richardson, Brian Kelly, John O'Carroll, Richard Phelan, Emanuele Pelucchi, Peter O'Brien, Frank H. Peters, Fatima Gunning, Brian Corbett
2015 J jnl
Digit. Signal Process.
Luca Martino, H. Yang, David Luengo, Juho Kanniainen, Jukka Corander
2014 J jnl
IBM J. Res. Dev.
Y. Amemiya, H. Yang, K. Anikeev
2014 conf
ECOC
Brian Corbett, Michael Gleeson, Nan Ye, C. Robert, H. Yang, Hongyu Zhang, Naoise Mac Suibhne, Padraic E. Morrissey, Kevin Thomas, Agnieszka Gocalinska, Emanuele Pelucchi, Richard Phelan, Brian Kelly, John O'Carroll, Frank H. Peters, F. C. Garcia Gunning
2013 J jnl
Expert Syst. Appl.
Minseok Song, H. Yang, Seyed Hossein Siadat, Mykola Pechenizkiy
2013 ch.
Managing Requirements Knowledge
Vincenzo Gervasi, Ricardo Gacitúa, Mark Rouncefield, Peter Sawyer, Leonid Kof, Lin Ma, Paul Piwek, Anne N. De Roeck, Alistair Willis, H. Yang, Bashar Nuseibeh
2010 conf
CSNDSP
Nicola Calabretta, Wenrui Wang, Ton Ditewig, Fausto Gomez, H. Yang, Oded Raz, Huug de Waardt, Harm J. S. Dorren
2009 conf
MARK@RE
Ricardo Gacitúa, Lin Ma, Bashar Nuseibeh, Paul Piwek, Anne N. De Roeck, Mark Rouncefield, Peter Sawyer, Alistair Willis, H. Yang
2008 J jnl
IET Commun.
H. Yang, G. Li, L. Tang
2008 J jnl
CoRR
H. Yang, T.-H. Tsai, C.-C. Hu
2006 J jnl
J. Comput. Inf. Sci. Eng.
Deyi Xue, H. Yang, Y. L. Tu
2006 J jnl
Concurr. Eng. Res. Appl.
H. Yang, Deyi Xue, Y. L. Tu
2004 J jnl
Comput. Graph. Forum
Yong Kui Liu, Borut Zalik, H. Yang
2004 conf
TRECVID
Alexander G. Hauptmann, Ming-yu Chen, Michael G. Christel, C. Huang, Wei-Hao Lin, Tobun D. Ng, Norman Papernick, A. Velivelli, Jie Yang, Rong Yan, H. Yang, Howard D. Wactlar
2003 conf
WAA
A. Zhang, H. Yang
2002 J jnl
Appl. Math. Lett.
H. Yang, J. Yu
2002 A* conf
CCS
R. Sekar, Ajay Gupta, J. Frullo, T. Shanbhag, A. Tiwari, H. Yang, S. Zhou
2001 conf
Bildverarbeitung für die Medizin
Tim O. Müller, Rainer Stotzka, Dieter Höpfel, H. Yang
2000 C conf
ISCAS
Rahul Sarpeshkar, R. Herrera, H. Yang
1999 A* conf
ICRA
H. Yang, Hariharan Krishnan, Marcelo H. Ang
1999 A* conf
ICRA
H. Yang, Hariharan Krishnan, Marcelo H. Ang
1997 A* conf
ICRA
H. Yang, Hariharan Krishnan, Marcelo H. Ang Jr.
1996 conf
EUSIPCO
A. M. Alvarez, S. George, H. Yang, K. Das
1995 J jnl
IEEE Trans. Signal Process.
Y. Hua, H. Yang
1994 J jnl
IEEE Signal Process. Lett.
Y. Hua, H. Yang, W. Qiu
1993 J jnl
Computing
H. Yang
1992 Misc conf
ICASSP
H. Yang, Mehrdad Soumekh
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"