summaryrefslogtreecommitdiffstats
path: root/tools/ghidra/create_gsp_project.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ghidra/create_gsp_project.py')
-rw-r--r--tools/ghidra/create_gsp_project.py67
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