Wassim Bouachir

69 papers A 2B 3C 7Misc 1Journal 39Unranked 17
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Noreen Anwar, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2025 J jnl
Appl. Intell.
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2025 conf
Canadian AI
Safwen Naimi, Arij Saïd, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2025 J jnl
CoRR
Safwen Naimi, Arij Saïd, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2025 conf
Canadian AI
Alaa Nfissi, Ines Jemmali, Wassim Bouachir, Nizar Bouguila
2025 conf
Canadian AI
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila
2025 conf
ICTA
Arij Saïd, Takwa Ben Aïcha Gader, Afef Kacem Echi, Wassim Bouachir
2025 J jnl
J. Imaging
Ahmed Zgaren, Wassim Bouachir, Nizar Bouguila
2025 conf
WACV (Workshops)
Safwen Naimi, Wassim Bouachir, Guillaume-Alexandre Bilodeau, Brian L. Mishara
2025 J jnl
CoRR
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2025 J jnl
IEEE Trans. Affect. Comput.
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2024 J jnl
Neural Comput. Appl.
Safwen Naimi, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2024 conf
ANNPR
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2024 J jnl
CoRR
Khalil Sabri, Célia Djilali, Guillaume-Alexandre Bilodeau, Nicolas Saunier, Wassim Bouachir
2024 J jnl
CoRR
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2024 C conf
ICMLA
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2024 C conf
ICMLA
Safwen Naimi, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2024 J jnl
CoRR
Safwen Naimi, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2024 J jnl
CoRR
Noreen Anwar, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2024 conf
ICSC
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2024 J jnl
CoRR
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2024 J jnl
Appl. Intell.
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2023 J jnl
CoRR
Safwen Naimi, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2023 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Ahmed Zgaren, Wassim Bouachir, Nizar Bouguila
2023 J jnl
CoRR
Ahmed Zgaren, Wassim Bouachir, Nizar Bouguila
2023 C conf
ICMLA
Safwen Naimi, Olfa Koubaa, Wassim Bouachir, Guillaume-Alexandre Bilodeau, Gregory Jeddore, Patricia Baines, David L. P. Correia, Andre Arsenault
2023 J jnl
CoRR
Safwen Naimi, Olfa Koubaa, Wassim Bouachir, Guillaume-Alexandre Bilodeau, Gregory Jeddore, Patricia Baines, David L. P. Correia, Andre Arsenault
2023 C conf
ICMLA
Safwen Naimi, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2023 J jnl
CoRR
Safwen Naimi, Wassim Bouachir, Guillaume-Alexandre Bilodeau
2023 C conf
ICMLA
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2023 conf
CVPR Workshops
Ahmed Zgaren, Wassim Bouachir, Nizar Bouguila, Riad I. Hammoud
2023 conf
CRV
Hela Jemaa, Wassim Bouachir, Brigitte Leblon, Armand LaRocque, Ata Haddadi, Nizar Bouguila
2023 J jnl
Remote. Sens.
Hela Jemaa, Wassim Bouachir, Brigitte Leblon, Armand LaRocque, Ata Haddadi, Nizar Bouguila
2023 conf
CVPR Workshops
Noreen Anwar, Philippe Duplessis-Guindon, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2023 J jnl
CoRR
Noreen Anwar, Philippe Duplessis-Guindon, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2022 C conf
ICMLA
Majid Nikougoftar Nategh, Ahmed Zgaren, Wassim Bouachir, Nizar Bouguila
2022 J jnl
CoRR
Majid Nikougoftar Nategh, Ahmed Zgaren, Wassim Bouachir, Nizar Bouguila
2022 C conf
ICMLA
Alaa Nfissi, Wassim Bouachir, Nizar Bouguila, Brian L. Mishara
2022 J jnl
CoRR
Duc Minh Dimitri Nguyen, Mehdi Miah, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2022 B conf
ICPR
Duc Minh Dimitri Nguyen, Mehdi Miah, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2021 J jnl
Pattern Anal. Appl.
Koffi Eddy Ihou, Nizar Bouguila, Wassim Bouachir
2021 J jnl
CoRR
Zhenxi Li, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2021 J jnl
CoRR
Zhenxi Li, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2021 J jnl
Mach. Vis. Appl.
Zhenxi Li, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2020 conf
ISVC (1)
Ahmed Zgaren, Wassim Bouachir, Riadh Ksantini
2020 J jnl
CoRR
Ahmed Zgaren, Wassim Bouachir, Riadh Ksantini
2020 J jnl
Expert Syst. Appl.
Imanne El Maachi, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2020 J jnl
IEEE Access
David L. P. Correia, Wassim Bouachir, David Gervais, Deepa Pureswaran, Daniel D. Kneeshaw, Louis De Grandpré
2020 B conf
ICPR
Zhenxi Li, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2019 J jnl
IEEE Access
Wassim Bouachir, Koffi Eddy Ihou, Houssem-Eddine Gueziri, Nizar Bouguila, Nicolas Bélanger
2019 J jnl
CoRR
Imanne El Maachi, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2018 J jnl
Comput. Medical Imaging Graph.
Haythem Rehouma, Rita Noumeir, Wassim Bouachir, Philippe Jouvet, Sandrine Essouri
2018 J jnl
Pattern Recognit. Lett.
Wassim Bouachir, Rafik Gouiaa, Bo Li, Rita Noumeir
2018 J jnl
CoRR
Zhenxi Li, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2018 Misc conf
ISVC
Zhenxi Li, Guillaume-Alexandre Bilodeau, Wassim Bouachir
2018 J jnl
CoRR
Mohamed El Amine Elforaici, Ismail Chaaraoui, Wassim Bouachir, Youssef Ouakrim, Neila Mezghani
2017 conf
IPTA
Haythem Rehouma, Rita Noumeir, Philippe Jouvet, Wassim Bouachir, Sandrine Essouri
2017 conf
IPTA
Bo Li, Wassim Bouachir, Rafik Gouiaa, Rita Noumeir
2016 conf
ISIVC
Wassim Bouachir, Atousa Torabi, Guillaume-Alexandre Bilodeau, Pascal Blais
2016 conf
ICDP
Wassim Bouachir, Rita Noumeir
2015 J jnl
Comput. Vis. Image Underst.
Wassim Bouachir, Guillaume-Alexandre Bilodeau
2015 J jnl
Image Vis. Comput.
Wassim Bouachir, Guillaume-Alexandre Bilodeau
2015 A conf
WACV
Wassim Bouachir, Guillaume-Alexandre Bilodeau
2015 J jnl
CoRR
Gengjie Chen, Pierre-Luc St-Charles, Wassim Bouachir, Thomas Joeisseint, Guillaume-Alexandre Bilodeau, Robert Bergevin
2015 B conf
ICIP
Gengjie Chen, Pierre-Luc St-Charles, Wassim Bouachir, Guillaume-Alexandre Bilodeau, Robert Bergevin
2014 A conf
WACV
Wassim Bouachir, Guillaume-Alexandre Bilodeau
2013 J jnl
CoRR
Wassim Bouachir, Atousa Torabi, Guillaume-Alexandre Bilodeau, Pascal Blais
2013 conf
CRV
Wassim Bouachir, Guillaume-Alexandre Bilodeau
2009 conf
SITIS
Wassim Bouachir, Mustapha Kardouchi, Nabil Belacel
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"