James D. Carswell

35 papers B 1C 13Misc 1Journal 9Unranked 10
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Lasith Niroshan, James D. Carswell
2024 J jnl
CoRR
Lasith Niroshan, James D. Carswell
2023 C conf
W2GIS
Lasith Niroshan, James D. Carswell
2022 conf
AGILE Conf.
Lasith Niroshan, James D. Carswell
2022 C conf
W2GIS
Lasith Niroshan, James D. Carswell
2020 B conf
CHASE
Fatemeh Naderifar, Basil Lim, James D. Carswell
2016 J jnl
J. Locat. Based Serv.
Keith Gardiner, Charlie Cullen, James D. Carswell
2015 conf
IF&GIS
Andrea Ballatore, Thanh Thoa Pham Thi, Junjun Yin, Linh Truong-Hong, James D. Carswell
2015 conf
DEXA (2)
Keith Gardiner, Charlie Cullen, James D. Carswell
2013 C conf
W2GIS
Thanh Thoa Pham Thi, Linh Truong-Hong, Junjun Yin, James D. Carswell
2013 J jnl
ISPRS Int. J. Geo Inf.
Viacheslav Filonenko, Charlie Cullen, James D. Carswell
2013 conf
ICCSA (4)
Linh Truong-Hong, Thanh Thoa Pham Thi, Junjun Yin, James D. Carswell
2013 J jnl
ISPRS Int. J. Geo Inf.
Junjun Yin, James D. Carswell
2012 C conf
W2GIS
Viacheslav Filonenko, Charlie Cullen, James D. Carswell
2012 C conf
W2GIS
Junjun Yin, James D. Carswell
2012 conf
Geoinformatics
James D. Carswell, Junjun Yin
2010 C conf
IPIN
Viacheslav Filonenko, Charlie Cullen, James D. Carswell
2010 J jnl
Trans. GIS
James D. Carswell, Keith Gardiner, Junjun Yin
2009 C conf
W2GIS
Keith Gardiner, Junjun Yin, James D. Carswell
2009 C ed.
W2GIS
James D. Carswell, A. Stewart Fotheringham, Gavin McArdle
2008 C conf
ICDS
John McAuley, James D. Carswell
2007 C conf
W2GIS
Seamus Rooney, Keith Gardiner, James D. Carswell
2006 C conf
W2GIS
Andrea Rizzini, Keith Gardiner, Michela Bertolotto, James D. Carswell
2006 J jnl
Comput. Environ. Urban Syst.
Michela Bertolotto, James D. Carswell, Eoin McLoughlin, Dympna O'Sullivan, David C. Wilson
2006 C ed.
W2GIS
James D. Carswell, Taro Tezuka
2005 conf
ER (Workshops)
Joe Hegarty, James D. Carswell
2005 C conf
W2GIS
Joe Hegarty, James D. Carswell
2004 Misc conf
SAC
James D. Carswell, Keith Gardiner, Marco Neumann
2003 conf
WISE Workshops
Keith Gardiner, James D. Carswell
2002 conf
DEXA Workshops
James D. Carswell, Alan Eustace, Keith Gardiner, Eoin Kilfeather, Marco Neumann
2002 conf
ECCBR
James D. Carswell, David C. Wilson, Michela Bertolotto
2002 J jnl
Int. J. Geogr. Inf. Sci.
Anthony Stefanidis, Peggy Agouris, Charalampos Georgiadis, Michela Bertolotto, James D. Carswell
2001 conf
WISE (2)
Michela Bertolotto, James D. Carswell, Liam McGeown, John McMahon
2000
James D. Carswell
1999 J jnl
J. Vis. Commun. Image Represent.
Peggy Agouris, Anthony Stefanidis, James D. Carswell
redb/extractors/decompiler/_archive/ghidra-test.py
← Index redb/extractors/decompiler/_archive/ghidra-test.py python
import subprocess
import json
import os
import tempfile
import uuid
import shutil
import sys
import time


def run_command(cmd, env=None):
    try:
        print(f"Starting command: {' '.join(cmd)}")
        start_time = time.time()
        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

        stdout, stderr = process.communicate()
        end_time = time.time()

        print(f"Command finished. Execution time: {end_time - start_time:.2f} seconds")
        print(f"Return code: {process.returncode}")

        if process.returncode != 0:
            print(f"Error output:\n{stderr}")
            return None
        return stdout
    except Exception as e:
        print(f"Error running command {' '.join(cmd)}: {e}")
        return None


def analyze_binary(ghidra_path, binary_path, java_script_path):
    print(f"Ghidra path: {ghidra_path}")
    print(f"Binary path: {binary_path}")
    print(f"Java script path: {java_script_path}")

    # Check if Java script exists
    if not os.path.exists(java_script_path):
        print(f"Error: Java script not found at {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', '')}"

    # Print environment variables for debugging
    print(f"JAVA_HOME: {env['JAVA_HOME']}")
    print(f"PATH: {env['PATH']}")
    print(f"LD_LIBRARY_PATH: {env['LD_LIBRARY_PATH']}")

    # Check Ghidra installation
    analyzeHeadless_path = f"{ghidra_path}/support/analyzeHeadless"
    print(f"analyzeHeadless exists: {os.path.exists(analyzeHeadless_path)}")

    print(f"Binary file exists: {os.path.exists(binary_path)}")

    # Check Java
    java_version = run_command(["java", "-version"], env=env)
    print(f"Java version: {java_version}")

    # Create a temporary project directory
    project_path = tempfile.gettempdir() + "/ghidra_" + str(uuid.uuid4())
    os.makedirs(project_path, exist_ok=True)
    print(f"Created temporary project path: {project_path}")
    output_file = ""

    try:
        # Run Ghidra's headless analyzer
        analyze_cmd = [
            analyzeHeadless_path,
            project_path,
            "TempProject",
            "-import",
            binary_path,
            "-postScript",
            java_script_path,
            "-deleteProject",
        ]

        result = run_command(analyze_cmd, env=env)
        if result is None:
            return None

        # Read the output JSON file
        output_file = "ghidra_output.json"
        if os.path.exists(output_file):
            with open(output_file, "r") as f:
                functions = json.load(f)
            return functions
        else:
            print(
                f"Output file {output_file} not found. Ghidra analysis may have failed."
            )
            # List files in the current directory
            print("Files in the current directory:")
            print("\n".join(os.listdir(".")))
            return None
    finally:
        # Clean up
        if os.path.exists(output_file):
            os.remove(output_file)
        if os.path.exists(project_path):
            shutil.rmtree(project_path)


# Example usage
if __name__ == "__main__":
    # if len(sys.argv) != 4:
    #     print("Usage: python script.py <ghidra_path> <binary_path> <java_script_path>")
    #     sys.exit(1)

    # ghidra_path = sys.argv[1]
    # binary_path = sys.argv[2]
    # java_script_path = sys.argv[3]

    ghidra_path = "/opt/ghidra"
    binary_path = "/home/p4c0/dev/redb/test_files/hello"
    java_script_path = (
        "/opt/ghidra/Ghidra/Features/Base/ghidra_scripts/GhidraDecompilerScript.java"
    )

    functions = analyze_binary(ghidra_path, binary_path, java_script_path)

    if functions:
        print(f"Extracted functions from {binary_path}:")
        for func in functions:
            print(f"\nFunction: {func['name']}")
            print(f"Address: {func['address']}")
            print(f"Decompiled code:\n{func['decompiled']}")
    else:
        print("Failed to extract functions.")