Karim Afdel

56 papers B 2C 8Misc 1Journal 34Unranked 11
YearRankTypeTitle / Venue / Authors
2026 J jnl
IET Blockchain
Hibatou allah Boulsane, Karim Afdel
2025 J jnl
CoRR
Abdelilah Ganmati, Karim Afdel, Lahcen Koutti
2025 J jnl
CoRR
Abdelilah Ganmati, Karim Afdel, Lahcen Koutti
2025 J jnl
CoRR
Abdelilah Ganmati, Karim Afdel, Lahcen Koutti
2024 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Mohamed Ouhssini, Karim Afdel, Elhafed Agherrabi, Mohamed Akouhar, Abdallah Abarda
2024 J jnl
Int. J. Multim. Inf. Retr.
Abdessamad Elboushaki, Rachida Hannane, Karim Afdel
2023 J jnl
Future Gener. Comput. Syst.
Noureddine Moussa, Edmond Nurellari, Kebira Azbeg, Abdellah Boulouz, Karim Afdel, Lahcen Koutti, Mohamed Ben Salah, Abdelbaki El Belrhiti El Alaoui
2023 J jnl
Multim. Tools Appl.
Zakaria Moutakki, Imad Mohamed Ouloul, Abdellah Amghar, Saad Motahhir, Karim Afdel
2023 J jnl
Signal Image Video Process.
Ibtissam Bakkouri, Karim Afdel
2022 J jnl
Multim. Tools Appl.
Ibtissam Bakkouri, Karim Afdel, Jenny Benois-Pineau, Gwénaëlle Catheline
2022 conf
CIoT
Amine Bouaouda, Karim Afdel, Rachida Abounacer
2022 J jnl
Int. J. Comput. Appl. Technol.
Ayoub Sabraoui, Anas Abouzahra, Karim Afdel
2020 J jnl
Pattern Recognit.
Rachida Hannane, Abdessamad Elboushaki, Karim Afdel
2020 J jnl
Multim. Tools Appl.
Ibtissam Bakkouri, Karim Afdel
2020 J jnl
CoRR
Oussama Smimite, Karim Afdel
2020 J jnl
Multim. Tools Appl.
Ibtissam Bakkouri, Karim Afdel
2020 C conf
ICISP
Ibtissam Bakkouri, Karim Afdel
2020 J jnl
CoRR
Tarik Ayaou, Azeddine Beghdadi, Karim Afdel, Abdellah Amghar
2020 J jnl
CoRR
Tarik Ayaou, Mourad Boussaid, Karim Afdel, Abdellah Amghar
2020 J jnl
Multim. Tools Appl.
Abdessamad Elboushaki, Rachida Hannane, Karim Afdel, Lahcen Koutti
2020 J jnl
Inf. Softw. Technol.
Anas Abouzahra, Ayoub Sabraoui, Karim Afdel
2020 J jnl
Expert Syst. Appl.
Abdessamad Elboushaki, Rachida Hannane, Karim Afdel, Lahcen Koutti
2020 conf
SoCPaR
Mohamed Ouhssini, Karim Afdel, Elhafed Agherrabi
2019 J jnl
Multim. Tools Appl.
Imad Mohamed Ouloul, Zakaria Moutakki, Karim Afdel, Abdellah Amghar
2019 J jnl
Multim. Tools Appl.
Ibtissam Bakkouri, Karim Afdel
2019 C conf
CBMI
Ibtissam Bakkouri, Karim Afdel, Jenny Benois-Pineau, Gwenaelle Catheline
2018 B conf
CBMS
Karim Aderghal, Alexander V. Khvostikov, Andrei S. Krylov, Jenny Benois-Pineau, Karim Afdel, Gwenaelle Catheline
2018 C conf
ICISP
Ibtissam Bakkouri, Karim Afdel
2018 J jnl
Secur. Commun. Networks
Mohamed Idhammad, Karim Afdel, Mustapha Belouch
2018 J jnl
J. Vis. Commun. Image Represent.
Rachida Hannane, Abdessamad Elboushaki, Karim Afdel
2018 J jnl
Appl. Intell.
Mohamed Idhammad, Karim Afdel, Mustapha Belouch
2017 J jnl
Pattern Recognit.
Abdessamad Elboushaki, Rachida Hannane, Karim Afdel, Lahcen Koutti
2017 Misc conf
ATSIP
Ibtissam Bakkouri, Karim Afdel
2017 conf
MMM (1)
Karim Aderghal, Manuel Boissenin, Jenny Benois-Pineau, Gwénaëlle Catheline, Karim Afdel
2017 B conf
ICMR
Karim Aderghal, Jenny Benois-Pineau, Karim Afdel
2017 C conf
CBMI
Karim Aderghal, Jenny Benois-Pineau, Karim Afdel, Gwénaëlle Catheline
2016 C conf
ICISP
Assma Azeroual, Karim Afdel
2016 C conf
AICCSA
Imad Mohamed Ouloul, Karim Afdel, Abdallah Amghar
2016 J jnl
Int. J. Multim. Inf. Retr.
Rachida Hannane, Abdessamad Elboushaki, Karim Afdel, P. Nagabhushan, Mohammed Javed
2016 C conf
AICCSA
Ali Aajli, Karim Afdel
2015 conf
ICTA
Rachida Hannane, Abdessamad Elboushaki, Karim Afdel
2015 conf
ICTA
Imad Mohamed Ouloul, Karim Afdel, Abdallah Amghar, Zakaria Moutakki
2015 conf
ICTA
Abdessamad Elboushaki, Rachida Hannane, Karim Afdel, Lahcen Koutti
2015 J jnl
CoRR
H. Ouahi, Karim Afdel, Mustapha Machkour
2015 J jnl
CoRR
Mourad Bousaaid, Tarik Ayaou, Karim Afdel, Pascal Estraillier
2015 J jnl
CoRR
Mourad Bousaaid, Tarik Ayaou, Karim Afdel, Pascal Estraillier
2014 J jnl
CoRR
Ali Aajli, Karim Afdel
2014 conf
CIST
Ali Aajli, Karim Afdel
2014 J jnl
CoRR
Ali Aajli, Karim Afdel
2014 conf
ICMCS
Mourad Bousaaid, Tarik Ayaou, Karim Afdel, Pascal Estraillier
2014 conf
ICMCS
Zakaria Moutakki, Tarik Ayaou, Karim Afdel, Abdellah Amghar
2014 J jnl
CoRR
H. Ouahi, M. El Hajji, Karim Afdel
2014 conf
ICMCS
Hassan Ouahi, Karim Afdel
2013 C conf
AICCSA
Ali Aajli, Karim Afdel
2012 J jnl
CoRR
Said Aminzou, Brahim Er-Raha, Youness Idrissi Khamlichi, Mustapha Machkour, Karim Afdel
2012 conf
ICMCS
Tarik Ayaou, Mourad Boussaid, Karim Afdel, Abdellah Amghar
redb/extractors/macho_extractors/macho_imports.py
← Index redb/extractors/macho_extractors/macho_imports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOImport


class MachOImportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_imports"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_IMPORT.value

    def _extract_imports(self, arch_name=None):
        """Extract import information from the MachO binary for a specific architecture.

        Handles machofile v2026.2.4+ API where get_imported_functions() returns:
        Dict[str, List[Dict]] where each dict has {'name': str, 'sources': [str, ...]}
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get imported functions using API for specific architecture
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            if not imported_functions:
                return None

            # Keep the library→functions mapping (like PE does)
            library_names = []
            imports_with_mapping = []  # List of {library: [(name, source), ...]}

            for dylib_name, functions in imported_functions.items():
                # v2026.2.4+: dylib_name is already str, but handle bytes for compatibility
                if isinstance(dylib_name, bytes):
                    dylib_name = dylib_name.decode('utf-8', errors='replace')
                library_names.append(dylib_name)

                # Process function entries
                func_list = []
                for func_entry in functions:
                    # v2026.2.4+: func_entry is {'name': str, 'sources': [str, ...]}
                    if isinstance(func_entry, dict):
                        func_name = func_entry.get('name', '')
                        # Join sources if multiple, take first if single
                        sources = func_entry.get('sources', [])
                        import_source = sources[0] if sources else None
                        func_list.append((func_name, import_source))
                    else:
                        # Legacy format: func_entry is str or bytes
                        if isinstance(func_entry, bytes):
                            func_entry = func_entry.decode('utf-8', errors='replace')
                        func_list.append((func_entry, None))

                imports_with_mapping.append({dylib_name: func_list})

            # Count total functions
            total_functions = sum(len(list(d.values())[0]) for d in imports_with_mapping)

            # Create import dataclass with mapping preserved
            macho_import = MachOImport(
                macho_imports_total=total_functions,
                macho_import_libraryName=library_names if library_names else None,
                macho_import_functions=imports_with_mapping if imports_with_mapping else None
            )

            return macho_import

        except Exception as e:
            self.log.error(f"Error extracting MachO imports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of imports for each architecture
                results = []
                for arch_name in architectures:
                    imports = self._extract_imports(arch_name)
                    if imports:
                        imports.arch_identifier = arch_name
                        results.append(imports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_imports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO imports: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            # Flatten the data - one row per function import (like PE imports)
            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get imports for this architecture
                macho_import = self._extract_imports(arch_name)
                if not macho_import or not macho_import.macho_import_functions:
                    continue

                # Flatten to one row per (library, function) pair
                for lib_funcs in macho_import.macho_import_functions:
                    for lib, funcs in lib_funcs.items():
                        for func_name, import_source in funcs:
                            data.append([
                                arch_sha256,        # sha256 (arch-specific)
                                lib,                # library_name
                                func_name,          # function_name
                                import_source,      # import_source (chained_fixups, bind_opcodes, symtab)
                                current_time,       # analysis_date
                            ])

            column_names = [
                'sha256',
                'library_name', 'function_name', 'import_source',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

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