Hamid Harroud

36 papers B 3C 4Journal 9Unranked 18
YearRankTypeTitle / Venue / Authors
2025 J jnl
Algorithms
Abdelkarim Bettahi, Fatima-Zahra Belouadha, Hamid Harroud
2025 J jnl
IEEE Access
Abdelkarim Bettahi, Fatima-Zahra Beloudha, Hamid Harroud
2025 J jnl
Algorithms
Abdelkarim Bettahi, Hamid Harroud, Fatima-Zahra Belouadha
2018 ed.
AFRICATEK
Fatna Belqasmi, Hamid Harroud, Max Agueh, Rachida Dssouli, Faouzi Kamoun
2016 J jnl
Int. J. Adapt. Resilient Auton. Syst.
Khadija Akherfi, Hamid Harroud, Michael Gerndt
2015 J jnl
Int. J. Pervasive Comput. Commun.
Mehdia Ajana El-Khaddar, Mhammed Chraibi, Hamid Harroud, Mohammed Boulmalf, Mohammed Elkoutbi, Abdelilah Maach
2015 conf
CTS
Youness Takhma, Tajjeeddine Rachidi, Hamid Harroud, Mohamed Riduan Abid, Nasser Assem
2014 conf
ICMCS
Khadija Akherfi, Hamid Harroud, Michael Gerndt
2014 conf
FiCloud
Mhammed Chraibi, Mehdia Ajana El-Khaddar, Hamid Harroud, Abdelilah Maach, Mohammed Elkoutbi
2013 C conf
AICCSA
Hind Saddiki, L. Bahri, Hamid Harroud
2013 C conf
iiWAS
Mhammed Chraibi, Hamid Harroud, Abdelilah Maach
2012 conf
ICMCS
Mohammed Boulmalf, Ahmed Belgana, Tayeb Sadiki, Sara Hussein, Tarik Aouam, Hamid Harroud
2012 conf
ICMCS
Hind Saddiki, Hamid Harroud
2012 conf
ICMCS
Mehdia Ajana El-Khaddar, Hamid Harroud, Mohammed Boulmalf, Mohammed Elkoutbi, Ahmed Habbani
2012 conf
ITHET
Yousra Chtouki, Hamid Harroud, Mohammed Khalidi, Samir Bennani
2011 J jnl
Int. J. Mob. Comput. Multim. Commun.
Mehdia E. Ajana, Hamid Harroud, Mohammed Boulmalf, Mohammed Elkoutbi
2011 C conf
MoMM
Mhammed Chraibi, Hamid Harroud, Ahmed Karmouch
2011 B conf
IWCMC
Yassine Jiber, Hamid Harroud, Ahmed Karmouch
2010 B conf
IWCMC
Mariam Ouanaim, Hamid Harroud, Aziz Berrado, Mohammed Boulmalf
2009 conf
WINSYS
Y. Bouzid, Hamid Harroud, Aziz Berrado, Mohammed Boulmalf, Ahmed Karmouch
2009 B conf
WiMob
Mehdia E. Ajana, Mohammed Boulmalf, Hamid Harroud, Habib Hamam
2009 J jnl
Int. J. Auton. Adapt. Commun. Syst.
Tarik Aouam, Mohammed Boulmalf, Hamid Harroud
2009 conf
ICT
Y. Bouzid, Hamid Harroud, Mohammed Boulmalf, Ahmed Karmouch
2009 C conf
AICCSA
Mohammed Boulmalf, Jawad Abrache, Tarik Aouam, Hamid Harroud
2007 J jnl
Multim. Tools Appl.
Mohamed Ahmed, Hamid Harroud, Roger Impey, Ahmed Karmouch
2007 conf
CCNC
Nancy Samaan, Hamid Harroud, Ahmed Karmouch
2006 conf
Autonomic Networking
Hamid Harroud, Ahmed Karmouch
2006 ch.
The Handbook of Mobile Middleware
Hamid Harroud, Dineshbalu Balakrishnan, Ahmed Karmouch
2005 conf
AICT/SAPIR/ELETE
Hamid Harroud, Ahmed Karmouch
2004 conf
MATA
Hamid Harroud, Mohamed Khedr, Ahmed Karmouch
2003 J jnl
IEEE Trans. Mob. Comput.
Hamid Harroud, Mohamed Ahmed, Ahmed Karmouch
2002 conf
IMSA
Hamid Harroud, Ahmed Karmouch
2002 conf
MATA
Mohamed Ahmed, Hamid Harroud, Roger Impey, Ahmed Karmouch
2001 conf
MATA
Mouhsine Lakhdissi, Hamid Harroud, Ahmed Karmouch, Clifford Grossner
2001 conf
ICEIS (2)
Hamid Harroud, Mohamed Ahmed, Ahmed Karmouch
2001 conf
MMNS
Hamid Harroud, Mouhsine Lakhdissi, Ahmed Karmouch, Clifford Grossner
redb/extractors/decompiler/_archive/DecompileGhidra-old.py
← Index redb/extractors/decompiler/_archive/DecompileGhidra-old.py python
from hashlib import sha256
import inspect
from pathlib import Path
import subprocess
import json
import subprocess
import json
import os
import tempfile
import uuid
import shutil
import time

