Kate McLean

12 papers A 1Journal 2Unranked 9
YearRankTypeTitle / Venue / Authors
2025 conf
OFC
Yusheng Bian, Takako Hirokawa, Yarong Lin, Zahidur Chowdhury, Arpan Dasgupta, Abdelsalam Aboketaf, Won Suk Lee, Francis Afzal, Sujith Chandran, Kevin K. Dezfulian, Arman Najafi, Ming Gong, Qidi Liu, Brian Popielarski, Jae Kyu Cho, Farid Barakat, Jason Kim, Michelle Zhang, Keith Donegan, Thomas Houghton, Karen Nummy, John Garant, Ravi Srivastava, Dewei Xu, Petar Ivanov Todorov, Michal Rakowski, Massimo Sorbara, Yahui Xiao, Shenghua Song, Helen Wong, Mohamed Gheith, Ian Stobert, Mini Modh Ghosal, Kate McLean, Ryan Gallagher, Norman Robson, Ian Melville, Asli Sahin, Janet Tinkler, Bob Mulfinger, George Gifford, Ryan Sporer, Rick Carter, Vikas Gupta, Ken Giewont, Isabelle Ferain, Ted Letavic
2025 conf
OFC
Yusheng Bian, Abdelsalam Aboketaf, Won Suk Lee, Sujith Chandran, Edgar Huante-Ceron, Arman Najafi, Ana Villafranca, Hatef Shiran, Judson Holt, Francis Afzal, Kevin K. Dezfulian, Michelle Zhang, Brian Popielarski, Ming Gong, Javier Ayala, Patrick Snow, Helen Wong, Qidi Liu, Mrunal Shah, Felix Beaudoin, Frank Pavlik, Crystal Hedges, Frieder Baumann, Michal Rakowski, Takako Hirokawa, Andy Stricker, Oscar Restrepo, Brett Yatzor, Massimo Sorbara, Yahui Xiao, Kyle Murray, Mohammad Karimi, Akram Hajebifard, Prova Christina Gomes, Richard Grzybowski, John Martinho, Yu Zhang, Amit Gupta, Hanyi Ding, Kate McLean, Teodor Stanev, Paul Webster-Pact, Ah Fatt Tong, Prashanth Prasad Raghavendra, Mini Modh Ghosal, Mohamed Gheith, Ian Stobert, Ryan Sweeney, Minghui Zhang, Jonathan Rullan, Feng Chen, Arunima Dasgupta, Jae Rascoe, Andrea Paganini, Alban Zaka, Xinggong Wan, Asli Sahin, Janet Tinkler, Bob Mulfinger, Scott Hildreth, George Gifford, Rainer Gehres, Ryan Sporer, Rick Carter, Vikas Gupta, Ken Giewont, Isabelle Ferain, Ted Letavic
2024 conf
OFC
Sujith Chandran, Yusheng Bian, Won Suk Lee, Ahmed Abumazwed, Neng Liu, Luhua Xu, Hanyi Ding, Abdelsalam Aboketaf, Michal Rakowski, Kevin Dezfulian, Arman Najafi, Takako Hirokawa, Qidi Liu, Andy Stricker, Subramanian Krishnamurthy, Kate McLean, Ryan Sporer, Michelle Zhang, Shenghua Song, Helen Wong, Salman Mosleh, Dan Deptuck, Janet Tinkler, Jae Gon Lee, Vikas Gupta, Anthony Yu, Ken Giewont, Ted Letavic
2023 conf
OFC
Yusheng Bian, Takako Hirokawa, Vaishnavi Karra, Arpan Dasgupta, Won Suk Lee, Abdelsalam Aboketaf, Francis Afzal, Ryan Sporer, Karen Nummy, Ken Giewont, Nickolas C. Harris, Reza Baghdadi, Shashank Gupta, Keith Donegan, Thomas Houghton, Brian Popielarski, Kevin K. Dezfulian, Petar Ivanov Todorov, Bo Peng, Sujith Chandran, Mohamed Gheith, Ian Stobert, Mini Modh Ghosal, Jae Kyu Cho, Apoorva Vakil, Sunoo Kim, Zhuo-Jie Wu, Andy Stricker, Kate McLean, Benjamin V. Fasano, Michal Rakowski, Qidi Liu, Matt Rauer, Ryan Gallagher, Ranjani Sirdeshmukh, Norman Robson, Ian Melville, Rod Augur, Jae Gon Lee, Wenhe Lin, George Gifford, Robert Fox, Vikas Gupta, Anthony Yu, John Pellerin, Ted Letavic
2022 conf
OFC
Asif Chowdhury, Subramanian Krishnamurthy, Abdelsalam Aboketaf, Jacquelyn Phang, Ludmila Popova, Michelle Zhang, Javier Ayala, Yusheng Bian, Michal Rakowski, Francis Afzal, Takako Hirokawa, Won Suk Lee, Judson Holt, Massimo Sorbara, Vishal Dhurgude, Crystal Hedges, Frank Pavlik, Stan Senger, Kate McLean, Andy Stricker, Ryan Sporer, Karen Nummy, Dave Riggs, Rod Augur, Wenhe Lin, Jae Gon Lee, Vikas Gupta, Eng Hua Lim, Ken Giewont, Ted Letavic, John Pellerin
2021 conf
OFC
Yusheng Bian, Koushik Ramachandran, Bo Peng, Brittany Hedrick, Scott Mills, Keith Donegan, Armand Rundquist, Ed Vail, Vaishnavi Karra, Firat Yasar, Monica Esopi, Benjamin Fasano, Asli Sahin, Thomas Houghton, Karen Nummy, Hanyi Ding, Takako Hirokawa, Kevin Dezfulian, Zhuo-Jie Wu, Daniel Fisher, Jim Pape, Jay Steffes, Louis Medina, Subharup Gupta Roy, Harry Cox, Bart Green, Jorge Lubguban, Won Suk Lee, Abdelsalam Aboketaf, Michal Rakowski, Kate McLean, Zoey Sowinski, Oh-Jung Kwon, Gabrielle Robert, Massimo Sorbara, Subramanian Krishnamurthy, Andy Stricker, Jae Kyu Cho, Ian Melville, Dave Riggs, Rod Augur, Norman Robson, Daniel Berger, Luke Lee, Vikas Gupta, Anthony Yu, Ken Giewont, Ted Letavic, John Pellerin
2021 conf
OFC
Yusheng Bian, Colleen Meagher, Karen Nummy, Sujith Chandran, Won Suk Lee, Abdelsalam Aboketaf, Danhao Ma, Ryan Sporer, Michal Rakowski, Nuh Yuksek, Monica Esopi, Bo Peng, Yangyang Liu, Abu Thomas, Tymon Barwicz, Takako Hirokawa, Javier Ayala, Asli Sahin, Andy Stricker, Subramanian Krishnamurthy, Shuren Hu, Zoey Sowinski, Kate McLean, Louis Medina, Kevin Dezfulian, Michelle Zhang, Mona Nafari, Zhuoqiang Jia, Kaushikee Mishra, Asif Chowdhury, Francis Afzal, Brendan Harris, Salman Mosleh, Bruna Paredes, Marcus S. Dahlem, Jaime Viegas, Rod Augur, Dave Riggs, Luke Lee, Wenhe Lin, Ajey P. Jacob, Fen Jamin, Mai Randall, Hemanth Parsa, Vikas Gupta, Anthony Yu, Ken Giewont, Ted Letavic, John Pellerin
2020 conf
OFC
Michal Rakowski, Colleen Meagher, Karen Nummy, Abdelsalam Aboketaf, Javier Ayala, Yusheng Bian, Brendan Harris, Kate McLean, Kevin McStay, Asli Sahin, Louis Medina, Bo Peng, Zoey Sowinski, Andy Stricker, Thomas Houghton, Crystal Hedges, Ken Giewont, Ajey P. Jacob, Ted Letavic, Dave Riggs, Anthony Yu, John Pellerin
2017 conf
ECOC
Jessie C. Rosenberg, Folkert Horst, Marwan Khater, Frederick G. Anderson, Robert Leidy, Tymon Barwicz, Douglas M. Gill, Edward Kiewra, Yves Martin, Jason S. Orcutt, Andreas D. Stricker, Charles Whiting, Kate McLean, Bruce Porth, Chi Xiong, Natalie B. Feilchenfeld, Ken Giewont, Karen Nummy, Bert J. Offrein, Wilfried Haensch, William M. J. Green
2016 J jnl
Int. J. Sociotechnology Knowl. Dev.
Amanda Cox, Yeslam Al-Saggaf, Kate McLean
2015 A conf
ICWSM
Daniele Quercia, Rossano Schifanella, Luca Maria Aiello, Kate McLean
2015 J jnl
CoRR
Daniele Quercia, Rossano Schifanella, Luca Maria Aiello, Kate McLean
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"