Advertisement
qazmlpok

SuwaPyon extraction

May 14th, 2012
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.58 KB | None | 0 0
  1. from insani import *
  2. import os
  3. import sys
  4.  
  5. #m twist stuff
  6. _N = 0x270
  7. M = 0x18D
  8. MATRIX_A = 0x9908B0DF   #/* constant vector a */
  9. UPPER_MASK = 0x80000000 #/* most significant w-r bits */
  10. LOWER_MASK = 0x7fffffff #/* least significant r bits */
  11.  
  12. mt = [0] * _N; #/* the array for the state vector  */
  13. mti = _N+1; #/* mti==_N+1 means mt[_N] is not initialized */
  14. #m twist functions
  15.  
  16. def srand(s):
  17.     global mti
  18.  
  19.     mt[0] = s & 0xffffffff
  20.     mti = 1
  21.     while (mti<_N):
  22.         mt[mti] = (0x6C078965 * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti)
  23.         #/* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
  24.         #/* In the previous versions, MSBs of the seed affect   */
  25.         #/* only MSBs of the array mt[].                        */
  26.         #/* 2002/01/09 modified by Makoto Matsumoto             */
  27.         mt[mti] &= 0xffffffff;
  28.         #/* for >32 bit machines */
  29.         mti += 1
  30.  
  31.  
  32. def rand():
  33.     global mti
  34.  
  35.     mag01 = [0x0, MATRIX_A]
  36.     #/* mag01[x] = x * MATRIX_A  for x=0,1 */
  37.  
  38.     if (mti >= _N): #/* generate _N words at one time */
  39.  
  40.         if (mti == _N+1):   #/* if init_genrand() has not been called, */
  41.             srand(0x1571) #/* a default initial seed is used */
  42.  
  43.         kk = 0
  44.         while (kk<_N-M):
  45.         #//y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK)
  46.             y = ( (mt[kk+1]^mt[kk])&LOWER_MASK) ^ mt[kk]
  47.             mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1]
  48.             kk = kk + 1
  49.         while (kk<_N-1):
  50.             #//y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK)
  51.             y = ( (mt[kk+1]^mt[kk])&LOWER_MASK) ^ mt[kk]
  52.             mt[kk] = mt[kk+(M-_N)] ^ (y >> 1) ^ mag01[y & 0x1]
  53.             kk = kk + 1
  54.         #//y = (mt[_N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK)
  55.         y = (mt[_N-1]) ^ ( (mt[0]^mt[_N-1])&LOWER_MASK) & 0xFFFFFFFF
  56.         mt[_N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1]
  57.  
  58.         mti = 0
  59.  
  60.     y = mt[mti]
  61.     mti = mti + 1
  62.  
  63.     #/* Tempering */
  64.     y ^= (y >> 11) & 0xFFFFFFFF
  65.     y ^= ((y & 0xFF3A58AD) << 7) & 0xFFFFFFFF
  66.     y ^= ((y & 0xFFFFDF8C) << 15) & 0xFFFFFFFF
  67.     y ^= (y >> 18) & 0xFFFFFFFF
  68.  
  69.     return y
  70.  
  71. #program
  72.  
  73. files = sys.argv[1:]
  74. for filename in files:
  75.     infile = open(filename, 'rb')
  76.  
  77.     assert_string(infile, "UTGP", ERROR_WARNING)
  78.     srand(0x11922960)
  79.     filecount = read_unsigned(infile, 4)
  80.  
  81.     dirname = filename[0:filename.find(".")]
  82.  
  83.     print "Processing file", filename
  84.     if not os.path.isdir(dirname):
  85.         os.mkdir(dirname)
  86.  
  87.     infile.seek(0x20, os.SEEK_SET)
  88.  
  89.     entries = []
  90.     #expected_id = 0
  91.     for i in xrange(filecount):
  92.         entry = {}
  93.  
  94.         entry['id'] = read_unsigned(infile, 4) ^ rand()
  95.         #So much for that.
  96.         #if (entry['id'] != expected_id):
  97.         #   print "Expected an ID of %d, got %d! Around %d" % (expected_id, entry['id'], infile.tell())
  98.         #   sys.exit(0)
  99.         #expected_id = expected_id + 1
  100.         entry['start'] = read_unsigned(infile, 4) ^ rand()
  101.         entry['size'] = read_unsigned(infile, 4) ^ rand()
  102.         entry['crc'] = read_unsigned(infile, 4) ^ rand()
  103.  
  104.         entries.append(entry)
  105.  
  106.     for entry in entries:
  107.         print "Extracting file of ID %06d from %08X of size %08X. CRC=%08X" % (entry['id'], entry['start'], entry['size'], entry['crc'])
  108.  
  109.         infile.seek(entry['start'], os.SEEK_SET)
  110.         position = 0
  111.         data = ""
  112.         srand(0x11922960)
  113.  
  114.         while (position < entry['size']):
  115.             rawdata = infile.read(4)
  116.             newdata = "1234"
  117.             rnd = rand()
  118.             character0 = chr(ord(rawdata[0]) ^ ((rnd>>0)&0xFF))
  119.             character1 = chr(ord(rawdata[1]) ^ ((rnd>>8)&0xFF))
  120.             character2 = chr(ord(rawdata[2]) ^ ((rnd>>16)&0xFF))
  121.             character3 = chr(ord(rawdata[3]) ^ ((rnd>>24)&0xFF))
  122.  
  123.             data += character0 + character1 + character2 + character3
  124.  
  125.             position += 4
  126.  
  127.         #data = infile.read(entry['size'])
  128.  
  129.         outfile = open("%s/%06d.png" % (dirname, entry['id']), 'wb')
  130.         outfile.write(data)
  131.         outfile.close()
  132.  
  133.     infile.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement