Files
lofi-12xt-firmware/ghidra/headless/pyais4.py
T
2026-09-30 22:48:06 +02:00

67 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""PyGhidra pass 4: dense disassembly seeding + full-range listing dumps.
Reuses /tmp/opencode/ghidra-lab/pyproj/LofiPy.
Writes /tmp/opencode/ghidra-lab/out/gfull_<name>.txt
"""
import os
OUT = "/tmp/opencode/ghidra-lab/out"
PROJ_LOC = "/tmp/opencode/ghidra-lab/pyproj/LofiPy"
PROJ_NAME = "LofiPy"
PROG = "/ais_sect1_addrC7074800.bin"
RANGES = {
"eloop": ("C708E400", 0x400),
"callers2": ("C709E700", 0x500),
"orch": ("C7086300", 0x900),
}
def main():
import pyghidra
pyghidra.start()
with pyghidra.open_project(PROJ_LOC, PROJ_NAME) as project:
with pyghidra.program_context(project, PROG) as program:
from ghidra.program.flatapi import FlatProgramAPI
flat = FlatProgramAPI(program)
with pyghidra.transaction(program, "seed"):
for name, (t, size) in RANGES.items():
base = int(t, 16)
n = 0
a = base
while a < base + size:
try:
flat.disassemble(flat.toAddr("0x%08X" % a))
n += 1
except Exception:
pass
a += 8
print("%s seeded %d" % (name, n), flush=True)
for name, (t, size) in RANGES.items():
try:
base = int(t, 16)
it = program.getListing().getInstructions(
flat.toAddr("0x%08X" % base), True)
lines = []
while it.hasNext():
ins = it.next()
off = ins.getAddress().getOffset()
if off >= base + size:
break
lines.append("%08X %s %s" % (
off, ins.getMnemonicString(), ins.toString()))
if len(lines) > 4000:
break
open(os.path.join(OUT, "gfull_" + name + ".txt"),
"w").write("\n".join(lines) + "\n")
print("%s: %d insns" % (name, len(lines)), flush=True)
except Exception as e:
print(name + " FAILED: " + str(e)[:200], flush=True)
print("GFULL_DONE", flush=True)
if __name__ == "__main__":
main()