R. Graham Barr

28 papers Journal 9Unranked 19
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Sneha N. Naik, Elsa D. Angelini, Eric A. Hoffman, Elizabeth C. Oelsner, R. Graham Barr, Benjamin M. Smith, Andrew F. Laine
2025 conf
ISBI
Sneha N. Naik, Elsa D. Angelini, Eric A. Hoffman, Elizabeth C. Oelsner, R. Graham Barr, Benjamin M. Smith, Andrew F. Laine
2024 conf
ISBI
Xuzhe Zhang, Elsa D. Angelini, Eric A. Hoffman, Karol E. Watson, Benjamin M. Smith, R. Graham Barr, Andrew F. Laine
2024 J jnl
CoRR
Xuzhe Zhang, Elsa D. Angelini, Eric A. Hoffman, Karol E. Watson, Benjamin M. Smith, R. Graham Barr, Andrew F. Laine
2024 J jnl
CoRR
Artur Wysoczanski, Nabil Ettehadi, Soroush Arabshahi, Yifei Sun, Karen Hinkley Stukovsky, Karol E. Watson, MeiLan K. Han, Erin D. Michos, Alejandro P. Comellas, Eric A. Hoffman, Andrew F. Laine, R. Graham Barr, Elsa D. Angelini
2024 conf
ISBI
Sneha N. Naik, Elsa D. Angelini, R. Graham Barr, Norrina Allen, Alain Bertoni, Eric A. Hoffman, Ani Manichaikul, Jim Pankow, Wendy Post, Yifei Sun, Karol E. Watson, Benjamin M. Smith, Andrew F. Laine
2023 conf
MLMI@MICCAI (1)
Muhammad F. A. Chaudhary, Seyed Soheil Hosseini, R. Graham Barr, Joseph M. Reinhardt, Eric A. Hoffman, Sarah E. Gerard
2023 conf
ISBI
Artur Wysoczanski, Elsa D. Angelini, Yifei Sun, Benjamin M. Smith, Eric A. Hoffman, Karen Stukovsky, Matthew J. Budoff, Karol E. Watson, John Jeffrey Carr, Elizabeth C. Oelsner, R. Graham Barr, Andrew F. Laine
2022 J jnl
J. Imaging
Yue Pan, Di Wang, Muhammad F. A. Chaudhary, Wei Shao, Sarah E. Gerard, Oguz C. Durumeric, Surya P. Bhatt, R. Graham Barr, Eric A. Hoffman, Joseph M. Reinhardt, Gary E. Christensen
2021 J jnl
IEEE Trans. Medical Imaging
Jie Yang, Elsa D. Angelini, Pallavi P. Balte, Eric A. Hoffman, John H. M. Austin, Benjamin M. Smith, R. Graham Barr, Andrew F. Laine
2021 J jnl
CoRR
Xinzi He, Jia Guo, Xuzhe Zhang, Hanwen Bi, Sarah E. Gerard, David W. Kaczka, Amin Motahari, Eric A. Hoffman, Joseph M. Reinhardt, R. Graham Barr, Elsa D. Angelini, Andrew Laine
2021 conf
ISBI
Artur Wysoczanski, Elsa D. Angelini, Benjamin M. Smith, Eric A. Hoffman, Grant T. Hiura, Yifei Sun, R. Graham Barr, Andrew F. Laine
2020 conf
ISBI
Yue Pan, Gary E. Christensen, Oguz C. Durumeric, Sarah E. Gerard, Surya P. Bhatt, R. Graham Barr, Eric A. Hoffman, Joseph M. Reinhardt
2020 J jnl
CoRR
Jie Yang, Elsa D. Angelini, Pallavi P. Balte, Eric A. Hoffman, John H. M. Austin, Benjamin M. Smith, R. Graham Barr, Andrew F. Laine
2019 conf
ISBI
Yu Gan, Jie Yang, Benjamin M. Smith, Pallavi P. Balte, Eric A. Hoffman, Christine P. Hendon, R. Graham Barr, Andrew F. Laine, Elsa D. Angelini
2019 conf
ISBI
Jie Yang, Thomas Vetterli, Pallavi P. Balte, R. Graham Barr, Andrew F. Laine, Elsa D. Angelini
2017 conf
ISBI
Jingkuan Song, Jie Yang, Benjamin M. Smith, Pallavi P. Balte, Eric A. Hoffman, R. Graham Barr, Andrew F. Laine, Elsa D. Angelini
2017 conf
MICCAI (1)
Jie Yang, Elsa D. Angelini, Pallavi P. Balte, Eric A. Hoffman, John H. M. Austin, Benjamin M. Smith, Jingkuan Song, R. Graham Barr, Andrew F. Laine
2016 conf
MICCAI (2)
Jie Yang, Elsa D. Angelini, Pallavi P. Balte, Eric A. Hoffman, Colin O. Wu, Bharath A. Venkatesh, R. Graham Barr, Andrew F. Laine
2016 conf
MCV/BAMBI@MICCAI
Jie Yang, Elsa D. Angelini, Benjamin M. Smith, John H. M. Austin, Eric A. Hoffman, David A. Bluemke, R. Graham Barr, Andrew F. Laine
2016 J jnl
CoRR
Jie Yang, Elsa D. Angelini, Benjamin M. Smith, John H. M. Austin, Eric A. Hoffman, David A. Bluemke, R. Graham Barr, Andrew F. Laine
2015 conf
ISBI
Yrjo Horne, Elsa D. Angelini, R. Graham Barr, Andrew F. Laine
2015 conf
ISBI
Yrjö Tapio Hame, Elsa D. Angelini, Megha A. Parikh, Benjamin M. Smith, Eric A. Hoffman, R. Graham Barr, Andrew F. Laine
2014 J jnl
IEEE Trans. Medical Imaging
Yrjö Tapio Hame, Elsa D. Angelini, Eric A. Hoffman, R. Graham Barr, Andrew F. Laine
2013 conf
ISBI
Yrjö Tapio Hame, Elsa D. Angelini, Eric A. Hoffman, R. Graham Barr, Andrew F. Laine
2010 conf
Computer-Aided Diagnosis
Brad M. Keller, Anthony P. Reeves, R. Graham Barr, David F. Yankelevitz, Claudia I. Henschke
2009 conf
Computer-Aided Diagnosis
Brad M. Keller, Anthony P. Reeves, David F. Yankelevitz, Claudia I. Henschke, R. Graham Barr
2008 conf
Computer-Aided Diagnosis
Brad M. Keller, Anthony P. Reeves, Claudia I. Henschke, R. Graham Barr, David F. Yankelevitz
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