Oliver Niebuhr

66 papers A* 1A 20Misc 2Journal 22Unranked 21
YearRankTypeTitle / Venue / Authors
2025 conf
SPECOM (2)
Sara M. Pearsell, Oliver Niebuhr, Samuel Schmück
2025 conf
ICPS
Sara M. Pearsell, Oliver Niebuhr
2025 A conf
INTERSPEECH
Oliver Niebuhr
2024 Misc conf
ICASSP
Charlotte Fooks, Oliver Niebuhr
2024 conf
ProComm
Sina Voss, Oliver Niebuhr
2024 J jnl
Phonetica
Oliver Niebuhr
2024 A conf
INTERSPEECH
Donna Erickson, Albert Rilliard, Malin Svensson Lundmark, Adelaide Silva, Leticia Rebollo Couto, Oliver Niebuhr, João Antônio de Moraes
2024 J jnl
Sensors
Charlotte Fooks, Oliver Niebuhr
2024 conf
ProComm
Oliver Niebuhr, Ïo Valls-Ratés
2024 A conf
INTERSPEECH
Oliver Niebuhr, Nafiseh Taghva
2024 Misc conf
ICASSP
Rongjie Shi, Oliver Niebuhr, Wentao Gu, Nafiseh Taghva
2024 A conf
INTERSPEECH
Vidar Freyr Gudmundsson, Keve Márton Gönczi, Malin Svensson Lundmark, Donna Erickson, Oliver Niebuhr
2024 conf
CSEDU (1)
Ïo Valls-Ratés, Oliver Niebuhr, Pilar Prieto
2023 J jnl
Phonetica
Oliver Niebuhr
2023 conf
DiSS
Vered Silber-Varod, Oliver Niebuhr, Loredana Schettino, Plínio A. Barbosa
2023 J jnl
Frontiers Virtual Real.
Ïo Valls-Ratés, Oliver Niebuhr, Pilar Prieto
2023 J jnl
ACM Trans. Hum. Robot Interact.
Kerstin Fischer, Oliver Niebuhr
2022 J jnl
Phonetica
Oliver Niebuhr
2022 A* conf
HRI
Ali Asadi, Oliver Niebuhr, Jonas Jørgensen, Kerstin Fischer
2021 conf
ICMI Companion
Oliver Niebuhr, Ronald Böck, Joseph A. Allen
2021 J jnl
Frontiers Robotics AI
Kerstin Fischer, Oliver Niebuhr, Maria Alm
2021 conf
ISCSLP
Anna Gutnyk, Oliver Niebuhr, Wentao Gu
2020 A conf
INTERSPEECH
Jana Neitsch, Oliver Niebuhr
2020 conf
SPECOM
Oliver Niebuhr, Jana Neitsch
2020 J jnl
Phonetica
Oliver Niebuhr
2020 A conf
INTERSPEECH
Jana Neitsch, Plínio A. Barbosa, Oliver Niebuhr
2020 J jnl
ACM Trans. Hum. Robot Interact.
Kerstin Fischer, Oliver Niebuhr, Lars Christian Jensen, Leon Bodenhagen
2020 conf
HRI (Companion)
Kerstin Fischer, Oliver Niebuhr
2019 A conf
INTERSPEECH
Stephanie Berger, Oliver Niebuhr, Margaret Zellers
2019 conf
ICCSA (2)
Oliver Niebuhr, Jan Michalsky
2019 A conf
INTERSPEECH
Oliver Niebuhr, Kerstin Fischer
2019 A conf
INTERSPEECH
Oliver Niebuhr, Uffe Schjoedt
2019 conf
ICCSA (2)
Francesca D'Errico, Oliver Niebuhr, Isabella Poggi
2019 A conf
INTERSPEECH
Oliver Niebuhr, Jan Michalsky
2017 A conf
INTERSPEECH
Eszter Novák-Tót, Oliver Niebuhr, Aoju Chen
2017 J jnl
Phonetica
Catherine T. Best, Oliver Niebuhr
2017 A conf
INTERSPEECH
Oliver Niebuhr
2017 A conf
INTERSPEECH
Lea S. Kohtz, Oliver Niebuhr
2017 J jnl
EURASIP J. Audio Speech Music. Process.
Oliver Niebuhr
2017 A conf
INTERSPEECH
Oliver Niebuhr, Jana Winkler
2016 J jnl
Phonetica
Jan Volín, Lenka Weingartová, Oliver Niebuhr
2016 J jnl
Comput. Hum. Behav.
Oliver Niebuhr, Jana Voße, Alexander Brem
2015 conf
ICPhS
Frank Kügler, Bernadett Smolibocki, Denis Arnold, Stefan Baumann, Bettina Braun, Martine Grice, Stefanie Jannedy, Jan Michalsky, Oliver Niebuhr, Jörg Peters, Simon Ritter, Christine T. Röhr, Antje Schweitzer, Katrin Schweitzer, Petra Wagner
2015 conf
ICPhS
Petra Wagner, Antonio Origlia, Cinzia Avesani, George Christodoulides, Francesco Cutugno, Mariapaola D'Imperio, David Escudero Mancebo, Barbara Gili Fivela, Anne Lacheret, Bogdan Ludusan, Helena Moniz, Ailbhe Ní Chasaide, Oliver Niebuhr, Lucie Rousier-Vercruyssen, Anne-Catherine Simon, Juraj Simko, Fabio Tesser, Martti Vainio
2015 conf
ICPhS
Gilbert Ambrazaitis, Tuarik Cassimo Buanzur, Oliver Niebuhr
2015 conf
ICPhS
Oliver Niebuhr
2015 conf
ICPhS
Carina Marquard, Oliver Niebuhr, Alena Witzlack-Makarevich
2013 A conf
INTERSPEECH
Lea S. Kohtz, Oliver Niebuhr
2013 A conf
INTERSPEECH
Oliver Niebuhr
2013 conf
SIGDIAL Conference
Oliver Niebuhr, Karin Görs, Evelin Graupe
2013 A conf
INTERSPEECH
Hansjörg Mixdorff, Oliver Niebuhr
2012 J jnl
Phonetica
Oliver Niebuhr
2011 conf
ICPhS
Oliver Niebuhr, Mariapaola D'Imperio, Barbara Gili Fivela, Francesco Cangemi
2011 conf
ICPhS
Oliver Niebuhr, Cassandra Lill, Jessica Neuschulz
2011 conf
ICPhS
Hartmut R. Pfitzinger, Oliver Niebuhr
2011 A conf
INTERSPEECH
Oliver Niebuhr, Astrid Wolf
2011 J jnl
J. Phonetics
Oliver Niebuhr, Meghan Clayards, Christine Meunier, Leonardo Lancia
2011 J jnl
Phonetica
Klaus J. Kohler, Oliver Niebuhr
2011 J jnl
J. Phonetics
Oliver Niebuhr, Klaus J. Kohler
2011 J jnl
Phonetica
Oliver Niebuhr, Christine Meunier
2010 J jnl
Phonetica
Oliver Niebuhr
2009 J jnl
Phonetica
Oliver Niebuhr
2009 A conf
INTERSPEECH
Oliver Niebuhr
2007 A conf
INTERSPEECH
Oliver Niebuhr
2007 J jnl
Phonetica
Oliver Niebuhr
2005 J jnl
Phonetica
Ernst Dombrowski, Oliver Niebuhr
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"