Rainer Schoenen

43 papers B 7Misc 3Journal 9Unranked 24
YearRankTypeTitle / Venue / Authors
2016 conf
VTC Fall
Rainer Schoenen, Hamza Umit Sokun, Halim Yanikomeroglu
2016 J jnl
IEEE Trans. Veh. Technol.
Alireza Sharifian, Rainer Schoenen, Halim Yanikomeroglu
2015 J jnl
CoRR
Meisam Mirahsan, Rainer Schoenen, Halim Yanikomeroglu
2015 J jnl
IEEE J. Sel. Areas Commun.
Meisam Mirahsan, Rainer Schoenen, Halim Yanikomeroglu
2015 conf
ICC
Ziyang Wang, Rainer Schoenen, Halim Yanikomeroglu, Marc St-Hilaire
2015 conf
ICC
Meisam Mirahsan, Rainer Schoenen, Sebastian S. Szyszkowicz, Halim Yanikomeroglu
2015 J jnl
IEEE Trans. Commun.
Akram Bin Sediq, Rainer Schoenen, Halim Yanikomeroglu, Gamini Senarath
2015 J jnl
IEEE Wirel. Commun.
Meisam Mirahsan, Rainer Schoenen, Halim Yanikomeroglu, Gamini Senarath, Ngoc-Dung Dào
2014 J jnl
CoRR
Akram Bin Sediq, Rainer Schoenen, Halim Yanikomeroglu, Gamini Senarath
2014 B conf
GLOBECOM
Rainer Schoenen, Halim Yanikomeroglu
2014 B conf
GLOBECOM
Meisam Mirahsan, Rainer Schoenen, Halim Yanikomeroglu
2014 conf
GLOBECOM Workshops
Ziyang Wang, Rainer Schoenen, Halim Yanikomeroglu, Marc St-Hilaire
2014 conf
ICC Workshops
Meisam Mirahsan, Ziyang Wang, Rainer Schoenen, Halim Yanikomeroglu, Marc St-Hilaire
2014 J jnl
IEEE Commun. Mag.
Rainer Schoenen, Halim Yanikomeroglu
2013 conf
VTC Spring
Rainer Schoenen, Halim Yanikomeroglu
2013 conf
GLOBECOM Workshops
Rainer Schoenen, Halim Yanikomeroglu
2013 J jnl
IEEE Trans. Wirel. Commun.
Akram Bin Sediq, Ramy H. Gohary, Rainer Schoenen, Halim Yanikomeroglu
2012 B conf
PIMRC
Rainer Schoenen, Halim Yanikomeroglu
2012 conf
VTC Fall
Rainer Schoenen, Gurhan Bulu, Amir Mirtaheri, Tamer Beitelmal, Halim Yanikomeroglu
2012 conf
ICC
Tamer Beitelmal, Rainer Schoenen, Halim Yanikomeroglu
2012 conf
EW
Rainer Schoenen, Gurhan Bulu, Amir Mirtaheri, Tamer Beitelmal, Halim Yanikomeroglu
2012 conf
VTC Fall
Rainer Schoenen, Akram Bin Sediq, Halim Yanikomeroglu, Gamini Senarath, Zhijun Chao, Ho Ting Cheng
2011 B conf
PIMRC
Akram Bin Sediq, Rainer Schoenen, Halim Yanikomeroglu, Gamini Senarath, Zhijun Chao
2011 conf
EW
Maciej Mühleisen, Daniel Bültmann, Rainer Schoenen, Bernhard Walke
2011 conf
CNSR
Rainer Schoenen
2011 B conf
PIMRC
Rainer Schoenen, Akram Bin Sediq, Halim Yanikomeroglu, Gamini Senarath, Zhijun Chao
2011 conf
OnlineGreenComm
Rainer Schoenen, Gurhan Bulu, Amir Mirtaheri, Halim Yanikomeroglu
2011 conf
VTC Spring
Rainer Schoenen, Mohamed A. Rashad Salem, Akram Bin Sediq, Halim Yanikomeroglu
2011 J jnl
IEEE Commun. Lett.
Rainer Schoenen, Halim Yanikomeroglu, Bernhard Walke
2011 conf
ATNAC
Rainer Schoenen, Halim Yanikomeroglu
2010 B conf
PIMRC
Daniel Bültmann, Torsten Andre, Rainer Schoenen
2010 conf
VTC Fall
Rainer Schoenen, Arif Otyakmaz
2008 conf
VTC Spring
Rainer Schoenen, Rüdiger Halfmann, Bernhard Walke
2008 conf
ICC
Rainer Schoenen, Rüdiger Halfmann, Bernhard Walke
2008 conf
EW
Arif Otyakmaz, Rainer Schoenen, Sebastian Dreier, Bernhard Walke
2008 conf
EW
Rainer Schoenen, Wolfgang Zirwas, Bernhard Walke
2007 B conf
MASS
Nikolaj Marchenko, Jakob Hoydis, Aik Chindapol, Rainer Schoenen
1998 conf
MBMV
Guido Post, Andrea Müller, Rainer Schoenen
1997 Misc conf
ICASSP
Rainer Schoenen, Vojin Zivojnovic, Heinrich Meyr
1997 conf
ED&TC
Thorsten Grötker, Rainer Schoenen, Heinrich Meyr
1997 Misc conf
ICASSP
Thorsten Grötker, Rainer Schoenen, Heinrich Meyr
1996 conf
ISSS
Vojin Zivojnovic, Stefan Pees, C. Schälger, Markus Willems, Rainer Schoenen, Heinrich Meyr
1996 Misc conf
ICASSP
Vojin Zivojnovic, Rainer Schoenen
redb/extractors/pe_extractors/pe_inconsistency_tests.py
← Index redb/extractors/pe_extractors/pe_inconsistency_tests.py python
import inspect
from redb.ext.spoof_check import (
    Result,
    checksum_test,
    duplicate_test,
    import_count_test,
    linker_test,
)
from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import (
    DotNetInconsistencyTests,
    PEInconsistencyTests,
)
from datetime import datetime, timezone
from typing import Any


