Ioannis A. Sarafis

29 papers A 1B 3Journal 14Unranked 10
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE J. Biomed. Health Informatics
Vasileios Papapanagiotou, Ioannis A. Sarafis, Leonidas Alagialoglou, Vasileios Gkolemis, Christos Diou, Anastasios Delopoulos
2025 J jnl
CoRR
Vasileios Papapanagiotou, Ioannis A. Sarafis, Leonidas Alagialoglou, Vasileios Gkolemis, Christos Diou, Anastasios Delopoulos
2025 conf
SMAP
Ioannis A. Sarafis, Alexandros Papadopoulos, Anastasios Delopoulos
2025 J jnl
CoRR
Ioannis A. Sarafis, Alexandros Papadopoulos, Anastasios Delopoulos
2023 conf
SMAP
Valasia Vlachopoulou, Ioannis A. Sarafis, Alexandros Papadopoulos
2023 J jnl
CoRR
Valasia Vlachopoulou, Ioannis A. Sarafis, Alexandros Papadopoulos
2022 J jnl
CoRR
Christos Diou, Konstantinos Kyritsis, Vasileios Papapanagiotou, Ioannis A. Sarafis
2020 conf
EMBC
Christos Diou, Ioannis A. Sarafis, Vasileios Papapanagiotou, Leonidas Alagialoglou, Irini Lekka, Dimitrios Filos, Leandros Stefanopoulos, Vasileios Kilintzis, Christos Maramis, Youla Karavidopoulou, Nikolaos Maglaveras, Ioannis Ioakimidis, Evangelia Charmandari, Penio Kassari, Athanasia Tragomalou, Monica Mars, Thien-An Ngoc Nguyen, M. Tahar Kechadi, Shane O' Donnell, Gerardine Doyle, Sarah Browne, Grace O' Malley, Rachel Heimeier, Katerina Riviou, Evangelia Koukoula, Konstantinos Filis, Maria Hassapidou, Ioannis Pagkalos, Daniel Ferri, Isabel Pérez, Anastasios Delopoulos
2020 J jnl
CoRR
Christos Diou, Ioannis A. Sarafis, Vassilis Papapanagiotou, Leonidas Alagialoglou, Irini Lekka, Dimitrios Filos, Leandros Stefanopoulos, Vasileios Kilintzis, Christos Maramis, Youla Karavidopoulou, Nicos Maglaveras, Ioannis Ioakimidis, Evangelia Charmandari, Penio Kassari, Athanasia Tragomalou, Monica Mars, Thien-An Ngoc Nguyen, M. Tahar Kechadi, Shane O' Donnell, Gerardine Doyle, Sarah Browne, Grace O' Malley, Rachel Heimeier, Katerina Riviou, Evangelia Koukoula, Konstantinos Filis, Maria Hassapidou, Ioannis Pagkalos, Daniel Ferri, Isabel Pérez, Anastasios Delopoulos
2020 conf
EMBC
Vasileios Papapanagiotou, Ioannis A. Sarafis, Christos Diou, Ioannis Ioakimidis, Evangelia Charmandari, Anastasios Delopoulos
2020 J jnl
CoRR
Vasileios Papapanagiotou, Ioannis A. Sarafis, Christos Diou, Ioannis Ioakimidis, Evangelia Charmandari, Anastasios Delopoulos
2020 conf
EMBC
Ioannis A. Sarafis, Christos Diou, Vasileios Papapanagiotou, Leonidas Alagialoglou, Anastasios Delopoulos
2020 J jnl
CoRR
Ioannis A. Sarafis, Christos Diou, Vasileios Papapanagiotou, Leonidas Alagialoglou, Anastasios Delopoulos
2019 J jnl
CoRR
Christos Diou, Ioannis A. Sarafis, Vasileios Papapanagiotou, Ioannis Ioakimidis, Anastasios Delopoulos
2019 conf
EMBC
Ioannis A. Sarafis, Christos Diou, Ioannis Ioakimidis, Anastasios Delopoulos
2019 conf
EMBC
Ioannis A. Sarafis, Christos Diou, Anastasios Delopoulos
2018 conf
EMBC
Alexandros Papadopoulos, Konstantinos Kyritsis, Ioannis A. Sarafis, Anastasios Delopoulos
2018 J jnl
CoRR
Ioannis A. Sarafis, Christos Diou, Anastasios Delopoulos
2017 conf
BHI
Christos Diou, Ioannis A. Sarafis, Ioannis Ioakimidis, Anastasios Delopoulos
2016 J jnl
Eng. Appl. Artif. Intell.
Ioannis A. Sarafis, Christos Diou, Anastasios Delopoulos
2015 J jnl
Int. J. Multim. Inf. Retr.
Ioannis A. Sarafis, Christos Diou, Anastasios Delopoulos
2014 conf
SMAP
Ioannis A. Sarafis, Christos Diou, Anastasios Delopoulos
2014 J jnl
Comput. Methods Programs Biomed.
Aimilia Gastounioti, Vasileios D. Kolias, Spyretta Golemati, Nikolaos N. Tsiaparas, Aikaterini I. Matsakou, John S. Stoitsis, Nikolaos P. E. Kadoglou, Christos Gkekas, John D. Kakisis, Christos D. Liapis, Petros Karakitsos, Ioannis A. Sarafis, Pantelis Angelidis, Konstantina S. Nikita
2014 B conf
ICIP
Ioannis A. Sarafis, Christos Diou, Theodora Tsikrika, Anastasios Delopoulos
2007 J jnl
Appl. Soft Comput.
Ioannis A. Sarafis, Philip W. Trinder, Ali M. S. Zalzala
2005
Ioannis A. Sarafis
2003 A conf
GECCO
Ioannis A. Sarafis, Philip W. Trinder, Ali M. S. Zalzala
2003 B conf
IEEE Congress on Evolutionary Computation
Ioannis A. Sarafis, Philip W. Trinder, Ali M. S. Zalzala
2002 B conf
IEEE Congress on Evolutionary Computation
Ioannis A. Sarafis, Ali M. S. Zalzala, Philip W. Trinder
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"