Kai-Tai Fang

45 papers C 1Journal 42Unranked 1
YearRankTypeTitle / Venue / Authors
2026 J jnl
Entropy
Kai-Tai Fang, Yongdao Zhou
2025 J jnl
Entropy
Kai-Tai Fang, Yuxuan Lin, Yu-Hui Deng
2025 J jnl
Stat. Comput.
Pingan He, Kai-Tai Fang, Ping He, Huajun Ye
2025 J jnl
Commun. Stat. Simul. Comput.
Yinan Li, Zhihua Sun, Kai-Tai Fang
2025 J jnl
Commun. Stat. Simul. Comput.
Barkahoum Laala, Ahmed M. Elsawah, Gajendra K. Vishwakarma, Kai-Tai Fang
2025 J jnl
Entropy
Wen-Wen Hu, Kai-Tai Fang, Xiao-Ling Peng
2024 J jnl
Commun. Stat. Simul. Comput.
Yinan Li, Kai-Tai Fang
2024 J jnl
Stat. Comput.
Tianyu Yan, Kai-Tai Fang, Hong Yin
2024 J jnl
Commun. Stat. Simul. Comput.
Jianfa Lai, Kai-Tai Fang, Xiaoling Peng, Yuxuan Lin
2024 J jnl
Entropy
Yuxuan Lin, Tian-Yu Yan, Kai-Tai Fang
2024 J jnl
Entropy
Yong-Feng Zhou, Yuxuan Lin, Kai-Tai Fang, Hong Yin
2023 J jnl
Commun. Stat. Simul. Comput.
Ahmed M. Elsawah, Li Meng Hua, Kai-Tai Fang
2023 J jnl
J. Syst. Sci. Complex.
Ahmed M. Elsawah, Gajendra K. Vishwakarma, H. S. Mohamed, Kai-Tai Fang
2023 J jnl
Commun. Stat. Simul. Comput.
Xiao Ke, Kai-Tai Fang, Ahmed M. Elsawah, Yuxuan Lin
2022 J jnl
Comput. Stat. Data Anal.
Jianfa Lai, Lin-Chen Weng, Xiaoling Peng, Kai-Tai Fang
2022 J jnl
J. Multivar. Anal.
Jun Yang, Ping He, Kai-Tai Fang
2021 J jnl
J. Syst. Sci. Complex.
Lin-Chen Weng, Ahmed M. Elsawah, Kai-Tai Fang
2021 J jnl
Commun. Stat. Simul. Comput.
Ahmed M. Elsawah, Kai-Tai Fang, Yuhui Deng
2019 J jnl
Commun. Stat. Simul. Comput.
Zong-Feng Qi, Yong-Dao Zhou, Kai-Tai Fang
2017 J jnl
J. Complex.
Kai-Tai Fang, Xiao Ke, Ahmed M. Elsawah
2016 conf
CISP-BMEI
Weibin Zhong, Yuhui Deng, Kai-Tai Fang
2013 J jnl
Comput. Math. Methods Medicine
Kai-Tai Fang, Gang Li, Xuyang Lu, Hong Qin
2013 J jnl
Comput. Stat.
Yong-Dao Zhou, Kai-Tai Fang
2013 J jnl
J. Complex.
Yong-Dao Zhou, Kai-Tai Fang, Jian-Hui Ning
2012 J jnl
J. Complex.
Yong-Dao Zhou, Kai-Tai Fang, Jian-Hui Ning
2011 ch.
International Encyclopedia of Statistical Science
Kai-Tai Fang
2007 J jnl
J. Complex.
Kai-Tai Fang, Aijun Zhang, Runze Li
2006 J jnl
Math. Comput.
Kai-Tai Fang, Dietmar Maringer, Yu Tang, Peter Winker
2005 J jnl
J. Complex.
Kai-Tai Fang, Yu Tang, Jianxing Yin
2004 J jnl
Math. Comput.
Kai-Tai Fang, Gennian Ge
2004 J jnl
Discret. Math.
Kai-Tai Fang, Gennian Ge, Min-Qian Liu, Hong Qin
2004 J jnl
Discret. Math.
Kai-Tai Fang, Xuan Lu, Yu Tang, Jianxing Yin
2004 J jnl
J. Chem. Inf. Model.
Kai-Tai Fang, Hong Yin, Yi-Zeng Liang
2004 J jnl
Technometrics
Kai-Tai Fang, Rahul Mukerjee
2004 J jnl
J. Chem. Inf. Model.
Qian-Nan Hu, Yi-Zeng Liang, Xiao-Ling Peng, Hong Yin, Kai-Tai Fang
2004 J jnl
J. Chem. Inf. Model.
Qian-Nan Hu, Yi-Zeng Liang, Hong Yin, Xiao-Ling Peng, Kai-Tai Fang
2003 J jnl
J. Chem. Inf. Comput. Sci.
Qian-Nan Hu, Yi-Zeng Liang, Ya-Li Wang, Cheng-Jian Xu, Zhong-Da Zeng, Kai-Tai Fang, Xiao-Ling Peng, Hong Yin
2003 J jnl
J. Complex.
Kai-Tai Fang, Xuan Lu, Peter Winker
2003 C conf
IDEAL
Aijun Zhang, Zhi-Li Wu, Chun Hung Li, Kai-Tai Fang
2003 J jnl
J. Complex.
Xiaoqun Wang, Kai-Tai Fang
2002 J jnl
Math. Comput.
Kai-Tai Fang, Chang-Xing Ma, Peter Winker
2001 J jnl
J. Complex.
Chang-Xing Ma, Kai-Tai Fang, Dennis K. J. Lin
2001 J jnl
Math. Comput.
Jia-Juan Liang, Kai-Tai Fang, Fred J. Hickernell, Runze Li
2001 J jnl
J. Complex.
Kai-Tai Fang, Chang-Xing Ma
2000 J jnl
Technometrics
Kai-Tai Fang, Dennis K. J. Lin, Peter Winker, Yong Zhang
redb/extractors/pe_extractors/pe_resources.py
← Index redb/extractors/pe_extractors/pe_resources.py python
from hashlib import sha256
import inspect
from datetime import datetime, timezone
from typing import Any

