Imad Mahgoub

93 papers B 13C 5Misc 2Journal 26Unranked 40
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Access
Abit Jurkuch, Imad Mahgoub, Ismail Butun
2025 J jnl
Future Internet
Hani M. Alnami, Imad Mahgoub, Hamzah Al Najada, Easa Alalwany
2025 J jnl
IEEE Internet Things J.
Thamer Alshammari, Imad Mahgoub
2024 C conf
ISNCC
Amar Amouri, Mohamad Mahmoud Al Rahhal, Yakoub Bazi, Ismail Butun, Imad Mahgoub
2024 J jnl
CoRR
Amar Amouri, Mohamad Mahmoud Al Rahhal, Yakoub Bazi, Ismail Butun, Imad Mahgoub
2024 conf
SmartNets
Ismail Butun, Imad Mahgoub
2024 conf
SmartNets
Hamidreza Asefi-Ghamari, Murtadha D. Hssayeni, Imad Mahgoub
2024 J jnl
J. Sens. Actuator Networks
Ray Colucci, Imad Mahgoub
2024 C conf
ISNCC
Md Ahnaf Akif, Ismail Butun, Imad Mahgoub
2024 J jnl
Sensors
Easa Alalwany, Imad Mahgoub
2024 J jnl
IEEE Access
Ray Colucci, Imad Mahgoub, Hooman Yousefizadeh, Hamzah Al Najada
2023 J jnl
IEEE Access
Basmh Alkanjr, Imad Mahgoub
2023 J jnl
Sensors
Basmh Alkanjr, Imad Mahgoub
2022 J jnl
Sensors
Easa Alalwany, Imad Mahgoub
2021 J jnl
Veh. Commun.
Ohoud Alzamzami, Imad Mahgoub
2021 conf
CCWC
Hani M. Alnami, Imad Mahgoub, Hamzah Al Najada
2021 J jnl
IEEE Internet Things J.
Ahmed Badi, Imad Mahgoub
2021 conf
SSCI
Elnaz Limouchi, Imad Mahgoub
2021 conf
SSCI
Hani M. Alnami, Imad Mahgoub, Hamzah Al Najada
2020 J jnl
Ad Hoc Networks
Ohoud Alzamzami, Imad Mahgoub
2019 J jnl
IEEE Trans. Intell. Transp. Syst.
Ohoud Alzamzami, Imad Mahgoub
2019 J jnl
IEEE Trans. Intell. Transp. Syst.
Elnaz Limouchi, Imad Mahgoub
2018 conf
UEMCON
Elnaz Limouchi, Imad Mahgoub
2018 conf
SSCI
Hamzah Al Najada, Imad Mahgoub, Imran Mohammed
2018 conf
SSCI
Hamzah Al Najada, Imad Mahgoub, Imran Mohammed
2018 conf
UEMCON
Chad Mandy, Imad Mahgoub
2017 conf
MobiWac
Mohammed Hameed Alhameed, Imad Mahgoub
2017 conf
DASC/PiCom/DataCom/CyberSciTech
Joanne Skiles, Imad Mahgoub
2017 J jnl
IEEE Commun. Surv. Tutorials
Steve Glass, Imad Mahgoub, Monika Rathod
2017 conf
SSCI
Steve Glass, Imad Mahgoub, Monika Rathod
2017 conf
Wireless Days
Steve Glass, Imad Mahgoub, Monika Rathod
2017 conf
DASC/PiCom/DataCom/CyberSciTech
Hamzah Al Najada, Imad Mahgoub
2017 conf
DASC/PiCom/DataCom/CyberSciTech
Mohammed Hameed Alhameed, Imad Mahgoub
2017 conf
SSCI
Mohammed Hameed Alhameed, Imad Mahgoub
2016 B conf
IWCMC
Joanne Skiles, Imad Mahgoub
2016 B conf
WCNC
Ohoud Alzamzami, Imad Mahgoub
2016 conf
SSCI
Hamzah Al Najada, Imad Mahgoub
2016 conf
UEMCON
Hamzah Al Najada, Imad Mahgoub
2016 conf
SSCI
Elnaz Limouchi, Imad Mahgoub
2016 B conf
IWCMC
Hamzah Al Najada, Imad Mahgoub
2016 conf
VTC Fall
Elnaz Limouchi, Imad Mahgoub, Ahmad Alwakeel
2016 conf
UEMCON
Elnaz Limouchi, Imad Mahgoub
2016 conf
UEMCON
Alain Edwards, Imad Mahgoub, Monika Rathod
2016 B conf
WCNC
Lina Altoaimy, Imad Mahgoub
2016 B conf
IWCMC
Elnaz Limouchi, Ali Zilouchian, Imad Mahgoub
2015 J jnl
Int. J. Commun. Syst.
Michael Slavik, Imad Mahgoub, Mohammed Alwakeel
2014 conf
BODYNETS
Sheryl LaFleur, Imad Mahgoub
2014 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Michael Slavik, Imad Mahgoub, Mohammed M. Alwakeel
2014 conf
CIVTS
Lina Altoaimy, Imad Mahgoub
2014 J jnl
Int. J. Commun. Syst.
Jamil Ibriq, Imad Mahgoub
2014 conf
ICCVE
Lina Altoaimy, Imad Mahgoub
2014 conf
GIIS
Lina Altoaimy, Imad Mahgoub, Monika Rathod
2013 conf
BODYNETS
Sheryl LaFleur, Imad Mahgoub
2013 J jnl
IEEE Trans. Mob. Comput.
Michael Slavik, Imad Mahgoub
2013 conf
ICCVE
Clyde Carryl, Mohammad Ilyas, Imad Mahgoub, Monika Rathod
2012 conf
PervasiveHealth
Redjem Bouhenguel, Imad Mahgoub
2012 conf
GIIS
Monika Rathod, Imad Mahgoub, Michael Slavik, Eric Gamess
2012 conf
BODYNETS
Redjem Bouhenguel, Imad Mahgoub, Mohammad Ilyas
2011 conf
Wireless Days
Monika Rathod, Imad Mahgoub, Michael Slavik
2011 B conf
WCNC
Michael Slavik, Imad Mahgoub, Ahmed Badi
2011 B conf
IWCMC
Michael Slavik, Imad Mahgoub
2011 B conf
IWCMC
Michael Slavik, Imad Mahgoub
2011 conf
ICCIT
Michael Slavik, Imad Mahgoub
2011 B conf
WCNC
Michael Slavik, Imad Mahgoub, Monika Rathod
2010 B conf
WiMob
Michael Slavik, Imad Mahgoub
2010 ch.
Handbook of Information and Communication Security
Jamil Ibriq, Imad Mahgoub, Mohammad Ilyas
2010 B conf
GLOBECOM
Michael Slavik, Imad Mahgoub
2010 conf
CCNC
Michael Slavik, Imad Mahgoub
2009 C conf
AICCSA
Abu Asaduzzaman, Imad Mahgoub, Fadi N. Sibai
2009 conf
BICoB
Michael Slavik, Xingquan Zhu, Imad Mahgoub, Muhammad Shoaib
2008 J jnl
Int. J. Bus. Data Commun. Netw.
Michael Slavik, Imad Mahgoub, Ahmed Badi, Fadi N. Sibai
2008 conf
WTS
Michael Slavik, Imad Mahgoub, Ahmed Badi
2008 Misc conf
WSC
Michael Slavik, Imad Mahgoub, Ahmed Badi
2008 ch.
Encyclopedia of Wireless and Mobile Communications
Imad Mahgoub, Predrag Maksimovic
2008 ch.
Encyclopedia of Wireless and Mobile Communications
Mihaela Cardei, Jamil Ibriq, Mohammad Ilyas, Imad Mahgoub
2008 ch.
Encyclopedia of Wireless and Mobile Communications
Ahmed Badi, Imad Mahgoub
2007 B conf
AINA
Jamil Ibriq, Imad Mahgoub
2007 conf
ICN
Trishla Sutaria, Imad Mahgoub, Ali Humos, Ahmed Badi
2007 C conf
AICCSA
Veerendra Tippanagoudar, Imad Mahgoub, Ahmed Badi
2006 C conf
AICCSA
Abu Asaduzzaman, Imad Mahgoub
2006 J jnl
Multim. Tools Appl.
Abu Asaduzzaman, Imad Mahgoub
2004 conf
ISVLSI
Suryaprasad Jayadevappa, Ravi Shankar, Imad Mahgoub
2004 ch.
Mobile Computing Handbook
Ramandeep Singh Khurana, Imad Mahgoub, Hesham El-Rewini
2004 conf
ISMSE
Abu Asaduzzaman, Imad Mahgoub, Praveen Sanigepalli, Hari Kalva, Ravi Shankar, Borko Furht
2004 book
Handbook of Sensor Networks
Mohammad Ilyas, Imad Mahgoub
2004 book
Mohammad Ilyas, Imad Mahgoub
2000 conf
ICDCS Workshop on Wireless Networks and Mobile Computing
Ramandeep Singh Khurana, Hesham El-Rewini, Imad Mahgoub
1998 J jnl
Telecommun. Syst.
Imad Mahgoub, Chien-Jen Huang
1998 Misc conf
CATA
Abu Asaduzzaman, Imad Mahgoub, Mazin S. Yousif
1998 J jnl
Inf. Sci.
Imad Mahgoub, Ahmad Ali
1997 J jnl
Simul.
Morrison S. Obeng, Imad Mahgoub, Mohammad Ilyas
1994 J jnl
Inf. Sci.
Chien-Jen Huang, Imad Mahgoub
1986 B conf
ICPP
Imad Mahgoub, Dharma P. Agrawal
redb/extractors/extractor.py
← Index redb/extractors/extractor.py python
import hashlib
import inspect
from abc import ABCMeta, abstractmethod
from dataclasses import asdict
from functools import cached_property
from datetime import datetime, timezone
import math
from typing import Counter, List, Optional, Dict, Any, Tuple
from redb import settings
from redb.models.dataclasses import Hash
from .database_exporters import DatabaseExporter, ElasticsearchExporter, ClickHouseExporter, PrintExporter

