Hankyu Lee

23 papers C 1Journal 10Unranked 11
YearRankTypeTitle / Venue / Authors
2024 conf
BHI
Ahmed Shalaby, Omar Dekhil, Krishna Kanth Chitta, Hankyu Lee, Dwight German, Jeon Lee
2024 J jnl
Eng. Appl. Artif. Intell.
HoHyun Sim, Hyeonjoong Cho, Hankyu Lee
2024 J jnl
Remote. Sens.
Jinuk Kim, Jin Hwi Kim, Wonjin Jang, JongCheol Pyo, Hyuk Lee, Seohyun Byeon, Hankyu Lee, Yongeun Park, Seongjoon Kim
2022 conf
VLSI Technology and Circuits
Yeunhee Huh, ChiSung Bae, Hankyu Lee, Sang Joon Kim
2022 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Kent Edrian Lozada, Il-Hoon Jang, Gyeom-Je Bae, Dong-Hun Lee, Ye-Dam Kim, Hankyu Lee, Seong Joong Kim, Seung-Tak Ryu
2019 conf
BioCAS
Sang Joon Kim, Joonseong Kang, Wonseok Lee, Jonghan Kim, Junyeub Suh, ChiSung Bae, Hyungwoo Lee, Jongpal Kim, Seungchul Jung, Seok-Ju Yun, Young-Jun Hong, Hankyu Lee, Jaechun Lee, Seong Joong Kim
2018 J jnl
Sensors
Jongpal Kim, Hankyu Lee, Hyoungho Ko
2018 J jnl
Expert Syst. Appl.
Hankyu Lee, Seoung Bum Kim
2018 J jnl
CoRR
Hyungu Kahng, Yonghyun Jung, Yoon-Sang Cho, Gonie Ahn, Youngjoon Park, Uk Jo, Hankyu Lee, Hyungrok Do, Junseung Lee, Hyunjin Choi, Iljoo Yoon, HyunJae Lee, Daehun Jun, Changhyeon Bae, Seoung Bum Kim
2017 conf
IEEE SENSORS
Jongpal Kim, Hankyu Lee, Sang Joon Kim
2017 J jnl
Knowl. Based Syst.
Youngjoon Park, Hyung Seok Kim, Donghwa Kim, Hankyu Lee, Seoung Bum Kim, Pilsung Kang
2015 conf
ISSCC
Hadong Jin, Dongsu Kim, Sangsu Jin, Hankyu Lee, Kyunghoon Moon, Huijung Kim, Bumman Kim
2013 conf
MUE
Chuho Yi, Seungdo Jeong, Kyeong-Soo Han, Hankyu Lee
2013 conf
ICTC
Dat Tien Nguyen, Kwang Yong Shin, Won Oh Lee, Yeong Gon Kim, Ki-Wan Kim, Hyung Gil Hong, Kang Ryoung Park, CheonIn Oh, Hankyu Lee, Youngho Jeong
2013 conf
ICTC
Kyeong-Soo Han, Hankyu Lee, Youngho Jeong, Youn-Seon Jang
2012 J jnl
IEEE Multim.
M. S. Houari Sabirin, Munchurl Kim, Hui Yong Kim, Hankyu Lee, MinKyu Park, Yonghan Kim
2012 conf
FGIT-EL/DTA/UNESST
Yeong Gon Kim, Kwang Yong Shin, Won Oh Lee, Kang Ryoung Park, Eui Chul Lee, CheonIn Oh, Hankyu Lee
2009 ch.
Handbook of Multimedia for Digital Entertainment and Arts
Jeongyeon Lim, Munjo Kim, Bumshik Lee, Munchurl Kim, Heekyung Lee, Hankyu Lee
2009 J jnl
IEEE Trans. Consumer Electron.
Injae Lee, Hankyu Lee, Jinwoo Hong, Jihun Cha
2009 conf
EMS
Seungwon Song, Injae Lee, Hankyu Lee, Jinwoo Hong, Jihun Cha
2008 J jnl
Multim. Tools Appl.
Jeongyeon Lim, Munjo Kim, Bumshik Lee, Munchurl Kim, Heekyung Lee, Hankyu Lee
2006 C conf
PSIVT
Agus Syawal Yudhistira, Munchurl Kim, Hieyong Kim, Hankyu Lee
2005 conf
PCM (1)
Heekyung Lee, Seung-Jun Yang, Hankyu Lee, Jinwoo Hong
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"