from dotenv import load_dotenv

from redb.extractors.enum import Tag
from redb.models.dataclasses import Decompiled
from redb.extractors.extractor import Extractor


class DecompileGhidra(Extractor):
    def __init__(
        self,
        filepath,
        log,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
    ):
        super().__init__(
            filepath, log, index_prefix, elastic_index, known_benign, known_malicious
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.elastic_index = self.index_prefix + "-ghidra"
        self.ghidra_path = "/opt/ghidra"
        self.java_script_path = (
            self.ghidra_path
            + "/Ghidra/Features/Base/ghidra_scripts/GhidraDecompilerScript.java"
        )
        self.decompiled = None
        load_dotenv()
        self.decompiled_folder = os.getenv("DECOMPILED_FOLDER", "/opt/decompiled")
        self.log.debug(f"Decompiled folder: {self.decompiled_folder}")

    def run_command(self, cmd, env=None):
        try:
            self.log.info(f"Starting command: {' '.join(cmd)}")
            start_time = time.time()
            TIMEOUT = 1200  # 20 minutes in seconds
            process = subprocess.Popen(
                cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
            )

            while True:
                output = process.stdout.readline()
                if output:
                    print(output.strip())
                if process.poll() is not None:
                    break
            try:
                stdout, stderr = process.communicate(timeout=TIMEOUT)
            except subprocess.TimeoutExpired:
                process.kill()
                self.log.error(f"Ghidra timed out after {TIMEOUT} seconds")
                # raise subprocess.TimeoutExpired(process.args, TIMEOUT)
                return None
            end_time = time.time()

            self.log.debug(
                f"Command finished. Execution time: {end_time - start_time:.2f} seconds"
            )
            self.log.debug(f"Return code: {process.returncode}")

            if process.returncode != 0:
                self.log.error(f"Error output:\n{stderr}")
                return None
            return stdout
        except Exception as e:
            self.log.error(f"Error running command {' '.join(cmd)}: {e}")
            return None

    def analyze_binary(self):
        self.log.debug(f"Ghidra path: {self.ghidra_path}")
        self.log.debug(f"Binary path: {self.filepath}")
        self.log.debug(f"Java script path: {self.java_script_path}")

        # Check if Java script exists
        if not os.path.exists(self.java_script_path):
            self.log.error(f"Error: Java script not found at {self.java_script_path}")
            return None

        # Set up environment variables
        env = os.environ.copy()
        java_home = "/usr/lib/jvm/java-17-openjdk-amd64"  # Adjust this path if needed
        env["JAVA_HOME"] = java_home
        env["PATH"] = f"{java_home}/bin:{env['PATH']}"
        env["LD_LIBRARY_PATH"] = f"{java_home}/lib:{env.get('LD_LIBRARY_PATH', '')}"
        env["DECOMPILED_FOLDER"] = self.decompiled_folder

        # Print environment variables for debugging
        self.log.debug(f"JAVA_HOME: {env['JAVA_HOME']}")
        self.log.debug(f"PATH: {env['PATH']}")
        self.log.debug(f"LD_LIBRARY_PATH: {env['LD_LIBRARY_PATH']}")

        # Check Ghidra installation
        analyzeHeadless_path = f"{self.ghidra_path}/support/analyzeHeadless"
        self.log.debug(
            f"analyzeHeadless exists: {os.path.exists(analyzeHeadless_path)}"
        )

        # Create a temporary project directory
        project_path = tempfile.gettempdir() + "/ghidra_" + str(uuid.uuid4())
        os.makedirs(project_path, exist_ok=True)
        self.log.debug(f"Created temporary project path: {project_path}")
        output_file = ""

        try:
            # Run Ghidra's headless analyzer
            analyze_cmd = [
                analyzeHeadless_path,
                project_path,
                "TempProject",
                "-import",
                self.filepath,
                "-postScript",
                self.java_script_path,
                self.sha256,
                "-deleteProject",
            ]

            result = self.run_command(analyze_cmd, env=env)
            if result is None:
                return None

            # Read the output JSON file
            output_file = os.path.join(
                self.decompiled_folder, self.sha256 + "-decompiled.json"
            )
            if os.path.exists(output_file):
                with open(output_file, "r") as f:
                    functions = json.load(f)
                return functions
            else:
                self.log.error(
                    f"Output file {output_file} not found. Ghidra analysis may have failed."
                )
                return None
        finally:
            # Clean up
            if os.path.exists(project_path):
                shutil.rmtree(project_path)
                self.log.debug(f"Deleted temporary project path: {project_path}")

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            functions = self.analyze_binary()

            if functions:
                self.log.info(f"Extracted functions from {self.filepath}:")
                for func in functions:
                    id = sha256(func["address"].encode()).hexdigest()
                    self.decompiled = Decompiled(
                        _id=id,
                        decompiled_function_name=func["name"],
                        decompiled_function_address=func["address"],
                        decompiled_function=func["decompiled"],
                    )
                    self.export_to_elastic([self.decompiled])
            else:
                self.log.error("No decompiled functions extracted.")
            return True
        except Exception as e:
            self.log.error(f"Error extracting decompiled information: {e}")
            return None

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