Jakub Wiktor Both

26 papers Journal 24Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Peter von Schultzendorff, Tor Harald Sandve, Birane Kane, David Landa-Marbán, Jakub Wiktor Both, Jan Martin Nordbotten
2026 J jnl
CoRR
Peter von Schultzendorff, Jakub Wiktor Both, Jan Martin Nordbotten, Tor Harald Sandve
2026 J jnl
CoRR
Mohammad Nooraiepour, Jakub Wiktor Both, Teeratorn Kadeethum, Saeid Sadeghnejad
2026 J jnl
CoRR
Fleurianne Bertrand, Jakub Wiktor Both, Tugay Dagli
2025 J jnl
SIAM J. Math. Anal.
Jakub Wiktor Both, Clément Cancès
2025 J jnl
CoRR
Marius Nevland, Inga Berre, Jakub Wiktor Both, Eirik Keilegavlen
2025 J jnl
CoRR
Jan M. Nordbotten, Martin A. Fernø, Bernd Flemisch, Anthony R. Kovscek, Knut-Andreas Lie, Jakub Wiktor Both, Olav Møyner, Tor Harald Sandve, Etienne Ahusborde, Sebastian Bauer, Zhangxing Chen, Holger Class, Chaojie Di, Didier Ding, David Element, Abbas Firoozabadi, Eric Flauraud, Jacques Franc, Firdovsi Gasanzade, Yousef Ghomian, Marie Ann Giddins, Christopher Green, Bruno R. B. Fernandes, George Hadjisotiriou, Glenn Hammond, Hai Huang, Dickson Kachuma, Michel Kern, Timo Koch, Prasanna Krishnamurthy, Kjetil Olsen Lye, David Landa-Marbán, Michael Nole, Paolo Orsini, Nicolas Ruby, Pablo Salinas, Mohammad Sayyafzadeh, Jakub Solovský, Jakob Torben, Adam Turner, Denis V. Voskov, Kai Wendel, AbdAllah A. Youssef
2024 J jnl
CoRR
Erlend Storvik, Cedric Riethmüller, Jakub Wiktor Both, Florin Adrian Radu
2023 J jnl
Comput. Math. Appl.
Erlend Storvik, Jakub Wiktor Both, Jan Martin Nordbotten, Florin Adrian Radu
2023 J jnl
Comput. Math. Appl.
Jakob S. Stokke, Koondanibha Mitra, Erlend Storvik, Jakub Wiktor Both, Florin A. Radu
2023 J jnl
CoRR
Jakob S. Stokke, Koondanibha Mitra, Erlend Storvik, Jakub Wiktor Both, Florin A. Radu
2023 J jnl
CoRR
Jan Martin Nordbotten, Benyamine Benali, Jakub Wiktor Both, Bergit Brattekås, Erlend Storvik, Martin A. Fernø
2022 J jnl
Appl. Math. Lett.
Erlend Storvik, Jakub Wiktor Both, Jan Martin Nordbotten, Florin Adrian Radu
2022 J jnl
CoRR
Erlend Storvik, Jakub Wiktor Both, Jan Martin Nordbotten, Florin Adrian Radu
2022 J jnl
Optim. Lett.
Jakub Wiktor Both
2021 J jnl
CoRR
Jakub Wiktor Both, Jan Martin Nordbotten, Florin Adrian Radu
2020 J jnl
CoRR
Erlend Storvik, Jakub Wiktor Both, Juan Michael Sargado, Jan Martin Nordbotten, Florin Adrian Radu
2020 J jnl
CoRR
Davide Illiano, Jakub Wiktor Both, Iuliu Sorin Pop, Florin Adrian Radu
2020 J jnl
CoRR
Jakub Wiktor Both, Nicolás A. Barnafi, Florin A. Radu, Paolo Zunino, Alfio Quarteroni
2019 J jnl
Comput. Math. Appl.
Jakub Wiktor Both, Kundan Kumar, Jan Martin Nordbotten, Florin Adrian Radu
2019 conf
ENUMATH
Markus Bause, Jakub Wiktor Both, Florin A. Radu
2019 J jnl
CoRR
Markus Bause, Jakub Wiktor Both, Florin A. Radu
2019 conf
ENUMATH
Erlend Storvik, Jakub Wiktor Both, Jan Martin Nordbotten, Florin Adrian Radu
2019 J jnl
CoRR
Erlend Storvik, Jakub Wiktor Both, Jan Martin Nordbotten, Florin Adrian Radu
2019 J jnl
CoRR
Jakub Wiktor Both, Kundan Kumar, Jan Martin Nordbotten, Florin Adrian Radu
2017 J jnl
Appl. Math. Lett.
Jakub Wiktor Both, Manuel Borregales, Jan Martin Nordbotten, Kundan Kumar, Florin Adrian Radu
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