Jacques Bou Abdo

79 papers B 3C 3Journal 43Unranked 30
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Aos Mulahuwaish, Basheer Qolomany, Kevin Gyorick, Jacques Bou Abdo, Mohammed Aledhari, Junaid Qadir, Kathleen M. Carley, Ala I. Al-Fuqaha
2025 J jnl
Int. J. Pervasive Comput. Commun.
Aos Mulahuwaish, Moufid El-Khoury, Basheer Qolomany, Jacques Bou Abdo, Sherali Zeadally
2025 J jnl
Algorithms
Olufunsho I. Falowo, Jacques Bou Abdo
2025 J jnl
CoRR
Kemi Akanbi, Sunkanmi Oluwadare, Jess Kropczynski, Jacques Bou Abdo
2025 conf
MENACOMM
Joseph Azar, Mohammad Abdullah Tahir, Jacques Bou Abdo, Jacques Demerjian, Nadine Akkari
2025 conf
MENACOMM
Charbel Mattar, Joseph Gemayel, Jacques Bou Abdo, Charbel El Gemayel, Abdallah Makhoul, Jacques Demerjian
2025 J jnl
CoRR
Siddique Abubakr Muntaka, Jacques Bou Abdo, Kemi Akanbi, Sunkanmi Oluwadare, Faiza Hussein, Oliver Kornyo, Michael Asante
2025 J jnl
J. Sens. Actuator Networks
Charbel Mattar, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2025 J jnl
CoRR
Siddique Abubakr Muntaka, Jacques Bou Abdo
2025 J jnl
Internet Technol. Lett.
Siddique Abubakr Muntaka, Jacques Bou Abdo
2025 J jnl
CoRR
Clarita Hawat, Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2025 J jnl
CoRR
Charbel Mattar, Jacques Bou Abdo, Abdallah Makhoul, Benoît Piranda, Jacques Demerjian
2024 J jnl
IEEE Access
Olufunsho I. Falowo, Jacques Bou Abdo
2024 J jnl
Entropy
Basheer Qolomany, Tristan J. Calay, Liaquat Hossain, Aos Mulahuwaish, Jacques Bou Abdo
2024 J jnl
Computer
Jacques Bou Abdo, Sherali Zeadally, Jacques Demerjian
2024 J jnl
J. Inf. Secur. Appl.
Jacques Bou Abdo, Sherali Zeadally
2024 J jnl
IEEE Access
Olufunsho I. Falowo, Murat Ozer, Chengcheng Li, Jacques Bou Abdo
2024 J jnl
Trans. Recomm. Syst.
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2023 conf
SBP-BRiMS
Tristan J. Calay, Basheer Qolomany, Aos Mulahuwaish, Liaquat Hossain, Jacques Bou Abdo
2023 J jnl
CoRR
Tristan J. Calay, Basheer Qolomany, Aos Mulahuwaish, Liaquat Hossain, Jacques Bou Abdo
2023 J jnl
Sensors
Suzan Hajj, Joseph Azar, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul, Dominique Ginhac
2023 B conf
DSAA
Suzan Hajj, Joseph Azar, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul, Dominique Ginhac
2023 conf
TALE
Jordan Schnell, Shuvalaxmi Dass, Jacques Bou Abdo, Moitrayee Chatterjee
2023 conf
COMPLEX NETWORKS (4)
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2023 conf
COMPLEX NETWORKS (3)
Jacques Bou Abdo, Shuvalaxmi Dass, Basheer Qolomany, Liaquat Hossain
2023 conf
COMPLEX NETWORKS (3)
Jacques Bou Abdo, Liaquat Hossain
2023 conf
AIBThings
Serge Sandakly, Charbel Salem, Khalil Challita, Shuvalaxmi Dass, Joseph Azar, Jacques Bou Abdo, Jacques Demerjian
2022 J jnl
AI Ethics
Esther Nehme, Rayane El Sibai, Jacques Bou Abdo, A. Ross Taylor, Jacques Demerjian
2022 J jnl
CoRR
Jacques Bou Abdo, Shuvalaxmi Dass, Basheer Qolomany, Liaquat Hossain
2022 J jnl
CoRR
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2022 J jnl
Int. J. Pervasive Comput. Commun.
Jacques Bou Abdo, Sherali Zeadally
2022 C conf
AICCSA
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2021 J jnl
IEEE Access
Suzan Hajj, Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul, Dominique Ginhac
2021 J jnl
Internet Technol. Lett.
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2021 J jnl
Trans. Emerg. Telecommun. Technol.
Suzan Hajj, Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul, Christophe Guyeux
2021 J jnl
ACM Trans. Knowl. Discov. Data
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2021 J jnl
CoRR
Jacques Bou Abdo
2021 J jnl
Inf. Secur. J. A Glob. Perspect.
Jacques Bou Abdo, Sherali Zeadally
2021 J jnl
Trans. Emerg. Telecommun. Technol.
Jacques Bou Abdo, Rayane El Sibai, Jacques Demerjian
2020 conf
Cloudtech
Rayane El Sibai, Jacques Bou Abdo, Chady Abou Jaoude, Jacques Demerjian, Yousra Chabchoub, Raja Chiky
2020 J jnl
Trans. Emerg. Telecommun. Technol.
Rayane El Sibai, Nader Gemayel, Jacques Bou Abdo, Jacques Demerjian
2020 J jnl
Int. J. Comput. Sci. Eng.
Christophe Guyeux, Jean-Claude Charr, Jacques Bou Abdo, Jacques Demerjian
2020 J jnl
Internet Technol. Lett.
Rayane El Sibai, Jacques Bou Abdo, Chady Abou Jaoude, Jacques Demerjian, Joseph Assaker, Abdallah Makhoul
2020 J jnl
Int. J. Sens. Networks
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul, Christophe Guyeux
2020 J jnl
CoRR
Jacques Bou Abdo, Sherali Zeadally
2020 J jnl
Peer-to-Peer Netw. Appl.
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2020 J jnl
Internet Technol. Lett.
Jacques Bou Abdo, Rayane El Sibai, Krishna Kambhampaty, Jacques Demerjian
2020 J jnl
IET Wirel. Sens. Syst.
Nadine Boudargham, Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2019 conf
ICAART (2)
Miriam El Khoury Badran, Jacques Bou Abdo, Wissam Al Jurdi, Jacques Demerjian
2019 J jnl
Internet Technol. Lett.
Sherali Zeadally, Jacques Bou Abdo
2019 conf
SENSORNETS
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2019 conf
SENSORNETS
Joseph Merhej, Jacques Demerjian, Karla Fares, Jacques Bou Abdo, Abdallah Makhoul
2019 conf
KSEM (1)
Wissam Al Jurdi, Chady Abou Jaoude, Miriam El Khoury Badran, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2018 conf
MENACOMM
Georges Chaaya, Jacques Bou Abdo, Jacques Demerjian, Raja Chiky, Elisabeth Métais, Kablan Barbar
2018 conf
ICM
E.-J. Maalouf, N. Marina, Jacques Bou Abdo, Alain Aoun, Mustapha Hamad, Abdallah Kassem
2018 conf
MENACOMM
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2018 conf
EMCIS
Georges Chaaya, Jacques Bou Abdo, Elisabeth Métais, Raja Chiky, Jacques Demerjian, Kablan Barbar
2018 conf
BlackSeaCom
Wissam Al Jurdi, Jacques Bou Abdo
2018 J jnl
Sensors
Nadine Bou Dargham, Abdallah Makhoul, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux
2018 conf
MENACOMM
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Talar Atéchian
2018 conf
MENACOMM
Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Yousra Chabchoub, Raja Chiky, Kablan Barbar
2018 conf
MENACOMM
Lamis Al Hassanieh, Chadi Abou Jaoudeh, Jacques Bou Abdo, Jacques Demerjian
2017 J jnl
Comput. Commun.
Khodor Hamandi, Jacques Bou Abdo, Imad H. Elhajj, Ayman I. Kayssi, Ali Chehab
2017 conf
FMEC
Jacques Bou Abdo
2017 conf
ECBS
Wissam Al Jurdi, Jacques Bou Abdo
2017 C conf
ICMLA
Georges Chaaya, Elisabeth Métais, Jacques Bou Abdo, Raja Chiky, Jacques Demerjian, Kablan Barbar
2017 J jnl
Pervasive Mob. Comput.
Jacques Bou Abdo, Jacques Demerjian
2016 J jnl
Mob. Inf. Syst.
Jacques Bou Abdo, Thomas Bourgeau, Jacques Demerjian, Hakima Chaouchi
2016 J jnl
CoRR
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2016 C conf
AICCSA
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2016 conf
CSE/EUC/DCABES
Jacques Bou Abdo, Rabih Jreish, Jacques Demerjian, Talar Atéchian
2015 conf
GSCIT
Rayane El Sibaï, Talar Atéchian, Jacques Bou Abdo, Jacques Demerjian, Rami Tawil
2015 conf
FiCloud
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Talar Atéchian
2015 conf
GSCIT
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Rami Yared, Talar Atéchian
2015 conf
DICTAP
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Talar Atéchian, Carole Bassil
2014 B conf
AINA
Jacques Bou Abdo, Imad Sarji, Imad H. Elhajj, Ali Chehab, Ayman I. Kayssi
2014 conf
HPCC/CSS/ICESS
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle, Talar Atéchian
2014 B conf
WCNC
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle
2013 conf
ICITST
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle
redb/extractors/macho_extractor.py
← Index redb/extractors/macho_extractor.py python
import logging
from abc import ABCMeta, abstractmethod
import inspect
import sys
import os

