Hang Geng

33 papers C 2Journal 29Unranked 2
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Wirel. Commun.
Hanmin Sheng, Kai Chen, Wenlong Zeng, Hang Geng, Wenjian Ma, Shafei Wang
2025 J jnl
IEEE Trans. Instrum. Meas.
Xiaoting Tang, Zhen Liu, Yuhang Liang, Yidong Lin, Zhongshan Luo, Yuhua Cheng, Hang Geng
2025 J jnl
Reliab. Eng. Syst. Saf.
Zhiyuan Bu, Bing Long, Zhen Liu, Kunping Wu, Hang Geng, Yuhua Cheng
2025 J jnl
IEEE Trans. Instrum. Meas.
Yuhang Liang, Zhen Liu, Xiaoting Tang, Yuhua Cheng, Hang Geng
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Zixiang Zhou, Xiaoxue Feng, Feng Pan, Hang Geng
2024 J jnl
Inf. Sci.
Hang Geng, Zidong Wang, Jun Hu, Guoping Lu, Qing-Long Han, Yuhua Cheng
2024 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Hang Geng, Zidong Wang, Lifeng Ma, Yuhua Cheng, Qing-Long Han
2024 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Bo Xu, Hang Geng, Leping Jiang, Songting Zou, Kai Chen, Zhen Liu
2023 J jnl
IEEE Trans. Cybern.
Hang Geng, Zidong Wang, Jun Hu, Hongli Dong, Yuhua Cheng
2023 J jnl
Inf. Sci.
Hang Geng, Zidong Wang, Jun Hu, Fuad E. Alsaadi, Yuhua Cheng
2023 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Hang Geng, Zidong Wang, Jun Hu, Qing-Long Han, Yuhua Cheng
2022 J jnl
IEEE Trans. Signal Process.
Hang Geng, Zidong Wang, Alireza Mousavi, Fuad E. Alsaadi, Yuhua Cheng
2022 J jnl
IEEE Trans. Signal Inf. Process. over Networks
Hang Geng, Zidong Wang, Fuad E. Alsaadi, Khalid Hamed Alharbi, Yuhua Cheng
2022 J jnl
IEEE CAA J. Autom. Sinica
Hang Geng, Zidong Wang, Yun Chen, Xiao-jian Yi, Yuhua Cheng
2021 conf
I2MTC
Bo Xu, Kai Chen, Yifan Wang, Hang Geng, Songting Zou, Bo Yu
2021 J jnl
IEEE Trans. Signal Inf. Process. over Networks
Hang Geng, Zidong Wang, Fuad E. Alsaadi, Khalid Hamed Alharbi, Yuhua Cheng
2021 J jnl
IEEE Trans. Signal Process.
Hang Geng, Zidong Wang, Yun Chen, Fuad E. Alsaadi, Yuhua Cheng
2021 J jnl
Int. J. Syst. Sci.
Hang Geng, Hongjian Liu, Lifeng Ma, Xiaojian Yi
2021 J jnl
IEEE Trans. Signal Process.
Hang Geng, Zidong Wang, Lei Zou, Alireza Mousavi, Yuhua Cheng
2021 J jnl
IEEE CAA J. Autom. Sinica
Lei Zou, Zidong Wang, Hang Geng, Xiaohui Liu
2020 J jnl
CoRR
Hang Geng, Mulugeta A. Haile, Huazhen Fang
2020 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Hang Geng, Yan Liang, Yuhua Cheng
2019 J jnl
Signal Process.
Hang Geng, Zidong Wang, Yuhua Cheng, Fuad E. Alsaadi, Abdullah M. Dobaie
2018 J jnl
Inf. Fusion
Hang Geng, Yan Liang, Yurong Liu, Fuad E. Alsaadi
2018 J jnl
IEEE Trans. Signal Process.
Hang Geng, Zidong Wang, Yuhua Cheng
2017 J jnl
Inf. Fusion
Hang Geng, Yan Liang, Feng Yang, Linfeng Xu, Quan Pan
2017 J jnl
Inf. Sci.
Hang Geng, Zidong Wang, Yan Liang, Yuhua Cheng, Fuad E. Alsaadi
2017 J jnl
Signal Process.
Hang Geng, Zidong Wang, Yan Liang, Yuhua Cheng, Fuad E. Alsaadi
2016 conf
ICAC
Hang Geng, Yan Liang, Chuanbo Wen, Yonggang Chen
2016 C conf
FUSION
Hang Geng, Yan Liang, Xiaoxu Wang, Feng Yang, Linfeng Xu, Quan Pan
2016 J jnl
Inf. Fusion
Hang Geng, Yan Liang, Feng Yang, Linfeng Xu, Quan Pan
2015 C conf
FUSION
Hang Geng, Yan Liang, Feng Yang, Linfeng Xu
2014 J jnl
IET Signal Process.
Hang Geng, Yan Liang, Xiaojing Zhang, Feng Yang
redb/extractors/basicproperties.py
← Index redb/extractors/basicproperties.py python
from dataclasses import asdict
import inspect
import os
import magic
from magika import Magika
from datetime import datetime, timezone
from typing import Any, List, Tuple

