85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
"""
|
|
`dumpdbfields` demonstrates how to enumerate tables and records.
|
|
"""
|
|
import os
|
|
import os.path
|
|
from .Database import Database
|
|
from .crodump import strucrack, dbcrack
|
|
from .hexdump import unhex
|
|
|
|
|
|
def processargs(args):
|
|
for dbpath in args.dbdirs:
|
|
if args.recurse:
|
|
for path, _, files in os.walk(dbpath):
|
|
# check if there is a crostru file in this directory.
|
|
if any(_ for _ in files if _.lower() == "crostru.dat"):
|
|
yield path
|
|
else:
|
|
yield dbpath
|
|
|
|
|
|
def main():
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description="db field dumper")
|
|
parser.add_argument("--kod", type=str, help="specify custom KOD table")
|
|
parser.add_argument("--strucrack", action="store_true", help="infer the KOD sbox from CroStru.dat")
|
|
parser.add_argument("--dbcrack", action="store_true", help="infer the KOD sbox from CroIndex.dat+CroBank.dat")
|
|
parser.add_argument("--nokod", "-n", action="store_true", help="don't KOD decode")
|
|
parser.add_argument("--maxrecs", "-m", type=int, default=100)
|
|
parser.add_argument("--recurse", "-r", action="store_true")
|
|
parser.add_argument("--verbose", "-v", action="store_true")
|
|
parser.add_argument("dbdirs", type=str, nargs='*')
|
|
args = parser.parse_args()
|
|
|
|
for path in processargs(args):
|
|
try:
|
|
import crodump.koddecoder
|
|
if args.kod:
|
|
if len(args.kod)!=512:
|
|
raise Exception("--kod should have a 512 hex digit argument")
|
|
kod = crodump.koddecoder.new(list(unhex(args.kod)))
|
|
elif args.nokod:
|
|
kod = None
|
|
elif args.strucrack:
|
|
class Cls: pass
|
|
cargs = Cls()
|
|
cargs.dbdir = path
|
|
cargs.sys = False
|
|
cargs.silent = True
|
|
cracked = strucrack(None, cargs)
|
|
if not cracked:
|
|
return
|
|
kod = crodump.koddecoder.new(cracked)
|
|
elif args.dbcrack:
|
|
class Cls: pass
|
|
cargs = Cls()
|
|
cargs.dbdir = path
|
|
cargs.sys = False
|
|
cargs.silent = True
|
|
cracked = dbcrack(None, cargs)
|
|
if not cracked:
|
|
return
|
|
kod = crodump.koddecoder.new(cracked)
|
|
else:
|
|
kod = crodump.koddecoder.new()
|
|
|
|
db = Database(path, kod)
|
|
for tab in db.enumerate_tables():
|
|
tab.dump(args)
|
|
print("nr of records: %d" % db.bank.nrofrecords)
|
|
i = 0
|
|
for rec in db.enumerate_records(tab):
|
|
for field, fielddef in zip(rec.fields, tab.fields):
|
|
print(">> %s -- %s" % (fielddef, field.content))
|
|
i += 1
|
|
if i > args.maxrecs:
|
|
break
|
|
except Exception as e:
|
|
print("ERROR: %s" % e)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|