diff options
Diffstat (limited to 'tools/ghidra/create_gsp_project.py')
| -rw-r--r-- | tools/ghidra/create_gsp_project.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/tools/ghidra/create_gsp_project.py b/tools/ghidra/create_gsp_project.py new file mode 100644 index 0000000..3f505f1 --- /dev/null +++ b/tools/ghidra/create_gsp_project.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +""" +Create Ghidra project for GSP firmware analysis. +Usage: python3 create_gsp_project.py <firmware_bin> <project_dir> <project_name> +""" + +import sys +import os +import subprocess +import shutil + +def create_ghidra_project(firmware_path, project_dir, project_name): + """Create a Ghidra project and import the GSP firmware.""" + + ghidra_path = "/snap/bin/ghidra" + analyze_headless = "/snap/ghidra/47/ghidra/support/analyzeHeadless" + + if not os.path.exists(analyze_headless): + analyze_headless = "/opt/ghidra/support/analyzeHeadless" + + if not os.path.exists(analyze_headless): + print("ERROR: Ghidra analyzeHeadless not found") + sys.exit(1) + + # Create project directory + os.makedirs(project_dir, exist_ok=True) + + # Import the firmware binary + cmd = [ + analyze_headless, + project_dir, + project_name, + "-import", firmware_path, + "-processor", "RISCV:LE:64:default", + "-cspec", "gcc", + "-overwrite", + "-scriptPath", os.path.join(project_dir, "scripts"), + "-postScript", "extract_fwimage.py" + ] + + print(f"Running: {' '.join(cmd)}") + result = subprocess.run(cmd, capture_output=True, text=True) + + print(result.stdout) + if result.stderr: + print(result.stderr, file=sys.stderr) + + return result.returncode == 0 + +def main(): + if len(sys.argv) < 4: + print("Usage: create_gsp_project.py <firmware_bin> <project_dir> <project_name>") + sys.exit(1) + + firmware_path = sys.argv[1] + project_dir = sys.argv[2] + project_name = sys.argv[3] + + if not os.path.exists(firmware_path): + print(f"ERROR: Firmware not found: {firmware_path}") + sys.exit(1) + + success = create_ghidra_project(firmware_path, project_dir, project_name) + sys.exit(0 if success else 1) + +if __name__ == "__main__": + main()
\ No newline at end of file |
