Jan F. Broenink

58 papers A 1B 1C 8Journal 8Unranked 32
YearRankTypeTitle / Venue / Authors
2022 conf
AIM
Reynaldo Cobos Méndez, Jan F. Broenink, Douwe Dresscher
2022 conf
RoSE@ICSE
Reynaldo Cobos Méndez, Eddo Hobert, Douwe Dresscher, Jan F. Broenink
2021 conf
RoSE@ICSE
Reynaldo Cobos Méndez, Douwe Dresscher, Jan F. Broenink
2020 conf
IRC
Mohamed A. Abdelhady, Douwe Dresscher, Jan F. Broenink
2020 conf
ICPS
Tim Broenink, Bas Jansen, Jan F. Broenink
2019 conf
FACS
Reynaldo Cobos Méndez, Julio de Oliveira Filho, Douwe Dresscher, Jan F. Broenink
2019 conf
ICPS
Thomas Nägele, Tim Broenink, Jozef Hooman, Jan F. Broenink
2019 C conf
ECMS
Tim Broenink, Jan F. Broenink
2018 C conf
ECMS
T. G. Broenink, Jan F. Broenink
2018 conf
ICPS
Thomas Nägele, Jozef Hooman, Tim Broenink, Jan F. Broenink
2017 A conf
IROS
Robin Appel, Hendrik Folmer, Jan Kuper, Rinse Wester, Jan F. Broenink
2016 conf
SoSE
Jan F. Broenink, Peter-Jan D. Vos, Zhou Lu, Maarten M. Bezemer
2016 conf
STAF Doctoral Symposium / Showcase
Hans Vangheluwe, Vasco Amaral, Holger Giese, Jan F. Broenink, Bernhard Schätz, Alexander Norta, Paulo Carreira, Ivan Lukovic, Tanja Mayerhofer, Manuel Wimmer, Antonio Vallecillo
2016 book
G. Maarten Bonnema, Karel Th. Veenvliet, Jan F. Broenink
2016 J jnl
Syst.
G. Maarten Bonnema, Jan F. Broenink
2015 C conf
ETFA
Maarten M. Bezemer, Jan F. Broenink
2015 J jnl
Electron. J. Graph Theory Appl.
Antoon Hendrik Boode, Hajo Broersma, Jan F. Broenink
2014 J jnl
Adv. Eng. Informatics
Yunyun Ni, Jan F. Broenink
2014 ch.
Collaborative Design for Embedded Systems
Marcel Verhoef, Kenneth Pierce, Carl Gamble, Jan F. Broenink
2014 conf
SIMPAR
Douwe Dresscher, Michiel van der Coelen, Jan F. Broenink, Stefano Stramigioli
2014 conf
SIMPAR
Yury Brodskiy, Robert J. W. Wilterdink, Stefano Stramigioli, Jan F. Broenink
2014 ed.
SIMPAR
Davide Brugali, Jan F. Broenink, Torsten Kroeger, Bruce A. MacDonald
2013 ed.
CPA
Peter H. Welch, Frederick R. M. Barnes, Jan F. Broenink, Kevin Chalmers, Jan Bækgaard Pedersen, Adam T. Sampson
2013 conf
CPA
Antoon Hendrik Boode, Hajo Broersma, Jan F. Broenink
2012 C conf
SIMULTECH
Xiaochen Zhang, Jan F. Broenink
2012 C conf
WETICE
Ken G. Pierce, Carl Gamble, Yunyun Ni, Jan F. Broenink
2012 conf
CPA
Maarten M. Bezemer, Robert J. W. Wilterdink, Jan F. Broenink
2012 conf
ICSAMOS
Jan F. Broenink, Yunyun Ni
2012 conf
CPA
Oguzcan Oguz, Jan F. Broenink, Angelika Mader
2011 ed.
CPA
Peter H. Welch, Adam T. Sampson, Jan Bækgaard Pedersen, Jon M. Kerridge, Jan F. Broenink, Frederick R. M. Barnes
2011 C conf
SIMULTECH
Xiaochen Zhang, Jan F. Broenink
2011 conf
CPA
Maarten M. Bezemer, Robert J. W. Wilterdink, Jan F. Broenink
2010 conf
ISR/ROBOTIK
Rainer Bischoff, Tim Guhl, Erwin Prassler, Walter Nowak, Gerhard K. Kraetzschmar, Herman Bruyninckx, Peter Soetens, Martin Hägele, Andreas Pott, Peter C. Breedveld, Jan F. Broenink, Davide Brugali, Nicola Tomatis
2010 conf
SERENE
Jan F. Broenink, Christian Kleijn, Peter Gorm Larsen, Dusko S. Jovanovic, Marcel Verhoef, Kenneth Pierce
2009 conf
CPA
Maarten M. Bezemer, Marcel A. Groothuis, Jan F. Broenink
2009 J jnl
Electron. Commun. Eur. Assoc. Softw. Sci. Technol.
Marcel A. Groothuis, Raymond Frijns, Jeroen Voeten, Jan F. Broenink
2009 conf
CPA
Marcel A. Groothuis, Jan F. Broenink
2009 ed.
CPA
Peter H. Welch, Herman W. Roebbers, Jan F. Broenink, Fred R. M. Barnes, Carl G. Ritson, Adam T. Sampson, Gardiner S. Stiles, Brian Vinter
2008 J jnl
Simul.
Pieter J. L. Cuijpers, Jan F. Broenink, Pieter J. Mosterman
2008 conf
CPA
Hans T. J. van der Steen, Marcel A. Groothuis, Jan F. Broenink
2008 conf
CPA
Marcel A. Groothuis, Jasper J. P. van Zuijlen, Jan F. Broenink
2008 ed.
CPA
Peter H. Welch, Susan Stepney, Fiona Polack, Fred R. M. Barnes, Alistair A. McEwan, Gardiner S. Stiles, Jan F. Broenink, Adam T. Sampson
2008 C conf
ETFA
Marcel A. Groothuis, Arjen S. Damstra, Jan F. Broenink
2007 conf
ACSD
Jinfeng Huang, Jeroen Voeten, Marcel A. Groothuis, Jan F. Broenink, Henk Corporaal
2007 conf
CPA
Bojan Orlic, Jan F. Broenink
2007 B conf
IFM
Marcel Verhoef, Peter Visser, Jozef Hooman, Jan F. Broenink
2007 conf
CPA
Bojan Orlic, Jan F. Broenink
2006 conf
CPA
Bojan Orlic, Jan F. Broenink
2006 conf
CPA
Bojan Orlic, Jan F. Broenink
2005 conf
CPA
Dusko S. Jovanovic, Bojan E. Orlic, Jan F. Broenink
2005 ed.
CPA
Jan F. Broenink, Herman W. Roebbers, Johan P. E. Sunter, Peter H. Welch, David C. Wood
2005 conf
CPA
Marcel A. Groothuis, Geert K. Liet, Jan F. Broenink
2000 C conf
ISORC
Gerald H. Hilderink, Andry W. P. Bakkers, Jan F. Broenink
1999 J jnl
Simul. Pract. Theory
Jan F. Broenink
1998 J jnl
Simul.
Arno Breunese, Jan L. Top, Jan F. Broenink, J. M. Akkermans
1998 conf
ESM
Jan F. Broenink, Martijn Visser, Martin L. J. Tiernego
1997 J jnl
IEEE Trans. Robotics Autom.
Ernest D. Fasse, Jan F. Broenink
1996 conf
ESM
Jan F. Broenink, Paul B. T. Weustink
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