Hanqing Li

43 papers A* 3A 1B 1C 2Journal 21Unranked 15
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Yuhan Tang, Tiejun Li, Sheng Ma, Jianmin Zhang, Hanqing Li, Shengbai Luo, Jixuan Tang, Siqing Fu, Lizhou Wu
2025 J jnl
CoRR
Hanqing Li, Melania Fedeli, Vinay Kolar, Diego Klabjan
2025 J jnl
CoRR
Alin Fan, Hanqing Li, Sihan Lu, Jingsong Yuan, Jiandong Zhang
2025 A* conf
DAC
Yuhan Tang, Jianmin Zhang, Sheng Ma, Tiejun Li, Hanqing Li, Shengbai Luo, Jixuan Tang, Lizhou Wu
2025 A* conf
EMNLP
Hanqing Li, Diego Klabjan
2025 J jnl
Comput. Electron. Agric.
Lin Ling, Hanqing Li, Yuejin Xiao, Weiqiang Fu, Jianjun Dong, Liwei Li, Rui Liu, Xinguang Huang, Guangwei Wu, Zhijun Meng, Bingxin Yan
2025 conf
EMNLP (Findings)
Hanqing Li, Sharika Mahadevan, Kiran Sheena Jyothi, Henry Liang, Diego Klabjan
2025 J jnl
CoRR
Hanqing Li, Kiran Sheena Jyothi, Henry Liang, Sharika Mahadevan, Diego Klabjan
2024 J jnl
IEEE Internet Things J.
Maomao Lan, Yong Qiang Hei, Mengchen Huo, Hanqing Li, Wentao Li
2024 J jnl
IET Blockchain
Jingqi Yang, Hanqing Li
2024 J jnl
Biosyst.
Cooper Doe, David Brown, Hanqing Li
2024 J jnl
IEEE Internet Things J.
Guisong Yang, Jian Sang, Hanqing Li, Xingyu He, Fanglei Sun, Jiangtao Wang, Haris Pervaiz
2024 J jnl
Comput. Methods Programs Biomed.
Xiang Shen, Yue Xu, Hanqing Li, Lei Wang, Peng Sun, Qiang Liu, Jiahao Chen, Zewen He
2024 C conf
ISPA
Cunhao Cui, Tiejun Li, Jianmin Zhang, Hanqing Li, Changsong Jin, Ruixuan Ren
2024 J jnl
CoRR
Hanqing Li, Diego Klabjan
2024 conf
ICONIP (2)
Ruixuan Ren, Tiejun Li, Xinru Wang, Hanqing Li, Yuhan Tang, Yi Xie, Jianmin Zhang
2024 conf
ACCV (8)
Hanqing Li, Diego Klabjan, Jean Utke
2023 J jnl
Comput. Electron. Agric.
Changkai Wen, Jing Zhang, Kan Zheng, Hanqing Li, Lin Ling, Zhijun Meng, Weiqiang Fu, Bingxin Yan
2023 A conf
BMVC
Hulingxiao He, Wu Yuan, Yidian Huang, Shilong Zhao, Wen Yuan, Hanqing Li
2023 J jnl
CoRR
Hulingxiao He, Wu Yuan, Yidian Huang, Shilong Zhao, Wen Yuan, Hanqing Li
2023 J jnl
CoRR
Siqing Fu, Tiejun Li, Chunyuan Zhang, Hanqing Li, Sheng Ma, Jianmin Zhang, Ruiyi Zhang, Lizhou Wu
2023 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Siqing Fu, Tiejun Li, Chunyuan Zhang, Hanqing Li, Sheng Ma, Jianmin Zhang, Ruiyi Zhang, Lizhou Wu
2023 C conf
CSCWD
Hanqing Li, Niannian Chen
2023 J jnl
CoRR
Hanqing Li, Diego Klabjan, Jean Utke
2022 A* conf
CVPR
Mengzhe He, Yali Wang, Jiaxi Wu, Yiru Wang, Hanqing Li, Bo Li, Weihao Gan, Wei Wu, Yu Qiao
2022 J jnl
CoRR
Mengzhe He, Yali Wang, Jiaxi Wu, Yiru Wang, Hanqing Li, Bo Li, Weihao Gan, Wei Wu, Yu Qiao
2022 conf
CACRE
Hanqing Li, Caiqin Sun, Liyu Lu, Haoliang Wang
2022 J jnl
Entropy
Hanqing Li, Xiaohui Liu, Yuting Chen, Yawen Fan
2021 J jnl
Comput. Math. Appl.
Hanqing Li, Bonan Xu, Hanhui Jin, Haiou Wang, Jianren Fan
2020 conf
BMSB
Hanqing Li, Changyong Pan, Yonglin Xue, Chao Zhang, Hui Yang, Jintao Wang, Jian Song
2019 J jnl
EURASIP J. Wirel. Commun. Netw.
Feng Tian, Hanqing Li, Liangchen Yuan
2017 conf
ICIBE
Yuchung Hsiao, Hanqing Li
2017 conf
BMSB
Hanqing Li, Xia Hai, Guofang Sheng, Ye Guo, Changyong Pan
2013 conf
ISSCC
Benjamin Moss, Chen Sun, Michael Georgas, Jeffrey Shainline, Jason Orcutt, Jonathan C. Leu, Mark T. Wade, Yu-Hsin Chen, Kareem Nammari, Xiaoxi Wang, Hanqing Li, Rajeev J. Ram, Milos A. Popovic, Vladimir Stojanovic
2013 conf
VTC Fall
Hanqing Li, Qing Guo, Tao Tang, Qingzhong Li
2013 conf
VTC Fall
Hanqing Li, Qing Guo, Tao Tang, Qingzhong Li
2013 conf
ICON
Qingzhong Li, Xuemai Gu, Hanqing Li, Min Jia, Wei-dang Lu
2013 B conf
WCNC
Qingzhong Li, Xuemai Gu, Hanqing Li, Tao Tang
2011 conf
LISS (2)
Ran Chen, Yihong Ru, Hanqing Li
2011 conf
ICEIS (2)
Yiming Yang, Yihong Ru, Hanqing Li
2011 conf
ICEIS (3)
Zhenyi Wang, Yihong Ru, Hanqing Li
2009 J jnl
IEEE Micro
Christopher Batten, Ajay Joshi, Jason Orcutt, Anatol Khilo, Benjamin Moss, Charles Holzwarth, Milos A. Popovic, Hanqing Li, Henry I. Smith, Judy L. Hoyt, Franz X. Kärtner, Rajeev J. Ram, Vladimir Stojanovic, Krste Asanovic
2008 conf
Hot Interconnects
Christopher Batten, Ajay Joshi, Jason Orcutt, Anatoly Khilo, Benjamin Moss, Charles Holzwarth, Milos A. Popovic, Hanqing Li, Henry I. Smith, Judy L. Hoyt, Franz X. Kärtner, Rajeev J. Ram, Vladimir Stojanovic, Krste Asanovic
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOExport


class MachOExportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_exports"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_EXPORT.value

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'UInt32', 'Array(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def get_clickhouse_table(self) -> str:
        return "redb_macho_exports"