import machofile

from redb.extractors.extractor import Extractor

logger = logging.getLogger(__name__)


@abstractmethod
class MachOExtractor(Extractor, metaclass=ABCMeta):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        # Read binary and parse machofile BEFORE calling super().__init__
        # This avoids reading the file twice
        with open(filepath, "rb") as f:
            binary_data = f.read()

        # Parse machofile with binary data
        self.macho = macho if macho else self._generate_machofile_object(binary_data)

        # Extract hashes from machofile to pass to parent
        precomputed_hashes = None
        if self.macho:
            try:
                general_info = self.macho.get_general_info()
                if general_info:
                    # For FAT binaries, get_general_info() returns dict with 'fat' key
                    # For single-arch, it returns the info directly
                    if 'fat' in general_info:
                        fat_info = general_info['fat']
                        precomputed_hashes = {
                            'MD5': fat_info.get('MD5'),
                            'SHA1': fat_info.get('SHA1'),
                            'SHA256': fat_info.get('SHA256'),
                        }
                    else:
                        precomputed_hashes = {
                            'MD5': general_info.get('MD5'),
                            'SHA1': general_info.get('SHA1'),
                            'SHA256': general_info.get('SHA256'),
                        }
            except Exception as e:
                logger.debug(f"Could not get hashes from machofile: {e}")

        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            precomputed_hashes=precomputed_hashes,
        )

        # Store binary data so base class doesn't re-read
        self._binary_data = binary_data

    @property
    def binary(self):
        """Override to use already-read binary data."""
        return self._binary_data

    def _generate_machofile_object(self, binary_data):
        """Generate and parse a machofile object from binary data."""
        macho = None
        try:
            macho = machofile.UniversalMachO(data=binary_data)
            if not macho:
                raise Exception("Empty file?")

            # Parse the MachO object once during initialization
            macho.parse()

        except Exception as e:
            logger.error(f"Format error parsing MachO: {e}")
        return macho

    # def _is_macho_file(self):
    #     """Check if the file is a valid Mach-O binary."""
    #     try:
    #         if not self.macho:
    #             return False
            
    #         # For Universal/FAT binaries, check if any architecture is valid
    #         if hasattr(self.macho, 'is_fat') and self.macho.is_fat:
    #             return len(self.macho.architectures) > 0
    #         else:
    #             # Single architecture binary
    #             return hasattr(self.macho, 'macho') and self.macho.macho is not None
    #     except Exception as e:
    #         self.log.error(f"Error checking Mach-O file: {e}")
    #         return False

    def _is_signed(self):
        """Check if the Mach-O binary is code signed using new API."""
        try:
            if not self.macho:
                return False

            # Get architectures using new API
            architectures = self.macho.get_architectures()

            # For each architecture, check if signed
            for arch in architectures:
                try:
                    signature_info = self.macho.get_code_signature_info(arch=arch)
                    if signature_info and signature_info.get('signed', False):
                        return True
                except Exception:
                    continue

            return False
        except Exception as e:
            self.log.error(f"Error checking Mach-O signature: {e}")
            return False

    def _get_architectures(self):
        """Get list of architectures in the Mach-O binary using new API."""
        try:
            if not self.macho:
                return []

            # Use new API method
            architectures = self.macho.get_architectures()
            return architectures if architectures else []
        except Exception as e:
            self.log.error(f"Error getting architectures: {e}")
            return []

    # def _get_macho_for_arch(self, arch_name=None):
    #     """Get MachO instance for specific architecture or default."""
    #     try:
    #         if not self.macho:
    #             return None
            
    #         if hasattr(self.macho, 'is_fat') and self.macho.is_fat:
    #             if arch_name:
    #                 return self.macho.architectures.get(arch_name)
    #             else:
    #                 # Return first available architecture
    #                 return next(iter(self.macho.architectures.values())) if self.macho.architectures else None
    #         else:
    #             # Single architecture binary
    #             return self.macho.macho if hasattr(self.macho, 'macho') else None
    #     except Exception as e:
    #         self.log.error(f"Error getting MachO for architecture: {e}")
    #         return None

    # def _get_formatted_header_values(self, header):
    #     """Get both raw and human-readable header values."""
    #     try:
    #         macho_instance = self._get_macho_for_arch()
    #         if not macho_instance:
    #             return None
            
    #         # Parse the MachO if not already parsed
    #         if not hasattr(macho_instance, 'header') or not macho_instance.header:
    #             macho_instance.parse()
            
    #         # Get human-readable values using machofile's formatting methods
    #         magic_str = macho_instance.format_magic_value(header.get('magic', 0))
            
    #         # Simple CPU type mapping since CPU_TYPE_MAP is not exposed
    #         cputype = header.get('cputype', 0)
    #         if cputype == 0x7:
    #             cputype_str = "x86"
    #         elif cputype == 0x1000007:
    #             cputype_str = "x86_64"
    #         elif cputype == 0xC:
    #             cputype_str = "ARM"
    #         elif cputype == 0x100000C:
    #             cputype_str = "ARM 64-bit"
    #         else:
    #             cputype_str = str(cputype)
            
    #         cpusubtype_str = macho_instance.decode_cpusubtype(header.get('cputype', 0), header.get('cpusubtype', 0))
    #         filetype_str = macho_instance.format_file_type(header.get('filetype', 0))
    #         flags_str = macho_instance.decode_flags(header.get('flags', 0))
            
    #         return {
    #             'raw': {
    #                 'magic': header.get('magic', 0),
    #                 'cputype': header.get('cputype', 0),
    #                 'cpusubtype': header.get('cpusubtype', 0),
    #                 'filetype': header.get('filetype', 0),
    #                 'flags': header.get('flags', 0),
    #             },
    #             'formatted': {
    #                 'magic_str': magic_str,
    #                 'cputype_str': cputype_str,
    #                 'cpusubtype_str': cpusubtype_str,
    #                 'filetype_str': filetype_str,
    #                 'flags_str': flags_str,
    #             }
    #         }
    #     except Exception as e:
    #         self.log.error(f"Error formatting header values: {e}")
    #         return None