from redb.extractors.enum import Tag
from redb.models.dataclasses import BasicProperties
from redb.extractors.extractor import Extractor


class BasicPropertiesExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        parent_sha256=None,
        precomputed_hashes=None,
        is_fat=None,
        child_sha256=None,
        child_architecture=None,
        child_filetype=None,
        first_seen=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters=exporters,
            index_prefix=index_prefix,
            elastic_index=elastic_index,
            known_benign=known_benign,
            known_malicious=known_malicious,
            precomputed_hashes=precomputed_hashes,
        )
        self.basic_properties = None
        self.elastic_index = self.index_prefix + "-basic_properties"
        self.is_packed = None
        self.parent_sha256 = parent_sha256  # For FAT Mach-O slices, points to container hash
        self.is_fat = is_fat  # True for FAT Mach-O containers, None otherwise
        self.child_sha256 = child_sha256  # SHA256 hashes of children (FAT slices, zip contents)
        self.child_architecture = child_architecture  # Architecture names for FAT Mach-O slices
        self.child_filetype = child_filetype  # Magika filetypes for children (useful for zip archives)
        self.first_seen = first_seen  # From catalog_samples, None for local files

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

    def _extract_basic_properties(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        filename = None  # Reserved for future use
        sample_name = os.path.basename(self.filepath)
        file_entropy = round(self.calculate_entropy(self.binary), 3)
        type_ = magic.from_buffer(self.binary)
        type_mime = magic.from_buffer(self.binary, mime=True)
        type_magika = Magika().identify_bytes(self.binary).output.label
        size = len(self.binary)
        self.basic_properties = BasicProperties(
            filename, sample_name, size, type_, type_mime, type_magika,
            file_entropy, self.is_packed, self.is_fat, self.child_sha256,
            self.child_architecture, self.child_filetype,
            first_seen=str(self.first_seen) if self.first_seen else None,
        )
        self.log.debug(f"Basic Properties dump: {asdict(self.basic_properties)}")

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_basic_properties()
            # self.export_to_elastic([self.basic_properties])
            return self.basic_properties
        except Exception as e:
            self.log.error(f"Extract basic properties error {self.hash.sha256} Exception: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.basic_properties
        elif exporter_type == "ClickHouseExporter":
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                self.parent_sha256,  # NULL for standalone/FAT, fat_hash for slices
                self.basic_properties.child_sha256 or [],  # SHA256 hashes of children
                self.basic_properties.child_architecture or [],  # Architecture names for FAT slices
                self.basic_properties.child_filetype or [],  # Magika filetypes for children
                self.basic_properties.is_fat,  # True for FAT Mach-O containers, NULL otherwise
                self.basic_properties.filename,
                self.basic_properties.sample_name,
                self.basic_properties.filesize,
                self.basic_properties.file_entropy,
                self.basic_properties.filetype,
                self.basic_properties.filetype_mime,
                self.basic_properties.filetype_magika,
                self.first_seen or datetime(1970, 1, 1, tzinfo=timezone.utc),  # From catalog_samples, epoch zero for local files (uses original datetime, not string)
                datetime.now(timezone.utc)
            ]]

            column_names = [
                'sha256', 'md5', 'sha1', 'parent_sha256', 'child_sha256', 'child_architecture', 'child_filetype',
                'is_fat', 'filename', 'sample_name',
                'filesize', 'file_entropy', 'filetype', 'filetype_mime',
                'filetype_magika', 'first_seen', 'analysis_date'
            ]

            column_type_names = [
                'String', 'String', 'String', 'Nullable(String)',
                'Array(FixedString(64))', 'Array(LowCardinality(String))', 'Array(LowCardinality(String))',
                'Nullable(UInt8)', 'Nullable(String)', 'String',
                'UInt64', 'Float64', 'LowCardinality(String)',
                'LowCardinality(String)', 'LowCardinality(String)',
                'DateTime64(3, \'UTC\')',
                'DateTime64(3, \'UTC\')'
            ]

            return data, column_names, column_type_names

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