James Zachary Hare

40 papers A* 3C 7Misc 4Journal 20Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Nikunj Gupta, James Zachary Hare, Jesse Milzman, Rajgopal Kannan, Viktor K. Prasanna
2025 J jnl
IEEE Trans. Signal Process.
James Zachary Hare, Yuchen Liang, Lance M. Kaplan, Venugopal V. Veeravalli
2025 J jnl
CoRR
Nikunj Gupta, James Zachary Hare, Rajgopal Kannan, Viktor K. Prasanna
2025 Misc conf
ICASSP
James Zachary Hare, Lance M. Kaplan, Venugopal V. Veeravalli, Don Towsley
2025 J jnl
CoRR
Nikunj Gupta, Ludwika Twardecka, James Zachary Hare, Jesse Milzman, Rajgopal Kannan, Viktor K. Prasanna
2025 C conf
FUSION
Lance M. Kaplan, James Zachary Hare, Parth Paritosh
2025 conf
MILCOM
Adarsh M. Subramaniam, Argyrios Gerogiannis, James Zachary Hare, Venugopal V. Veeravalli
2025 J jnl
IEEE Trans. Signal Process.
Adarsh M. Subramaniam, Argyrios Gerogiannis, James Zachary Hare, Venugopal V. Veeravalli
2025 Misc conf
ICASSP
Adarsh M. Subramaniam, Argyrios Gerogiannis, James Zachary Hare, Venugopal V. Veeravalli
2024 J jnl
CoRR
Ahaan Dabholkar, James Zachary Hare, Mark R. Mittrick, John T. Richardson, Nicholas R. Waytowich, Priya Narayanan, Saurabh Bagchi
2024 C conf
FUSION
Lance M. Kaplan, James Zachary Hare
2024 J jnl
CoRR
Indranil Sur, Aswin Raghavan, Abrar Rahman, James Zachary Hare, Daniel N. Cassenti, Carl E. Busart
2024 C conf
FUSION
James Zachary Hare, Yuchen Liang, Lance M. Kaplan, Venugopal V. Veeravalli
2024 conf
IEEECONF
César A. Uribe, James Zachary Hare, Lance M. Kaplan, Ali Jadbabaie
2024 conf
MILCOM
Amir Reza Ramtin, James Zachary Hare, Lance M. Kaplan, Philippe Nain, Venugopal V. Veeravalli, Don Towsley
2024 J jnl
CoRR
Sean Kulinski, Nicholas R. Waytowich, James Zachary Hare, David I. Inouye
2023 J jnl
CoRR
Peihong Yu, Bhoram Lee, Aswin Raghavan, Supun Samarasekera, Pratap Tokekar, James Zachary Hare
2023 Misc conf
ICASSP
James Zachary Hare, Lance M. Kaplan
2023 A* conf
CVPR
Sean Kulinski, Nicholas R. Waytowich, James Zachary Hare, David I. Inouye
2022 J jnl
CoRR
Nicholas R. Waytowich, James Zachary Hare, Vinicius G. Goecks, Mark R. Mittrick, John T. Richardson, Anjon Basak, Derrik E. Asher
2022 C conf
FUSION
James Zachary Hare, Lance M. Kaplan
2021 J jnl
IEEE Trans. Signal Inf. Process. over Networks
James Zachary Hare, César A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2021 conf
HCI (9)
Simon Su, Sue Kase, Chou P. Hung, James Zachary Hare, Berend Christopher Rinderspacher, Charles Amburn
2021 conf
CDC
James Zachary Hare, César A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2021 C conf
FUSION
James Zachary Hare, Lance M. Kaplan, Venugopal V. Veeravalli
2020 J jnl
CoRR
James Zachary Hare, César A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2020 Misc conf
ICASSP
James Zachary Hare, César A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2020 J jnl
IEEE Trans. Signal Process.
James Zachary Hare, César A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2020 C conf
ACC
James Zachary Hare, Cesar A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2020 J jnl
ACM Trans. Sens. Networks
James Zachary Hare, Junnan Song, Shalabh Gupta, Thomas A. Wettergren
2019 J jnl
CoRR
James Zachary Hare, César A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2019 conf
CDC
César A. Uribe, James Zachary Hare, Lance M. Kaplan, Ali Jadbabaie
2019 J jnl
CoRR
César A. Uribe, James Zachary Hare, Lance M. Kaplan, Ali Jadbabaie
2019 J jnl
CoRR
James Zachary Hare, Cesar A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2019 C conf
FUSION
James Zachary Hare, César A. Uribe, Lance M. Kaplan, Ali Jadbabaie
2019 J jnl
IEEE Trans. Control. Netw. Syst.
James Zachary Hare, Shalabh Gupta, Thomas A. Wettergren
2019 J jnl
CoRR
James Zachary Hare, Junnan Song, Shalabh Gupta, Thomas A. Wettergren
2018 J jnl
IEEE Trans. Cybern.
James Zachary Hare, Shalabh Gupta, Thomas A. Wettergren
2015 A* conf
ICRA
James Zachary Hare, Shalabh Gupta, James Wilson
2015 A* conf
ICRA
James Wilson, Nayeff Najjar, James Zachary Hare, Shalabh Gupta
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