Malik Haddad

33 papers Journal 1Unranked 31
YearRankTypeTitle / Venue / Authors
2022 conf
BECB
Martin Langner, David A. Sanders, Giles Tewkesbury, Shikun Zhou, Malik Haddad
2022 ch.
Advances in Intelligent Systems Research and Innovation
David A. Sanders, Malik Haddad, Giles Tewkesbury, Tom Barker, Martin Langner, Alexander E. Gegov
2021 conf
IntelliSys (3)
Peter Omoarebun, David A. Sanders, Favour Ikwan, Malik Haddad, Giles Tewkesbury, Mohamed Hassan
2021 conf
IntelliSys (1)
David A. Sanders, Malik Haddad, Giles Tewkesbury, Alexander E. Gegov, Mo Adda
2021 conf
IntelliSys (1)
Giles Tewkesbury, Samuel Lifton, Malik Haddad, David A. Sanders, Alexander E. Gegov
2021 J jnl
Int. J. Inf. Decis. Sci.
Malik Haddad, David Sanders, Giles Tewkesbury, Nils Bausch
2021 conf
IntelliSys (1)
David A. Sanders, Giles Tewkesbury, Malik Haddad, Ya Huang, Boriana Vatchova
2021 conf
IntelliSys (1)
Malik Haddad, David A. Sanders, Giles Tewkesbury, Martin Langner, Sarinova Simandjuntak
2021 conf
IntelliSys (1)
Malik Haddad, David A. Sanders, Martin Langner, Giles Tewkesbury
2021 conf
ITSC
David Sanders, Giles Tewkesbury, Malik Haddad, Zoubir Zouaoui, Sarinova Simandjuntak
2020 conf
IEEE Conf. on Intelligent Systems
Peter Osagie Omoarebun, David A. Sanders, Malik Haddad, Mohamed Hassan, Giles Tewkesbury, Khaled Giasin
2020 conf
IEEE Conf. on Intelligent Systems
David A. Sanders, Malik Haddad, Giles Tewkesbury, Nils Bausch, Ian Rogers, Ya Huang
2020 conf
IEEE Conf. on Intelligent Systems
Giles Tewkesbury, David A. Sanders, Malik Haddad, Peter Osagie Omoarebun, Alexander E. Gegov, Simon Chester
2020 conf
IEEE Conf. on Intelligent Systems
Malik Haddad, David A. Sanders, Martin Langner, Peter Omoarebun, Mohamad Thabet, Alexander E. Gegov
2020 conf
IntelliSys (3)
David Sanders, Malik Haddad, Peter Omoarebun, Favour Ikwan, John Chiverton, Shikun Zhou, Ian Rogers, Boriana Vatchova
2020 conf
IntelliSys (3)
Malik Haddad, David A. Sanders, Martin Langner, Nils Bausch, Mohamad Thabet, Alexander E. Gegov, Giles Tewkesbury, Favour Ikwan
2020 conf
IEEE Conf. on Intelligent Systems
Mohamad Thabet, David A. Sanders, Victor M. Becerra, Giles Tewkesbury, Malik Haddad, Tom Barker
2020 conf
IEEE Conf. on Intelligent Systems
Malik Haddad, David A. Sanders, Favour Ikwan, Mohamad Thabet, Martin Langner, Alexander E. Gegov
2020 conf
IntelliSys (3)
Peter Omoarebun, David A. Sanders, Favour Ikwan, Mohamed Hassan, Malik Haddad, Mohamad Thabet, Jake Piner, Amjad Shah
2020 conf
IntelliSys (3)
Favour Ikwan, David A. Sanders, Malik Haddad, Mohamed Hassan, Peter Omoarebun, Mohamad Thabet, Giles Tewkesbury, Branislav Vuksanovic
2020 conf
IntelliSys (3)
Malik Haddad, David Sanders, Martin Langner, Mohamad Thabet, Peter Omoarebun, Alexander E. Gegov, Nils Bausch, Khaled Giasin
2020 conf
IntelliSys (3)
David A. Sanders, Malik Haddad, Martin Langner, Peter Omoarebun, John Chiverton, Mohamed Hassan, Shikun Zhou, Boriana Vatchova
2020 conf
IntelliSys (3)
Mohamad Thabet, David A. Sanders, Malik Haddad, Nils Bausch, Giles Tewkesbury, Victor M. Becerra, Tom Barker, Jake Piner
2020 conf
IEEE Conf. on Intelligent Systems
David A. Sanders, Malik Haddad, Giles Eric Tewkesbury, Mohamad Thabet, Peter Osagie Omoarebun, Tom Barker
2020 conf
IEEE Conf. on Intelligent Systems
Malik Haddad, David A. Sanders, Martin Langner, Favour Ikwan, Giles Tewkesbury, Alexander E. Gegov
2020 conf
IntelliSys (3)
Malik Haddad, David A. Sanders, Mohamad Thabet, Alexander E. Gegov, Favour Ikwan, Peter Omoarebun, Giles Tewkesbury, Mohamed Hassan
2019 conf
IntelliSys (1)
Malik Haddad, David A. Sanders, Alexander E. Gegov, Mohamed Hassan, Ya Huang, Mohamed Al-Mosawi
2019 conf
IntelliSys (1)
Nils Bausch, Peter Shilling, David A. Sanders, Malik Haddad, Ogechukwu Okonor, Giles Tewkesbury
2019 conf
IntelliSys (1)
Malik Haddad, David A. Sanders, Giles Tewkesbury, Alexander E. Gegov, Mohamed Hassan, Favour Ikwan
2019 conf
IntelliSys (1)
Giles Tewkesbury, David A. Sanders, Malik Haddad, Nils Bausch, Alexander E. Gegov, Ogechukwu Okonor
2018 conf
IntelliSys (1)
David A. Sanders, Alexander E. Gegov, Malik Haddad, Favour Ikwan, David Wiltshire, Yong Chai Tan
2018 conf
IntelliSys (1)
Malik Haddad, David A. Sanders, Nils Bausch, Giles Tewkesbury, Alexander E. Gegov, Mohamed Hassan
2018 conf
IntelliSys (2)
David Adrian Sanders, David Charles Robinson, Mohamed Hassan, Malik Haddad, Alexander E. Gegov, Nadia Ahmed
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