mirror of
https://github.com/elliotnunn/tbxi.git
synced 2024-12-21 15:29:26 +00:00
54 lines
1.7 KiB
Plaintext
54 lines
1.7 KiB
Plaintext
|
import argparse
|
||
|
import os
|
||
|
from os import path
|
||
|
from sys import stderr
|
||
|
|
||
|
from tbxi.lowlevel import MAGIC
|
||
|
from tbxi.prcldump import dump
|
||
|
|
||
|
|
||
|
parser = argparse.ArgumentParser(description='''
|
||
|
Dump a MacOS parcel blob (magic number 0x7072636C 'prcl') to a
|
||
|
plain-text Parcelfile and several decompressed binaries. This output
|
||
|
can be rebuilt using the Parcel Compiler (prclc). Usually parcel
|
||
|
blobs are found embedded inside a file called "Mac OS ROM", although
|
||
|
the Blue Box uses them in isolation. As a convenience this utility
|
||
|
will search for the magic number inside any input file (with a
|
||
|
warning).
|
||
|
''')
|
||
|
|
||
|
parser.add_argument('source', nargs=1, help='file to be decompiled')
|
||
|
|
||
|
meg = parser.add_mutually_exclusive_group()
|
||
|
meg.add_argument('-d', metavar='dest-dir', help='output directory (Parcelfile will be created within)')
|
||
|
meg.add_argument('-f', metavar='dest-file', help='output file (binaries will go in parent directory)')
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
with open(args.source[0], 'rb') as f:
|
||
|
binary = f.read()
|
||
|
|
||
|
if not binary.startswith(MAGIC):
|
||
|
try:
|
||
|
offset = binary.index(MAGIC)
|
||
|
except ValueError:
|
||
|
print('Not a parcels file', file=stderr)
|
||
|
exit(1)
|
||
|
else:
|
||
|
print('Warning: parcel blob wrapped at offset 0x%x' % offset)
|
||
|
binary = binary[offset:]
|
||
|
|
||
|
if args.f:
|
||
|
dest_file = path.abspath(args.f)
|
||
|
dest_dir = path.dirname(dest_file)
|
||
|
elif args.d:
|
||
|
dest_dir = path.abspath(args.d)
|
||
|
dest_file = path.join(dest_dir, 'Parcelfile')
|
||
|
else:
|
||
|
dest_dir = path.abspath(args.source[0].rstrip(path.sep) + '-dump')
|
||
|
dest_file = path.join(dest_dir, 'Parcelfile')
|
||
|
|
||
|
os.makedirs(dest_dir, exist_ok=True)
|
||
|
|
||
|
dump(binary, dest_file, dest_dir)
|