From 4950d06683800a80394909c3d9788751717a3239 Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Fri, 7 Dec 2018 13:57:59 +0800 Subject: [PATCH] Sundry changes --- DumpRomResources.py | 1 + EveryKernelExtractor.py | 33 +++++++++++++++++++++++++++++++++ ExtractBinDates.py | 38 ++++++++++++++++++++++++++++++++++++++ KernelExtractor.py | 2 +- RemoveNulsFromTextFiles.py | 28 ++++++++++++++++++++++++++++ RomExtractor.py | 4 ++-- 6 files changed, 103 insertions(+), 3 deletions(-) create mode 100755 EveryKernelExtractor.py create mode 100755 ExtractBinDates.py create mode 100755 RemoveNulsFromTextFiles.py diff --git a/DumpRomResources.py b/DumpRomResources.py index e449c6b..9a5c175 100755 --- a/DumpRomResources.py +++ b/DumpRomResources.py @@ -77,6 +77,7 @@ if __name__ == '__main__': fname += ' "%s"' % r.name.decode('ascii') if r.combo_field != 'AllCombos': fname += ' (%s)' % r.combo_field + fname = fname.replace('/', '-') with open(os.path.join(dest, fname), 'wb') as f: f.write(r.data) diff --git a/EveryKernelExtractor.py b/EveryKernelExtractor.py new file mode 100755 index 0000000..310a506 --- /dev/null +++ b/EveryKernelExtractor.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +import sys +from collections import defaultdict +from os.path import split, join + +klist = [] +for x in sys.argv[1:]: + try: + y = open(x, 'rb').read() + if len(y) != 0x400000: raise ValueError + except: + continue + + y = y[0x310000:] + y = y[:y.index(bytes(256))] + while len(y) % 4: y += bytes(1) + + klist.append((x, y)) + +kseries = defaultdict(list) +for x, y in klist: + kseries[y].append(x) + +flg = False +for kerndata, owners in kseries.items(): + if flg: print() + flg = True + for o in owners: print(o) + + a, b = split(owners[0]) + dest = join(a, 'NK-'+b) + open(dest, 'wb').write(kerndata) diff --git a/ExtractBinDates.py b/ExtractBinDates.py new file mode 100755 index 0000000..ff1cfde --- /dev/null +++ b/ExtractBinDates.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 + +from datetime import datetime, timedelta +import argparse + +def macdatestr(srcint): + dt = datetime(1904, 1, 1) + timedelta(seconds=srcint) + st = dt.isoformat() + st = st.replace('T', ' ') + return st + +args = argparse.ArgumentParser() + +args.add_argument('src', nargs='+', help='Binary to extract build dates from') +args.add_argument('--all', action='store_true', help='Show every date, not just the latest one') + +args = args.parse_args() + +for binpath in args.src: + thebin = open(binpath, 'rb').read() + + if args.all: print(binpath) + + maxdat = -1 + + while b'Joy!peffpwpc' in thebin: + thebin = thebin[thebin.index(b'Joy!peffpwpc') + 16:] + dt = int.from_bytes(thebin[:4], byteorder='big') + maxdat = max(maxdat, dt) + + if args.all: print(macdatestr(dt)) + + if not args.all: + suffix = ' [%s]' % binpath + if maxdat == -1: + print('???????????????????' + suffix) + else: + print(macdatestr(maxdat) + suffix) diff --git a/KernelExtractor.py b/KernelExtractor.py index 119c99a..4d647c6 100755 --- a/KernelExtractor.py +++ b/KernelExtractor.py @@ -20,7 +20,7 @@ for fname in argv[2:]: print('--- no kernel') continue vers = '%02x%02x' % tuple(b[4:6]) - if not vers.startswith('02'): continue + # if not vers.startswith('02'): continue print('---', vers) if vers in kerns: if kerns[vers] != b: diff --git a/RemoveNulsFromTextFiles.py b/RemoveNulsFromTextFiles.py new file mode 100755 index 0000000..a031f4b --- /dev/null +++ b/RemoveNulsFromTextFiles.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +import sys +import os +from os import path + +the_dir = sys.argv[1] + +def get_textfiles_from_dir(the_dir): + textfiles = [] + for parent, dirs, files in os.walk(the_dir): + for flnam in files: + flnam = path.join(parent, flnam) + try: + if open(flnam + '.idump', 'rb').read(4) != b'TEXT': + continue + except: + continue + textfiles.append(flnam) + return textfiles + +BADCHAR = b'\x00' + +for f in get_textfiles_from_dir(the_dir): + dat = open(f, 'rb').read() + if BADCHAR in dat: + print('Writing', f) + open(f, 'wb').write(dat.replace(BADCHAR, b'')) diff --git a/RomExtractor.py b/RomExtractor.py index f66a19a..4089a32 100755 --- a/RomExtractor.py +++ b/RomExtractor.py @@ -6,7 +6,7 @@ import struct CR = '\r' ROMSIZE = 0x400000 -EMBASE = 0x360000 +EMBASE = 0x320000 try: rom_path, = argv[1:] @@ -23,7 +23,7 @@ except: exit(1) # read special offsets into emulator, from ConfigInfo struct -em_entry, em_kernel_trap_table = struct.unpack_from('>LL', rom, 0x30d080) +em_entry, em_kernel_trap_table = struct.unpack_from('>LL', rom, 0x30c080) labels = { EMBASE: ['EmTop'],