class PEInconstistencyTestsExtractor(PEExtractor):
    """Collection of functions to perform features inconsistency tests

    A Test where the result is True means that there is an inconsistency.
    At the moments it runs a series of inconsistency tests on PE metadata from
    - spoof_check
    - pescanner
    - dotnetfile
    """

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
        dotnet=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        self.dotnet = dotnet if dotnet else None
        self.pe_inconsistency_tests = None
        self.dotnet_inconsistency_tests = None
        self.elastic_index = self.index_prefix + "-pe_inconsistency_tests"

    def tag(self):
        return [Tag.PE_INCONSISTENCY_TESTS.value, Tag.DOTNET_INCONSISTENCY_TESTS.value]

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        tests_performed = False

        # Handle PE rich header tests
        try:
            rich_header = self.pe.parse_rich_header()
            if rich_header:
                self.pe_inconsistency_tests = PEInconsistencyTests(
                    test_rich_header_checksum=checksum_test(self.pe, rich_header) == Result.INVALID,
                    test_rich_header_duplicate=duplicate_test(self.pe, rich_header) == Result.INVALID,
                    test_rich_header_linker=linker_test(self.pe, rich_header) == Result.INVALID,
                    test_rich_header_import_count=import_count_test(self.pe, rich_header) == Result.INVALID,
                )
                tests_performed = True
            else:
                self.pe_inconsistency_tests = PEInconsistencyTests(
                    test_rich_header_checksum=None,
                    test_rich_header_duplicate=None,
                    test_rich_header_linker=None,
                    test_rich_header_import_count=None,
                )
        except Exception as e:
            self.log.error(f"Error processing rich header tests for {self.hash.sha256}: {e}")
            self.pe_inconsistency_tests = None

            # self.export_to_elastic([self.pe_inconsistency_tests])

        # Handle .NET tests
        try:
            if self._check_dotnet():
                if not self.dotnet:
                    self.dotnet, self.error = self._generate_dotnetfile_object()
                if self.error:
                    self.log.error(f"Error generating .NET object {self.hash.sha256}: {self.error}")
                self.dotnet_inconsistency_tests = DotNetInconsistencyTests(
                    test_dotnet_data_dir_hidden=self.dotnet.AntiMetadataAnalysis.is_dotnet_data_directory_hidden,
                    test_dotnet_extra_data=self.dotnet.AntiMetadataAnalysis.has_metadata_table_extra_data,
                    test_dotnet_fake_types=self.dotnet.AntiMetadataAnalysis.has_self_referenced_typeref_entries,
                    test_dotnet_invalid_type_ref=self.dotnet.AntiMetadataAnalysis.has_invalid_typeref_entries,
                    test_dotnet_fake_datastreams=self.dotnet.AntiMetadataAnalysis.has_fake_data_streams,
                    test_dotnet_extra_module_table=self.dotnet.AntiMetadataAnalysis.module_table_has_multiple_rows,
                    test_dotnet_extra_assembly_table=self.dotnet.AntiMetadataAnalysis.assembly_table_has_multiple_rows,
                    test_dotnet_invalid_strings_stream=self.dotnet.AntiMetadataAnalysis.has_invalid_strings_stream_entries,
                    test_dotnet_streams_mixed_case=self.dotnet.AntiMetadataAnalysis.has_mixed_case_stream_names,
                    test_dotnet_method_def_invalid_table=self.dotnet.AntiMetadataAnalysis.has_invalid_methoddef_entries,
                    test_dotnet_max_len_exceeding_strings=self.dotnet.AntiMetadataAnalysis.has_max_len_exceeding_strings,
                )
                tests_performed = True
        except Exception as e:
            self.log.error(f"Error processing .NET tests for {self.hash.sha256}: {e}")
            self.dotnet_inconsistency_tests = None

        # self.export_to_elastic([self.dotnet_inconsistency_tests])

        # If no tests were performed, return False to skip database insertion
        if not tests_performed:
            self.log.info("No inconsistency tests were performed.")
            return False

        return True

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return [self.pe_inconsistency_tests, self.dotnet_inconsistency_tests]
        elif exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)

            # For PE tests: if no rich header (all True), store NULL instead
            has_rich_header = any([
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_checksum'),
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_duplicate'),
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_linker'),
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_import_count')
            ])
            
            pe_tests = [
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_checksum,
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_duplicate,
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_linker,
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_import_count,
            ]
            
            # For .NET tests: if not a .NET file, store NULL instead of False
            dotnet_tests = [
                self.dotnet_inconsistency_tests.test_dotnet_data_dir_hidden if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_extra_data if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_fake_types if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_invalid_type_ref if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_fake_datastreams if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_extra_module_table if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_extra_assembly_table if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_invalid_strings_stream if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_streams_mixed_case if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_method_def_invalid_table if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_max_len_exceeding_strings if self.dotnet_inconsistency_tests else None,
            ]
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                *pe_tests,
                *dotnet_tests,
                current_time
            ]]

            column_names = [
                'sha256', 'md5', 'sha1',
                'test_rich_header_checksum', 'test_rich_header_duplicate', 'test_rich_header_linker', 'test_rich_header_import_count',
                'test_dotnet_data_dir_hidden', 'test_dotnet_extra_data',
                'test_dotnet_fake_types', 'test_dotnet_invalid_type_ref',
                'test_dotnet_fake_datastreams', 'test_dotnet_extra_module_table',
                'test_dotnet_extra_assembly_table', 'test_dotnet_invalid_strings_stream',
                'test_dotnet_streams_mixed_case', 'test_dotnet_method_def_invalid_table',
                'test_dotnet_max_len_exceeding_strings', 'analysis_date'
            ]
            
            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'DateTime64(3, \'UTC\')'
            ]

            if not data:
                return None

            return (data, column_names, column_type_names)

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