class Extractor(metaclass=ABCMeta):
    def __init__(
        self,
        filepath: str,
        log: Any,
        exporters: Optional[List[DatabaseExporter]] = None,
        index_prefix: Optional[str] = None,
        source: Optional[str] = None,
        elastic_index: Optional[str] = None,
        known_benign: bool = False,
        known_malicious: bool = False,
        precomputed_hashes: Optional[Dict[str, str]] = None,
    ):
        self.log = log
        self.log.debug(f"Creating {self.__class__.__name__}")
        self.filepath = filepath
        self.source = source
        self.exporters = exporters or []
        self.index_prefix = index_prefix if index_prefix else settings.ELASTIC_BINARIES_COLLECTION
        self.elastic_index = self.index_prefix + (elastic_index if elastic_index else "")
        self.known_benign = known_benign
        self.known_malicious = known_malicious

        # Use precomputed hashes if provided (e.g., from machofile, pefile)
        # Otherwise compute them from binary
        if precomputed_hashes:
            self.md5 = precomputed_hashes.get('md5') or precomputed_hashes.get('MD5')
            self.sha1 = precomputed_hashes.get('sha1') or precomputed_hashes.get('SHA1')
            self.sha256 = precomputed_hashes.get('sha256') or precomputed_hashes.get('SHA256')
        else:
            self.md5 = hashlib.md5(self.binary).hexdigest()
            self.sha1 = hashlib.sha1(self.binary).hexdigest()
            self.sha256 = hashlib.sha256(self.binary).hexdigest()
        self.hash = Hash(self.md5, self.sha1, self.sha256)

    @cached_property
    def binary(self):
        with open(self.filepath, "rb") as f:
            data = f.read()
        return data

    @property
    @abstractmethod
    def tag(self):
        pass

    @abstractmethod
    def extract(self):
        """
        this method defines the extracted data
        """

    @staticmethod
    def process_binary_string(s):
        # Remove \x00 padding
        s = s.rstrip(b"\x00")

        # Check if there are any non-printable characters
        has_non_printable = any(byte < 32 or byte > 126 for byte in s)

        if not has_non_printable:
            # If all characters are printable, decode the string
            return s.decode()
        else:
            # If there are non-printable characters, represent them as \xDD
            return "".join(
                [
                    f"\\x{byte:02x}" if byte < 32 or byte > 126 else chr(byte)
                    for byte in s
                ]
            )

    @staticmethod
    def remove_non_utf8(binary_string):
        decoded = b""
        for i in range(len(binary_string)):
            try:
                # Try to decode each byte
                char = binary_string[i : i + 1].decode("utf-8")
                decoded += char.encode("utf-8")
            except UnicodeDecodeError:
                # Skip this byte if it can't be decoded
                continue
        return decoded

    def calculate_entropy(self, data):
        """Calculate the entropy of a chunk of data.
        Based on pefile.SectionStructure.entropy_H.
        """
        # self.log.debug(inspect.currentframe().f_code.co_name)
        if not data:
            return 0.0

        if type(data) == str:
            counts = Counter(data)
            frequencies = ((i / len(data)) for i in counts.values())
            return - sum(f * math.log(f, 2) for f in frequencies)
        else:
            occurences = Counter(bytearray(data))
            entropy = 0
            for x in occurences.values():
                p_x = float(x) / len(data)
                entropy -= p_x * math.log(p_x, 2)
            return entropy

    @abstractmethod
    def prepare_export_data(self, exporter_type: str) -> Tuple[List[Any], List[str], List[str]]:
        """
        Prepare data for specific export type
        Returns:
            Tuple containing:
            - data: List of values to insert
            - column_names: List of column names
            - column_type_names: List of column types
        """
        pass

    def export_data(self):
        """Export data to all configured exporters

        Returns:
            True: Export succeeded
            False: Export failed (actual error)
            None: No data to export (not an error, e.g., no overlay, no signature)
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        success = True
        extracted_data = self.extract()

        if extracted_data is None:
            self.log.debug("extract() returned None, skipping export")
            return None  # No data to export, not a failure
            
        for exporter in self.exporters:
            if isinstance(exporter, PrintExporter):
                # For PrintExporter, we pass the extracted data directly
                success &= exporter.export(extracted_data)
            else:
                # Get the data prepared for this specific exporter type
                export_data = self.prepare_export_data(exporter.__class__.__name__)
                
                if export_data is None:
                    self.log.debug(f"prepare_export_data returned None for {exporter.__class__.__name__}")
                    return False
                
                if isinstance(exporter, ElasticsearchExporter):
                    success &= exporter.export(
                        export_data,
                        index=self.elastic_index,
                        tag=self.tag(),
                        hashes=asdict(self.hash),
                        known_benign=self.known_benign,
                        known_malicious=self.known_malicious
                    )
                elif isinstance(exporter, ClickHouseExporter):
                    # For ClickHouse, we need to pass the table name and the prepared data
                    success &= exporter.export(
                        export_data,
                        table=self.get_clickhouse_table(),
                        # Add these parameters explicitly
                        column_names=export_data[1] if isinstance(export_data, tuple) else None,
                        column_type_names=export_data[2] if isinstance(export_data, tuple) else None
                    )
                
        return success

    @abstractmethod
    def get_clickhouse_table(self) -> str:
        """Return the appropriate ClickHouse table name"""
        pass
    # def export_to_elastic(self, list_of_dataclasses, tag=None):
    #     self.log.debug(inspect.currentframe().f_code.co_name)

    #     if not isinstance(list_of_dataclasses, list):
    #         self.log.error("Called export_to_elastic wrongly")

    #     now_t = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
    #     for dataclass_ in list_of_dataclasses:
    #         if not settings.ELASTIC_CLIENT.ping():
    #             self.log.error("[CONNECTION ERROR] ping to elastic failed")
            
    #         # Convert dataclass to dict and filter out None values
    #         document = {k: v for k, v in asdict(dataclass_).items() if v is not None}
            
    #         if tag:
    #             document["tag"] = [tag, self.tag()]
    #         else:
    #             document["tag"] = self.tag()
    #         hashes = asdict(self.hash)
    #         document |= hashes
    #         document["timestamp_utc"] = now_t
    #         # document["source"] = self.source
    #         document["known_benign"] = self.known_benign
    #         document["known_malicious"] = self.known_malicious

    #         if "_id" in document:
    #             tmp_id = document.pop("_id") + document["sha256"]
    #             _id = hashlib.sha256(tmp_id.encode()).hexdigest()
    #         else:
    #             _id = document["sha256"]

    #         # self.log.debug(f"[DEBUG] about to export {type(document)} {document}")
    #         try:
    #             doc_dump = json.dumps(document)
    #         except TypeError as e:
    #             self.log.error(
    #                 f"Failed export of document. " f"full document: {document}"
    #             )
    #             raise e

    #         # body={"doc": doc_dump,
    #         #       "doc_as_upsert": True  # Create the document if it doesn't exist
    #         # }

    #         # Check if the index exists, and create it if it doesn't
    #         # if not settings.ELASTIC_CLIENT.indices.exists(index=self.elastic_index):
    #         #     settings.ELASTIC_CLIENT.indices.create(index=self.elastic_index)
    #         # pprint(doc_dump) #DEBUG
    #         # print("[DEBUG] _id: " + _id)
    #         # print("[DEBUG] index: " + self.elastic_index)
    #         settings.ELASTIC_CLIENT.index(
    #             index=self.elastic_index, id=_id, document=doc_dump
    #         )