summaryrefslogtreecommitdiffstats
path: root/tools/ghidra/gsp-tu104-570.144/scripts/extract_fwimage.py
blob: d8b0bfd804a7d66e1047d70f1feb0e4f4c37ec4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Ghidra script to extract .fwimage section from GSP firmware ELF
# Usage: analyzeHeadless ... -postScript extract_fwimage.py

import sys
import os

# Get the current program
program = getCurrentProgram()

# Get the .fwimage section
fwimage_section = program.getSection(".fwimage")
if not fwimage_section:
    print("No .fwimage section found")
    sys.exit(1)

print(f"Found .fwimage section: {fwimage_section.getStart()} - {fwimage_section.getEnd()}")
print(f"Size: {fwimage_section.getLength()} bytes")

# Get the data from the section
data = getBytes(fwimage_section.getStart(), fwimage_section.getLength())

# Save to file
output_dir = "/home/rmcore/Git/integdev_gpu_drv/open-iov/firmware/570-GSP"
os.makedirs(output_dir, exist_ok=True)
fwimage_path = os.path.join(output_dir, "gsp-570.144.fwimage.bin")

with open(fwimage_path, "wb") as f:
    f.write(data)

print(f"Saved .fwimage to {fwimage_path}")

# Also extract .fwversion
fwversion_section = program.getSection(".fwversion")
if fwversion_section:
    version_data = getBytes(fwversion_section.getStart(), fwversion_section.getLength())
    version_str = version_data.decode('ascii').strip('\x00')
    print(f"GSP Firmware Version: {version_str}")
    
    with open(os.path.join(output_dir, "gsp_version.txt"), "w") as f:
        f.write(version_str)

# Extract signatures
for i in range(3):
    sig_section = program.getSection(f".fwsignature{i}")
    if sig_section:
        sig_data = getBytes(sig_section.getStart(), sig_section.getLength())
        sig_path = os.path.join(output_dir, f"gsp-570.144.fwsignature{i}.bin")
        with open(sig_path, "wb") as f:
            f.write(sig_data)
        print(f"Saved signature {i} to {sig_path} ({len(sig_data)} bytes)")

# Create a new Ghidra project for the .fwimage binary
print("Creating Ghidra project for .fwimage binary...")

# We'll do this via a separate script call
print("Done extracting sections.")