Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from insani import *
- import os
- import sys
- import zlib
- 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 writebytes(outfile, data, bytecount, xorkey, offset=0):
- ret = ""
- i = 0
- while (offset < bytecount):
- byte = long(ord(data[i]))
- byte ^= xorkey
- byte ^= ord(trans_table[offset&0xFF])
- outfile.write(chr(byte))
- offset += 1
- if (offset&0xF0000000):
- print "Offset got huge. This functionality not implemented."
- sys.exit()
- i += 1
- return ret
- def convertfromint(value, size=INT_LENGTH, endian=LITTLE_ENDIAN):
- result = ""
- for i in xrange(size):
- if endian == LITTLE_ENDIAN :
- #result |= (temp << (8*i))
- temp = (value >> (8*i)) & 0x00FF
- elif endian == BIG_ENDIAN :
- #result = (result << 8) | temp
- temp = (value >> (8*(size-i-1))) & 0x00FF
- else :
- raise 'convertfromint', 'Unknown endian specification'
- result += chr(temp)
- return result
- 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
- #===========================================
- files = sys.argv[1:]
- for filename in files:
- crc = None
- if (not os.path.isdir(filename)):
- print filename, 'is not a directory.'
- continue
- entries = []
- for (root, dirs, dirfiles) in os.walk(filename):
- #first = dirfiles.pop(0)
- #dirfiles.append(first)
- for name in dirfiles:
- if (name == 'crc.txt'):
- infile = open(os.path.join(root, name))
- crc = infile.read()
- crc = converttoint(crc)
- infile.close()
- continue
- entry = {}
- #fuck. someimes need dir.....
- entry['filename'] = os.path.join(root, name)
- entry['name'] = name[4:]
- stat = os.stat(entry['filename'])
- entry['size'] = stat.st_size
- entries.append(entry)
- print 'Adding', entry['name'], 'with size', entry['size']
- filecount = convertfromint(len(entries))
- xorkey = 0x50 #Completely arbitrary; works fine
- rndkey = chr(xorkey)
- datastart = 9 + 0x10C * len(entries)
- datapos = datastart
- filedata = rndkey + "FFFF" + filecount
- for entry in entries:
- entry['start'] = datapos
- datapos += entry['size']
- filedata += entry['name'].replace('/', '\\') #Just in case.
- filedata += '\0' * (0x104 - len(entry['name']))
- filedata += convertfromint(entry['size'])
- filedata += convertfromint(entry['start'])
- for entry in entries:
- infile = open(entry['filename'], 'rb')
- data = infile.read()
- filedata += data
- infile.close()
- if (crc is None):
- print 'Failed to find crc file?'
- sys.exit()
- print 'Final size is', len(filedata)
- #crc = zlib.crc32(filedata) & 0xffffffff
- #crc = 0xBFD4B96F ###################
- print 'CRC is %08X' % crc
- crcbytes = convertfromint(crc)
- filedata = filedata[0] + crcbytes + filedata[5:]
- print 'Final size ckeck:', len(filedata)
- tmp = open('_tmp.gpk', 'wb')
- tmp.write(filedata)
- tmp.close()
- outfile = open(filename+'.gpk', 'wb')
- outfile.write(filedata[0])
- writebytes(outfile, filedata[1:5], 4, xorkey^0x92)
- writebytes(outfile, filedata[5:9], 4, xorkey^0x92)
- filepos = 9
- for entry in entries:
- entrydata = filedata[filepos:filepos+0x10C]
- writebytes(outfile, entrydata, 0x10C, xorkey^0x92)
- filepos += 0x10C
- xorkey = (crc%0xFF)&0xFF
- for entry in entries:
- #They're in order, but... play it safe
- outfile.seek(entry['start'])
- writebytes(outfile, filedata[entry['start']:entry['start']+entry['size']], entry['size'], xorkey)
- outfile.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement