Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from insani import *
- import os
- import sys
- trans_table = "\x49\xF2\xD0\x20\x37\x5E\x77\x3E\x3C\xFB\x3E\x21\x33\xE9\xF2\x96\xD0\xE6\x89\x8E\x27\xD7\x3C\x45\x77\xDD\x32\x6B\x06\x78\xE1\x87\xBC\x10\xBB\x04\xE5\x7F\x63\x98\xB0\xEB\x78\x04\x58\x01\xA9\x51\xA6\xE8\xAD\x92\x8E\x87\x49\x4A\x3E\x64\x81\x7E\xC7\x37\xA3\x93\xC4\x8B\x3E\x01\x1F\xFA\x46\x79\x5D\xD4\x5F\x09\x99\x4E\xAA\xDC\x00\x89\xF5\x9B\x89\x89\x3C\x99\x43\xE2\xD5\xBF\xCC\xC7\x31\xFA\xFC\xB2\x16\x02\xC2\x57\xB0\xC7\xAA\x1E\x67\x7B\xAE\x40\x4E\x4F\x32\x69\xA9\x77\xD1\x52\xD0\x1B\xE7\xD0\xE8\x1F\xE6\xC8\x4C\x99\x73\x72\x93\x36\xE2\xFB\x8A\xEF\x75\xCE\x92\x6B\x89\x29\xBE\x48\x07\xC7\x22\x39\xD2\xBC\x96\xBC\x05\xC6\x8A\xCD\x22\xBC\x8B\x4C\xAE\xE1\x1B\x90\x45\x35\x8D\xE0\x10\x14\x7B\x2E\x4C\xBC\x7D\x66\xBD\x8C\x4E\x33\x2D\x09\x73\x71\xE4\x07\x9E\xC1\x3B\x8D\x57\xF6\xA5\x37\x23\x49\xE4\x33\x4A\x8E\xBD\xBF\x4F\xD9\x4F\x95\x5E\x4E\x87\x41\xAE\x01\xB6\x56\xA0\xAE\xC6\xF2\x1B\xB5\x24\x85\xEE\xFE\xC3\x4D\x3B\xDA\xF0\x0B\x22\x70\x38\x45\x50\x4C\x9E\x30\x88\xA9\x8A\x12\x5B\xFC\xF5\xAE\x2A\xEC\xDD\x11\x0D\xA6\x81\x54\xE2\x00"
- def readbytes(infile, bytecount, xorkey, offset=0):
- ret = ""
- while (offset < bytecount):
- byte = long(ord(infile.read(1)))
- #byte ^= xorkey
- #byte ^= ord(trans_table[offset&0xFF])
- ret += chr(byte)
- offset += 1
- if (offset&0xF0000000):
- print "Offset got huge. This functionality not implemented."
- sys.exit()
- return ret
- def converttoint(bytes, size=INT_LENGTH, endian=LITTLE_ENDIAN):
- result = 0
- for i in xrange(size):
- temp=long(ord(bytes[i]))
- if endian == LITTLE_ENDIAN :
- result |= (temp << (8*i))
- elif endian == BIG_ENDIAN :
- result = (result << 8) | temp
- else :
- raise 'converttoint', 'Unknown endian specification'
- return result
- #program
- files = sys.argv[1:]
- for filename in files:
- if (os.path.isdir(filename)):
- #Add recursion. If a directory is selected process all .gpk files within it
- for (root, dirs, dirfiles) in os.walk(filename):
- for name in dirfiles:
- if (name.endswith('.gpk')):
- files.append(os.path.join(root, name))
- continue;
- infile = open(filename, 'rb')
- print "Reading file ", filename
- xorkey = 0;
- header_unk = 0
- #xorkey = read_unsigned(infile, 1) ^ 0x92
- #print "The key is %2X (from %2X)" % (xorkey, xorkey^0x92)
- #header_unk = converttoint(readbytes(infile, 4, xorkey))
- #print "The unknown crap is %8X" % header_unk
- filecount = converttoint(readbytes(infile, 4, xorkey))
- print "There are %d files" % filecount
- entries = []
- for i in xrange(filecount):
- entry = {}
- filedata = readbytes(infile, 0x10C, xorkey)
- entry['name'] = filedata[0:0x104].strip(" \t\n\0")
- #print "Name is %s - size %d" % (fname, len(fname))
- #block1 = converttoint(filedata[0x100:0x104])
- entry['filesize'] = converttoint(filedata[0x104:0x108])
- entry['filestart'] = converttoint(filedata[0x108:0x10C])
- #print "And the blocks are: %08X - %08X" % (filesize, filestart)
- entries.append(entry)
- #print "Current position is now %d / %X" % (infile.tell(), infile.tell())
- xorkey = (header_unk % 0xFF)&0xFF
- dirname = filename[0:filename.find(".")]
- if not os.path.isdir(dirname):
- os.mkdir(dirname)
- for entry in entries:
- infile.seek(entry['filestart'])
- data = readbytes(infile, entry['filesize'], xorkey)
- outfile = open(dirname + '\\' + entry['name'], 'wb')
- outfile.write(data)
- outfile.close()
- print "Created file", entry['name'], "of size", entry['filesize'], "from position", entry['filestart']
- infile.close()
Advertisement
Add Comment
Please, Sign In to add comment