Haiyang Yu

81 papers A* 3B 3C 1Journal 49Unranked 25
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. Chem. Inf. Model.
Mengxia Mo, Haiyang Yu, Chengkun Wu, Zhijian Xu, Jie Liu, Wei-qing Huang, Leyun Wu, Can Leng, Wangdong Yang, Kenli Li
2026 J jnl
CoRR
Guibin Zhang, Haiyang Yu, Kaiming Yang, Bingli Wu, Fei Huang, Yongbin Li, Shuicheng Yan
2026 J jnl
Comput. Networks
Qiong Li, Chunyi Chen, Bo Yu, Haiyang Yu
2026 J jnl
Comput. Vis. Image Underst.
Xingli Zhang, Yameng Liu, Haiyang Yu, Zhihui Wang
2026 J jnl
CoRR
Ruoran Li, Xinghua Zhang, Haiyang Yu, Shitong Duan, Xiang Li, Wenxin Xiang, Chonghua Liao, Xudong Guo, Yongbin Li, Jinli Suo
2025 J jnl
IEEE Trans. Instrum. Meas.
Zeyuan Song, Rui Peng, Haiyang Yu, Guanqiu Guo, Kaiwei Li, Wenchao Zhou, Yihui Wu
2025 conf
KDD (1)
Haiyang Yu, Tian Xie, Jiaping Gui, Pengyang Wang, Pengzhou Cheng, Ping Yi, Yue Wu
2025 J jnl
BMC Medical Imaging
Xinping Yu, Zidong Zhang, Yuwei Zou, Chang Wang, Jinwen Jiao, Chengjian Wang, Haiyang Yu, Shuai Zhang
2025 J jnl
CoRR
Haiyang Yu, Meng-Chieh Lee, Xiang Song, Qi Zhu, Christos Faloutsos
2025 B conf
IWQoS
Bo Zhang, Haiyang Yu, Yuwen Chen, Zhen Yang
2025 B conf
IJCNN
Han Lin Tun, Haiyang Yu, Tian Xie, Ping Yi
2025 A* conf
ICLR
Karish Grover, Haiyang Yu, Xiang Song, Qi Zhu, Han Xie, Vassilis N. Ioannidis, Christos Faloutsos
2025 J jnl
CoRR
Karish Grover, Haiyang Yu, Xiang Song, Qi Zhu, Han Xie, Vassilis N. Ioannidis, Christos Faloutsos
2025 J jnl
IET Image Process.
Yu Fan, Chunyi Chen, Xiaojuan Hu, Yanfeng Li, Haiyang Yu, Ripei Zhang, Luguang Han
2024 J jnl
PeerJ Comput. Sci.
Xiaojuan Hu, Jinxin Bai, Chunyi Chen, Haiyang Yu
2024 J jnl
Sensors
Xuefu Sui, Qunbo Lv, Changjun Ke, Mingshan Li, Mingjin Zhuang, Haiyang Yu, Zheng Tan
2024 J jnl
CoRR
Haiyang Yu, Tian Xie, Jiaping Gui, Pengyang Wang, Ping Yi, Yue Wu
2024 J jnl
IEEE Trans. Learn. Technol.
Haiyang Yu, Entai Wang, Qi Lang, Jianan Wang
2024 conf
ClinicalNLP@NAACL
Ibtihel Amara, Haiyang Yu, Fan Zhang, Yuchen Liu, Benny Li, Chang Liu, Rupesh Kartha, Akshay Goel
2024 A* conf
ICLR
Meng-Chieh Lee, Haiyang Yu, Jian Zhang, Vassilis N. Ioannidis, Xiang Song, Soji Adeshina, Da Zheng, Christos Faloutsos
2024 J jnl
CoRR
Meng-Chieh Lee, Haiyang Yu, Jian Zhang, Vassilis N. Ioannidis, Xiang Song, Soji Adeshina, Da Zheng, Christos Faloutsos
2024 B conf
IJCNN
Haoyu Jiang, Haiyang Yu, Nan Li, Ping Yi
2024 J jnl
J. Adv. Comput. Intell. Intell. Informatics
Zhiheng Dai, Xiaojuan Hu, Chunyi Chen, Haiyang Yu
2024 J jnl
Vis. Comput.
Zhongye Shen, Chunyi Chen, Ripei Zhang, Haiyang Yu, Ling Li
2024 J jnl
CoRR
Nan Li, Haiyang Yu, Ping Yi
2024 J jnl
Ad Hoc Networks
Gang Pan, Chunyi Chen, Haifeng Yao, Xiaolong Ni, Xiaojuan Hu, Haiyang Yu, Qiong Li
2024 conf
SemEval@NAACL
Jianjian Li, Shengwei Liang, Yong Liao, Hongping Deng, Haiyang Yu
2024 J jnl
CoRR
Jianjian Li, Shengwei Liang, Yong Liao, Hongping Deng, Haiyang Yu
2023 conf
iThings/GreenCom/CPSCom/SmartData/Cybermatics
Zhenyu Li, Rui Zhang, Shutian Zhou, Haiyang Yu, Feng Hong
2023 J jnl
Sensors
Haiyang Yu, Chunyi Chen, Xiaojuan Hu, Huamin Yang
2023 J jnl
Int. J. Digit. Earth
Pengao Li, Haiyang Yu, Peng Zhou, Ping Zhang, Ruili Wang
2023 J jnl
J. Vis.
Haiyang Yu, Donglai Gao, Wenli Chen, Zhi Deng
2023 conf
iThings/GreenCom/CPSCom/SmartData/Cybermatics
Rui Zhang, Zhenyu Li, Shutian Zhou, Haiyang Yu, Feng Hong
2023 J jnl
Remote. Sens.
Haiyang Yu, Saifei Xie, Peng Liu, Zhihua Hua, Caoyuan Song, Peng Jing
2023 J jnl
CoRR
Haoyu Jiang, Haiyang Yu, Nan Li, Ping Yi
2023 J jnl
J. Vis.
Yize Ran, Zhi Deng, Haiyang Yu, Wenli Chen, Donglai Gao
2023 J jnl
IEEE Access
Peng Jing, Haiyang Yu, Zhihua Hua, Saifei Xie, Caoyuan Song
2023 J jnl
Remote. Sens.
Ping Zhang, Haiyang Yu, Pengao Li, Ruili Wang
2022 J jnl
IEEE Access
Lili Yu, Haiyang Yu, Shuai Yang
2022 A* conf
KDD
Jack FitzGerald, Shankar Ananthakrishnan, Konstantine Arkoudas, Davide Bernardi, Abhishek Bhagia, Claudio Delli Bovi, Jin Cao, Rakesh Chada, Amit Chauhan, Luoxin Chen, Anurag Dwarakanath, Satyam Dwivedi, Turan Gojayev, Karthik Gopalakrishnan, Thomas Gueudré, Dilek Hakkani-Tur, Wael Hamza, Jonathan J. Hüser, Kevin Martin Jose, Haidar Khan, Beiye Liu, Jianhua Lu, Alessandro Manzotti, Pradeep Natarajan, Karolina Owczarzak, Gokmen Oz, Enrico Palumbo, Charith Peris, Chandana Satya Prakash, Stephen Rawls, Andy Rosenbaum, Anjali Shenoy, Saleh Soltan, Mukund Harakere Sridhar, Lizhen Tan, Fabian Triefenbach, Pan Wei, Haiyang Yu, Shuai Zheng, Gökhan Tür, Prem Natarajan
2022 J jnl
CoRR
Jack FitzGerald, Shankar Ananthakrishnan, Konstantine Arkoudas, Davide Bernardi, Abhishek Bhagia, Claudio Delli Bovi, Jin Cao, Rakesh Chada, Amit Chauhan, Luoxin Chen, Anurag Dwarakanath, Satyam Dwivedi, Turan Gojayev, Karthik Gopalakrishnan, Thomas Gueudré, Dilek Hakkani-Tur, Wael Hamza, Jonathan J. Hüser, Kevin Martin Jose, Haidar Khan, Beiye Liu, Jianhua Lu, Alessandro Manzotti, Pradeep Natarajan, Karolina Owczarzak, Gokmen Oz, Enrico Palumbo, Charith Peris, Chandana Satya Prakash, Stephen Rawls, Andy Rosenbaum, Anjali Shenoy, Saleh Soltan, Mukund Harakere Sridhar, Liz Tan, Fabian Triefenbach, Pan Wei, Haiyang Yu, Shuai Zheng, Gökhan Tür, Prem Natarajan
2022 conf
DSC
Fashan Dong, Binyue Deng, Haiyang Yu, Wenrong Xie, Huawei Xu, Zhaoquan Gu
2022 J jnl
IEEE Trans. Learn. Technol.
Minjuan Wang, Haiyang Yu, Zerla Bell, Xiaoyan Chu
2022 conf
ICTA
Haiyang Yu, C. R. Kao
2022 J jnl
Comput. Secur.
Weicheng Qiu, Yinghua Ma, Xiuzhen Chen, Haiyang Yu, Lixing Chen
2022 conf
CCIS
Chen Guo, Yang Lin, Hao Chen, Haiyang Yu, Chengwei Zhu, Lejun Zhang, Jing Qiu
2022 conf
DSC
Chen Guo, Tianxiu Wang, Yang Lin, Hao Chen, Haiyang Yu, Chengwei Zhu, Jing Qiu
2022 J jnl
Comput. Methods Programs Biomed.
Zhisheng Yan, Yujing Su, Haixia Sun, Haiyang Yu, Wanteng Ma, Honghui Chi, Huihui Cao, Qing Chang
2022 J jnl
Comput. Methods Programs Biomed.
Zhongzhi Jia, Junhao Mei, Wei Ding, Xi Zhao, Wen Gong, Haiyang Yu, Lihao Qin, Zeyu Piao, Wenhua Chen, Liming Tang
2022 J jnl
Neuromorph. Comput. Eng.
Hao Huang, Lu Liu, Chengpeng Jiang, Jiangdong Gong, Yao Ni, Zhipeng Xu, Huanhuan Wei, Haiyang Yu, Wentao Xu
2021 conf
DSC
Haiyang Yu, Fashan Dong, Jianming Li, Wenrong Xie, Jing Qiu, Zhaoquan Gu
2021 conf
ICPS
Haiyang Yu, Xin Wang, Weichao Sun
2021 conf
DSC
Wenrong Xie, Fashan Dong, Haiyang Yu, Zhaoquan Gu, Le Wang, Zhihong Tian
2021 conf
DSC
Jianming Li, Ling Zhou, Jie Ding, Haiyang Yu
2020 J jnl
IEEE Access
Tao Lin, Haiyang Yu, Shanghong Zhao, Jian Guo Liu, Kun Zhang, Wei Jiang, Guodong Wang, He Li, Xuan Li
2020 J jnl
Adv. Intell. Syst.
Hong Han, Zhipeng Xu, Kexin Guo, Yao Ni, Mingxue Ma, Haiyang Yu, Huanhuan Wei, Jiangdong Gong, Shuo Zhang, Wentao Xu
2020 J jnl
Neural Process. Lett.
Haiyang Yu, Chunyi Chen, Huamin Yang
2019 J jnl
Neural Process. Lett.
Haiyang Yu, Xiaoying Sun, Jian Wang
2019 conf
IEEE BigData
Pengcheng Xie, Hui Li, Haiyang Yu, Zequan Chen
2019 J jnl
Appl. Intell.
Haiyang Yu, Xiaoying Sun, Jian Wang
2019 J jnl
IEEE Trans. Comput. Soc. Syst.
Yunpeng Xiao, Haiyang Yu, Qian Li, Ling Liu, Ming Xu, Hanchun Xiao
2019 J jnl
Medical Biol. Eng. Comput.
Zhi Li, Shanshan Gao, Hongyu Chen, Ruiyang Ma, Tingting Wu, Haiyang Yu
2019 J jnl
Intell. Data Anal.
Haiyang Yu, Xiaoying Sun, Xuezhi Yan
2019 J jnl
Signal Image Video Process.
Haiyang Yu, Jian Wang, Xiaoying Sun
2018 J jnl
Mob. Networks Appl.
Jin Zhang, Weilai Liu, Wenjian Zhao, Xuan Ma, Haocong Xu, Xiaoli Gong, Chengcheng Liu, Haiyang Yu
2018 J jnl
Sensors
Haiyang Yu, Rubo Zhang, Junwei Wu, Xiuwen Li
2018 conf
ICCC Workshops
Jaeho Choi, Wei Duan, Haiyang Yu, Jinjuan Ju
2017 J jnl
Int. J. Fuzzy Syst.
Shuhuan Wen, Haiyang Yu, Baowei Zhang, Yongsheng Zhao, Hak-Keung Lam, Guiqian Qin, Hongrui Wang
2016 J jnl
EURASIP J. Wirel. Commun. Netw.
Wei Duan, Yier Yan, Han Hai, Xueqin Jiang, Haiyang Yu, Moon Ho Lee
2016 conf
ICITE
Haiyang Yu, Yawen Hu, Hongyu Guo, Lin Fang
2015 J jnl
IEICE Trans. Inf. Syst.
Xiaoli Gong, Yanjun Liu, Yang Jiao, Baoji Wang, Jianchao Zhou, Haiyang Yu
2015 C conf
ICMV
Haiyang Yu, Jaeho Choi
2014 conf
DASFAA (2)
Chen Lin, Haiyang Yu, Wei Weng, Xianmang He
2014 conf
3PGCIC
Jie Ma, Haiyang Yu, Xiaoli Gong, Xiaoyu Zhang
2012 conf
ICNSC
Chunshui Jiang, Haiyang Yu, Zubair Anwar
2011 conf
ICDIP
Haiyang Yu, Qiang Yin, Wei Yang, Hao Xian, Qiao Sun, Jun Liu
2011 conf
ICAIC (2)
Ye Fei, Tianen Zhu, Haiyang Yu
2011 conf
ICDIP
Qiang Yin, Haiyang Yu, Xingling Shao, Zhengyan Wang, Wei Yang, Wendong Zhang
2010 conf
Geoinformatics
Gang Cheng, Xiaoping Lu, Xiaosan Ge, Haiyang Yu, Yupeng Wang, Xiaotian Ge
2010 conf
Geoinformatics
Haiyang Yu, Xiaoping Lu, Xiaosan Ge, Gang Cheng
2008 conf
BMEI (2)
Zhenbing Cai, Minhao Zhu, Haiyang Yu
redb/extractors/pe_extractors/pe_dotnet.py
← Index redb/extractors/pe_extractors/pe_dotnet.py python
import inspect
import pefile
from dotnetfile import DotNetPE

