30 lines
1.1 KiB
Python
Executable File
30 lines
1.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Unpack Lofi-12 XT .bin -> directory with headers.json + sect payloads."""
|
|
import argparse, json, os, struct, sys
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
from lofi_image import parse_image, headers_to_json
|
|
|
|
def main():
|
|
ap = argparse.ArgumentParser()
|
|
ap.add_argument('image')
|
|
ap.add_argument('outdir')
|
|
a = ap.parse_args()
|
|
d = open(a.image, 'rb').read()
|
|
info = parse_image(d)
|
|
os.makedirs(a.outdir, exist_ok=True)
|
|
open(os.path.join(a.outdir, 'headers.json'), 'w').write(
|
|
json.dumps(headers_to_json(info), indent=2))
|
|
for s in info['sects']:
|
|
fn = f"sect{s['index']}_addr{s['addr']:08X}.bin"
|
|
open(os.path.join(a.outdir, fn), 'wb').write(s['payload'])
|
|
m = info['mmtd']
|
|
print(f"fw {tuple(m['fw'])} entry={m['entry']:08X} nsect={m['nsect']} "
|
|
f"cksum={info['cmtd']['checksum']:08X} size={len(d)}")
|
|
for s in info['sects']:
|
|
print(f" sect{s['index']} off={s['off']:06X} addr={s['addr']:08X} "
|
|
f"len={s['len']} end={s['end']:08X}")
|
|
print(f"wrote {a.outdir}/")
|
|
|
|
if __name__ == '__main__':
|
|
main()
|