import magic
from magika import Magika
import pefile
from pefile import UnicodeStringWrapperPostProcessor

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PEResource


class PEResourceExtractor(PEExtractor):

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

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

    def _extract_resources(self):
        """
        Returns:
        resources: a list of dictionaries, one per each resources type found.
                    each dictionary the key represents the name of the content,
                    which is the value itself.
                    Empty list if no resources present.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        resources_list = []
        try:
            if hasattr(self.pe, "DIRECTORY_ENTRY_RESOURCE"):
                for resource_type in self.pe.DIRECTORY_ENTRY_RESOURCE.entries:
                    # if resource_type.name is not None:
                    #     name = resource_type.name
                    # else:
                    #     name = pefile.RESOURCE_TYPE.get(resource_type.struct.Id)
                    # if not name:
                    #     name = resource_type.struct.Id
                    name = (
                        resource_type.name
                        if resource_type.name is not None
                        else pefile.RESOURCE_TYPE.get(resource_type.struct.Id)
                    )
                    if isinstance(name, UnicodeStringWrapperPostProcessor):
                        name = name.decode()
                    try:
                        if hasattr(resource_type, "directory"):
                            for resource_id in resource_type.directory.entries:
                                if hasattr(resource_id, "directory"):
                                    for resource_lang in resource_id.directory.entries:
                                        rsrc_data = self.pe.get_data(
                                            resource_lang.data.struct.OffsetToData,
                                            resource_lang.data.struct.Size,
                                        )
                                        file_type = magic.from_buffer(rsrc_data)
                                        magik = Magika().identify_bytes(rsrc_data).output.label

                                        rsrc_entropy = (
                                            "%.2f"
                                            % pefile.SectionStructure.entropy_H(
                                                self.pe, rsrc_data
                                            )
                                        )
                                        rsrc_sha256 = sha256(rsrc_data).hexdigest()
                                        lang = pefile.LANG.get(
                                            resource_lang.data.lang, "*unknown*"
                                        )
                                        sublang = pefile.get_sublang_name_for_lang(
                                            resource_lang.data.lang,
                                            resource_lang.data.sublang,
                                        )
                                        pe_resource = PEResource(
                                            _id=rsrc_sha256,
                                            resource_type=name,
                                            resource_entropy=rsrc_entropy,
                                            resource_sha256=rsrc_sha256,
                                            resource_filetype=file_type,
                                            resource_magika=magik,
                                            resource_language=lang,
                                            resource_rva=resource_lang.data.struct.OffsetToData,
                                            resource_size=resource_lang.data.struct.Size,
                                            resource_sub_lang=sublang,
                                        )
                                        resources_list.append(pe_resource)
                    except Exception as e:
                        self.log.warning(
                            f"Continue after Error in {self.hash.sha256}: {resource_type.name} "
                            f"Exception: {e}",
                            stack_info=True,
                        )
                        # resources_list.append({f"{e} - {resource_type.name}"})
                        continue
        except Exception as e:
            self.log.exception(
                f"Extract exports error {self.hash.sha256} Exception: {e}"
            )
        self.log.debug(f"Resource list {resources_list}")
        return resources_list

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            resources = self._extract_resources()
            # self.export_to_elastic(resources)  # Let the exporters handle this
            return resources
        except Exception as e:
            self.log.error(f"Extract resources error {self.hash.sha256} Exception: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            resources = self.extract()
            if resources is None:
                return None
            
            data = []
            current_time = datetime.now(timezone.utc)
            
            for resource in resources:
                data.append([
                    self.sha256,                    # sha256
                    self.md5,                       # md5
                    self.sha1,                      # sha1
                    resource.resource_type,         # resource_type
                    resource.resource_entropy,      # resource_entropy
                    resource.resource_sha256,       # resource_sha256
                    resource.resource_filetype,     # resource_filetype
                    resource.resource_magika,       # resource_magika
                    resource.resource_language,     # resource_language
                    resource.resource_sub_lang,     # resource_sub_lang
                    resource.resource_size,         # resource_size
                    resource.resource_rva,          # resource_rva
                    current_time                    # analysis_date
                ])
            
            column_names = [
                'sha256', 'md5', 'sha1', 'resource_type', 'resource_entropy',
                'resource_sha256', 'resource_filetype', 'resource_magika',
                'resource_language', 'resource_sub_lang', 'resource_size',
                'resource_rva', 'analysis_date'
            ]
            
            if not data:
                return None

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

            return (data, column_names, column_type_names)

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