import base64
from hashlib import md5
from pprint import pprint

import magic
import pefile

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PEDotNet
from datetime import datetime, timezone
import json
from typing import Any


class PEDotNetExtractor(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.pe_features = None
        self.elastic_index = self.index_prefix + "-pe_dotnet"
        self.dotnet, self.error = self._generate_dotnetfile_object()
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _decode_assembly_flags(self, flag_value):
        self.log.debug(inspect.currentframe().f_code.co_name)
        ASSEMBLY_FLAGS = {
            0x00000001: "COMIMAGE_FLAGS_ILONLY",
            0x00000002: "COMIMAGE_FLAGS_32BITREQUIRED",
            0x00000004: "COMIMAGE_FLAGS_IL_LIBRARY",
            0x00000008: "COMIMAGE_FLAGS_STRONGNAMESIGNED",
            0x00000010: "COMIMAGE_FLAGS_NATIVE_ENTRYPOINT",
            0x00010000: "COMIMAGE_FLAGS_TRACKDEBUGDATA",
            0x00020000: "COMIMAGE_FLAGS_32BITPREFERRED",
        }
        flags = []
        for bit, name in ASSEMBLY_FLAGS.items():
            if flag_value & bit:
                flags.append(name)
        return flags

    def _normalize_data(self, data):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if isinstance(data, str):
            return {"value": data}
        return data

    def _compute_md5(self, data):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if isinstance(data, str):
            # If it's a string, encode it to first
            return md5(data.encode("raw_unicode_escape")).hexdigest()
        elif not isinstance(data, bytes):
            # If it's neither string nor bytes, convert it to string and then to bytes
            return md5(str(data).encode("raw_unicode_escape")).hexdigest()
        else:
            return md5(data).hexdigest()

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

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        metadata = {}

        if self.error:
            metadata["Corrupted"] = self.error.args[0]
            dotnet = PEDotNet(metadata)
            self.dotnet = dotnet  # Store for later use in prepare_export_data
            return dotnet  # Return the extracted data instead of exporting directly

        metadata["info"] = {}
        try:
            available_tables = self.dotnet.existent_metadata_tables()
        except Exception as e:
            self.log.error(f"Error getting metadata tables for {self.hash.sha256}: {e}")
            available_tables = []
            metadata["info"]["PotentiallyCorrupted"] = True

        # GUID extraction
        try:
            input_string = self.dotnet.guid_stream_guids[0].string_representation
            
            formatted_uuid = (
                f"{input_string[6:8]}{input_string[4:6]}{input_string[2:4]}{input_string[0:2]}"
                f"-{input_string[10:12]}{input_string[8:10]}"
                f"-{input_string[14:16]}{input_string[12:14]}"
                f"-{input_string[16:20]}"
                f"-{input_string[20:]}"
            )
            metadata["info"]["ModuleVersionID"] = formatted_uuid
        except Exception as e:
            self.log.error(f"Error extracting GUID for {self.hash.sha256}: {e}")

        # CLR Version
        try:
            metadata["info"]["CLRversion"] = self.dotnet.get_runtime_target_version()
        except Exception as e:
            self.log.error(f"Error getting CLR version for {self.hash.sha256}: {e}")

        # Module information
        try:
            if self.dotnet.metadata_table_exists("Module"):
                metadata["info"]["AssemblyModuleName"] = self.dotnet.Module.get_module_name()
        except Exception as e:
            self.log.error(f"Error getting module info for {self.hash.sha256}: {e}")

        # Basic properties
        try:
            metadata["info"].update({
                "IsNativeNgenImage": self.dotnet.is_native_image(),
                "IsMixedAssembly": self.dotnet.is_mixed_assembly(),
                "IsWindowsFormsApp": self.dotnet.is_windows_forms_app(),
                "EntryPointToken": self.dotnet.clr_header.EntryPointToken.value,
                "HasNativeEntryPoint": self.dotnet.has_native_entry_point(),
            })
        except Exception as e:
            self.log.error(f"Error getting basic properties for {self.hash.sha256}: {e}")

        # Assembly flags
        try:
            metadata["info"]["AssemblyFlags"] = self._decode_assembly_flags(
                self.dotnet.clr_header.Flags.value
            )
        except Exception as e:
            self.log.error(f"Error getting assembly flags for {self.hash.sha256}: {e}")

        # More Metadata/Info CLR Header
        try:
            metadata["info"]["NumOfStreams"] = self.dotnet.get_number_of_streams()
            # [TODO] The following two on VT are "RVA entry point"
            #  and "Resources va" respectively. To verify.
            metadata["info"][
                "ResourcesDirectoryAddress"
            ] = self.dotnet.clr_header.ResourcesDirectoryAddress.value
            metadata["info"][
                "ResourcesDirectorySize"
            ] = self.dotnet.clr_header.ResourcesDirectorySize.value
            metadata["info"][
                "StrongNameSignatureAddress"
            ] = self.dotnet.clr_header.StrongNameSignatureAddress.value
            metadata["info"][
                "StrongNameSignatureSize"
            ] = self.dotnet.clr_header.StrongNameSignatureSize.value
            metadata["info"][
                "CodeManagerTableAddress"
            ] = self.dotnet.clr_header.CodeManagerTableAddress.value
            metadata["info"][
                "CodeManagerTableSize"
            ] = self.dotnet.clr_header.CodeManagerTableSize.value
            metadata["info"][
                "VTableFixupsAddress"
            ] = self.dotnet.clr_header.VTableFixupsAddress.value
            metadata["info"][
                "VTableFixupsSize"
            ] = self.dotnet.clr_header.VTableFixupsSize.value
            metadata["info"][
                "ExportAddressTableJumpsAddress"
            ] = self.dotnet.clr_header.ExportAddressTableJumpsAddress.value
            metadata["info"][
                "ExportAddressTableJumpsSize"
            ] = self.dotnet.clr_header.ExportAddressTableJumpsSize.value
            metadata["info"][
                "ManagedNativeHeaderAddress"
            ] = self.dotnet.clr_header.ManagedNativeHeaderAddress.value
            metadata["info"][
                "ManagedNativeHeaderSize"
            ] = self.dotnet.clr_header.ManagedNativeHeaderSize.value
        except Exception as e:
            self.log.error(f"Error getting more metadata/info clr header for {self.hash.sha256}: {e}")

        # Streams section
        try:
            metadata["Streams"] = {}
            stream_names = self.dotnet.get_stream_names()
            for name in stream_names:
                indx = stream_names.index(name)
                stream_header = self.dotnet.dotnet_stream_headers[indx]
                stream_address = self.dotnet.dotnet_streams[indx].address
                metadata["Streams"][name] = {}
                metadata["Streams"][name]["raw_name"] = base64.b64encode(
                    stream_header.Name.value
                ).decode()
                # metadata["Streams"][name]["raw_name"] = name
                metadata["Streams"][name]["size"] = stream_header.Size.value
                # Retrieve the stream data directly using the given address and size
                stream_data = self.pe.get_data(stream_address, stream_header.Size.value)
                metadata["Streams"][name]["entropy"] = (
                    "%.2f" % pefile.SectionStructure.entropy_H(self.pe, stream_data)
                )
                metadata["Streams"][name]["md5"] = md5(stream_data).hexdigest()
        except Exception as e:
            self.log.error(f"Error getting streams for {self.hash.sha256}: {e}")

        # ManifestResource
        try:
            metadata["ManifestResource"] = ()
            if "ManifestResource" in available_tables:
                metadata["info"]["HasManifestResource"] = True
                metadata["ManifestResource"] = (
                    self.dotnet.ManifestResource.get_resource_names()
                )
        except Exception as e:
            self.log.error(f"Error getting manifest resource for {self.hash.sha256}: {e}")

        # ExternalAssemblyRef
        try:
            metadata["ExternalAssemblyRef"] = {}
            if "AssemblyRef" in available_tables:
                metadata["ExternalAssemblyRef"][
                    "names"
                ] = self.dotnet.AssemblyRef.get_assemblyref_names()
                metadata["ExternalAssemblyRef"][
                    "cultures"
                ] = self.dotnet.AssemblyRef.get_assemblyref_cultures()
        except Exception as e:
            self.log.error(f"Error getting external assembly ref for {self.hash.sha256}: {e}")

        # AssemblyData
        try:
            metadata["AssemblyData"] = {}
            if "Assembly" in available_tables:
                metadata["AssemblyData"][
                    "name"
                ] = self.dotnet.Assembly.get_assembly_name()
                # It's officially a one-row table, but there are ITW files with more than one row.
                # It stores information about the current assembly. It is documented in ECMA-335.
                assembly_table = self.dotnet.metadata_tables_lookup[
                    "Assembly"
                ].table_rows[0]
                metadata["AssemblyData"][
                    "MajorVersion"
                ] = assembly_table.MajorVersion.value
                metadata["AssemblyData"][
                    "MinorVersion"
                ] = assembly_table.MinorVersion.value
                metadata["AssemblyData"]["hashalgid"] = assembly_table.HashAlgId.value
                metadata["AssemblyData"][
                    "BuildNumber"
                ] = assembly_table.BuildNumber.value
                metadata["AssemblyData"][
                    "RevisionNumber"
                ] = assembly_table.RevisionNumber.value
                metadata["AssemblyData"][
                    "culture"
                ] = self.dotnet.Assembly.get_assembly_culture()
        except Exception as e:
            self.log.error(f"Error getting assembly data for {self.hash.sha256}: {e}")

        # TypeDef handling
        try:
            metadata["TypeDef"] = {}
            if "TypeDef" in available_tables:
                metadata["info"]["HasTypeDef"] = True
                # Get basic type definitions
                try:
                    # Get all types (ANY visibility)
                    type_defs = self.dotnet.TypeDef.get_type_names()
                    metadata["TypeDef"]["names"] = type_defs if type_defs else []
                    
                    # Get detailed type information with methods
                    types_with_methods = self.dotnet.TypeDef.get_type_names_with_methods()
                    if types_with_methods:
                        metadata["TypeDef"]["detailed"] = []
                        for type_info in types_with_methods:
                            type_data = {
                                "type": type_info.Type,
                                "namespace": type_info.Namespace,
                                "flags": type_info.Flags,
                                "methods": []
                            }
                            for method in type_info.Methods:
                                method_data = {
                                    "name": method.Name,
                                    "flags": method.Flags
                                }
                                if method.Signature:
                                    method_data["signature"] = {
                                        "parameters": method.Signature.get("parameter", []),
                                        "return_type": method.Signature.get("return", ""),
                                        "has_this": method.Signature.get("hasthis", False)
                                    }
                                type_data["methods"].append(method_data)
                            metadata["TypeDef"]["detailed"].append(type_data)
                except AttributeError as e:
                    self.log.warning(f"TypeDef table exists but attributes missing for {self.hash.sha256}: {e}")
                    # metadata["info"]["TypeDefParsingError"] = f"Missing attributes: {str(e)}"
                except Exception as e:
                    self.log.error(f"Error parsing TypeDef table for {self.hash.sha256}: {e}")
                    # metadata["info"]["TypeDefParsingError"] = str(e)
        except Exception as e:
            self.log.error(f"Error handling TypeDef section for {self.hash.sha256}: {e}")
            metadata["TypeDef"] = {"names": [], "detailed": []}
            # metadata["info"]["TypeDefParsingError"] = str(e)

        # ExternalUnmanagedModules
        try:
            metadata["ExternalUnmanagedModules"] = ()
            if "ModuleRef" in available_tables:
                metadata["info"]["HasModuleRef"] = True
                metadata["ExternalUnmanagedModules"] = (
                    self.dotnet.ModuleRef.get_unmanaged_module_names(
                        self.dotnet.Type.UnmanagedModules.RAW
                    )
                )
        except Exception as e:
            self.log.error(f"Error getting external unmanaged modules for {self.hash.sha256}: {e}")

        # ExternalUnmanagedMethods
        try:
            metadata["ExternalUnmanagedMethods"] = ()
            if "ImplMap" in available_tables:
                metadata["info"]["HasImplMap"] = True
                metadata["ExternalUnmanagedMethods"] = (
                    self.dotnet.ImplMap.get_unmanaged_functions()
                )
        except Exception as e:
            self.log.error(f"Error getting external unmanaged methods for {self.hash.sha256}: {e}")

        # Event
        try:
            metadata["Event"] = ()
            if "Event" in available_tables:
                metadata["info"]["HasEvent"] = True
                metadata["Event"] = self.dotnet.Event.get_event_names()
        except Exception as e:
            self.log.error(f"Error getting event for {self.hash.sha256}: {e}")

        # Resources
        try:
            metadata["Resources"] = []
            if self.dotnet.has_resources():
                tmp_resources_list = []
                resource_data = self.dotnet.get_resources()
                for data in resource_data:
                    tmp_dict = {}
                    for resource_item in data.items():
                        if resource_item[0] == "SubResources":
                            if resource_item[1]:
                                tmp_dict["SubResources"] = {}
                                for sub_resource in resource_item[1]:
                                    for sub_resource_item in sub_resource.items():
                                        if sub_resource_item[0] == "Data":
                                            # Check if data is a sequence type that supports len()
                                            if hasattr(sub_resource_item[1], '__len__') and len(sub_resource_item[1]) > 100:
                                                tmp_dict["SubResources"]["Data"] = {}
                                                try:
                                                    # tmp_dict["SubResources"]["Data"][
                                                    #     "md5"
                                                    # ] = md5(
                                                    #     sub_resource_item[1].encode()
                                                    # ).hexdigest()
                                                    tmp_dict["SubResources"]["Data"][
                                                        "md5"
                                                    ] = self._compute_md5(
                                                        sub_resource_item[1]
                                                    )
                                                except Exception as e:
                                                    self.log.error(
                                                        f"Error in dotnet resources"
                                                        f" extraction {self.hash.sha256}: {e}"
                                                    )
                                                guess = magic.from_buffer(
                                                    sub_resource_item[1], mime=True
                                                )
                                                tmp_dict["SubResources"]["Data"][
                                                    "MimeType"
                                                ] = (guess if guess else None)
                                            else:
                                                normalized_data = self._normalize_data(
                                                    sub_resource_item[1].decode()
                                                    if isinstance(
                                                        sub_resource_item[1], bytes
                                                    )
                                                    else sub_resource_item[1]
                                                )
                                                tmp_dict["SubResources"][
                                                    sub_resource_item[0]
                                                ] = normalized_data
                                        else:
                                            tmp_dict["SubResources"][
                                                sub_resource_item[0]
                                            ] = (
                                                sub_resource_item[1].decode()
                                                if isinstance(
                                                    sub_resource_item[1], bytes
                                                )
                                                else sub_resource_item[1]
                                            )
                        elif resource_item[0] == "Data":
                            # Check if data is a sequence type that supports len()
                            if hasattr(resource_item[1], '__len__') and len(resource_item[1]) > 100:
                                tmp_dict["Data"] = {}
                                tmp_dict["Data"]["md5"] = self._compute_md5(
                                    resource_item[1]
                                )
                                guess = magic.from_buffer(resource_item[1], mime=True)
                                tmp_dict["Data"]["MimeType"] = guess if guess else None
                            else:
                                normalized_data = self._normalize_data(
                                    resource_item[1].decode()
                                    if isinstance(resource_item[1], bytes)
                                    else resource_item[1]
                                )
                                tmp_dict["Data"] = normalized_data
                        else:
                            tmp_dict[resource_item[0]] = (
                                resource_item[1].decode()
                                if isinstance(resource_item[1], bytes)
                                else resource_item[1]
                            )
                    tmp_resources_list.append(tmp_dict)
                metadata["Resources"] = tmp_resources_list
        except Exception as e:
            self.log.error(f"Error getting resources for {self.hash.sha256}: {e}")
            metadata["Resources"] = []  # Ensure we always have a valid list even on error

        dotnet = PEDotNet(metadata)
        self.dotnet = dotnet  # Store for later use in prepare_export_data
        return dotnet  # Return the extracted data instead of exporting directly


    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.dotnet
        elif exporter_type == "ClickHouseExporter":
            # Convert metadata to JSON string
            metadata_json = json.dumps(self.dotnet.dotnet)
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                metadata_json,
                datetime.now(timezone.utc)
            ]]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'dotnet', 'analysis_date'
            ]
            
            if not data:
                return None

            column_type_names = [
                'String', 'String', 'String', 'JSON', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

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