Xian Wang

31 papers B 2C 1Misc 1Journal 20Unranked 7
YearRankTypeTitle / Venue / Authors
2017 J jnl
IEEE Trans. Veh. Technol.
Shiang-Feng Tzeng, Shi-Jinn Horng, Tianrui Li, Xian Wang, Po-Hsian Huang, Muhammad Khurram Khan
2016 conf
VTC Spring
Tao Deng, Zhengquan Zhang, Xian Wang, Pingzhi Fan
2016 J jnl
IEEE Trans. Veh. Technol.
Tao Deng, Xian Wang, Pingzhi Fan, Keqin Li
2015 J jnl
Inf. Sci.
Shi-Jinn Horng, Shiang-Feng Tzeng, Po-Hsian Huang, Xian Wang, Tianrui Li, Muhammad Khurram Khan
2015 J jnl
EURASIP J. Wirel. Commun. Netw.
Ruki Harwahyu, Xian Wang, Riri Fitri Sari, Ray-Guang Cheng
2015 J jnl
IEEE Trans. Veh. Technol.
Xian Wang, Keqin Li, Ray-Guang Cheng, Pingzhi Fan, Xianfu Lei, Rose Qingyang Hu
2015 C conf
QSHINE
Ping-Chen Lin, Ray-Guang Cheng, Xian Wang, Putu Ayu Rhamani Suryadhi
2015 J jnl
Wirel. Pers. Commun.
Tao Deng, Xian Wang
2014 J jnl
Multim. Tools Appl.
Shi-Jinn Horng, Mahmoud E. Farfoura, Pingzhi Fan, Xian Wang, Tianrui Li, Jing-Ming Guo
2014 J jnl
Multim. Tools Appl.
Shi-Jinn Horng, Didi Rosiyadi, Pingzhi Fan, Xian Wang, Muhammad Khurram Khan
2014 J jnl
IEEE Trans. Veh. Technol.
Xian Wang, Xianfu Lei, Pingzhi Fan, Rose Qingyang Hu, Shi-Jinn Horng
2014 Misc conf
ICNC
Xian Wang, Xianfu Lei, Rose Qingyang Hu, Geng Wu
2014 J jnl
Wirel. Pers. Commun.
Shi-Jinn Horng, Shiang-Feng Tzeng, Xian Wang, Shaojie Qiao, Xun Gong, Muhammad Khurram Khan
2014 J jnl
Wirel. Pers. Commun.
Xian Wang, Wei Jiang, Wei-Na Yuan, Huei-Wen Ferng
2014 conf
ICC
Xian Wang, Xianfu Lei, Rose Qingyang Hu, Yi Qian
2013 conf
ICCT
Tao Deng, Xian Wang, Wei Jiang
2013 conf
ISBAST
Ling-Yuan Hsu, Shi-Jinn Horng, Pingzhi Fan, Hsien-Hsin Chou, Xian Wang, Minyi Guo
2013 J jnl
Wirel. Pers. Commun.
Huei-Wen Ferng, Chen-Ching Liu, Xian Wang
2013 B conf
WCNC
Xianfu Lei, Lisheng Fan, Pingzhi Fan, Rose Qingyang Hu, Xian Wang
2013 conf
ICPCA/SWS
Yu Liu, Xian Wang
2013 J jnl
KSII Trans. Internet Inf. Syst.
Shi-Jinn Horng, Shiang-Feng Tzeng, Pingzhi Fan, Xian Wang, Tianrui Li, Muhammad Khurram Khan
2013 J jnl
IEEE Trans. Inf. Forensics Secur.
Shi-Jinn Horng, Shiang-Feng Tzeng, Yi Pan, Pingzhi Fan, Xian Wang, Tianrui Li, Muhammad Khurram Khan
2012 conf
ISBAST
Hung-Chuan Lai, Shi-Jinn Horng, Pingzhi Fan, Xian Wang, Yi Pan
2012 J jnl
IEEE Multim.
Didi Rosiyadi, Shi-Jinn Horng, Pingzhi Fan, Xian Wang, Muhammad Khurram Khan, Yi Pan
2011 B conf
WiMob
Xian Wang, Shi-Jinn Horng, Ray-Guang Cheng, Pingzhi Fan
2011 conf
ATNAC
Xian Wang, Shi-Jinn Horng, Ray-Guang Cheng, Pingzhi Fan
2010 J jnl
IEEE Trans. Veh. Technol.
Xian Wang, Pingzhi Fan, Yi Pan
2009 J jnl
Wirel. Networks
Xian Wang, Pingzhi Fan
2008 J jnl
IEEE Trans. Computers
Xian Wang, Pingzhi Fan, Yi Pan
2008 J jnl
IEEE Trans. Veh. Technol.
Xian Wang, Pingzhi Fan, Jie Li, Yi Pan
2007 J jnl
IEEE Commun. Lett.
Xian Wang, Pingzhi Fan
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"