Advertisement
Guest User

Untitled

a guest
Jul 16th, 2012
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.92 KB | None | 0 0
  1. # AION pak to zip converted 0.3 Copyright (c) 2008 by roxfan
  2.  
  3. from array import array
  4. import sys, struct, zlib, binascii
  5.  
  6. #stolen from zipfile.py
  7.  
  8. structFileHeader = "<4s2B4HlLL2H"      # 12 items, file header record, 30 bytes
  9. stringFileHeader = "PK\003\004"        # magic number for file header
  10. stringFileHeader2 = "\xAF\xB4\xFC\xFB"
  11.  
  12. structEndArchive = "<4s4H2lH"        # 9 items, end of archive, 22 bytes
  13. stringEndArchive = "PK\005\006"      # magic number for end of archive record
  14. stringEndArchive2 = "\xAF\xB4\xFA\xF9"
  15. structCentralDir = "<4s4B4HlLL5HLl"  # 19 items, central directory, 46 bytes
  16. stringCentralDir = "PK\001\002"      # magic number for central directory
  17. stringCentralDir2 = "\xAF\xB4\xFE\xFD"
  18.  
  19. # indexes of entries in the local file header structure
  20. _FH_SIGNATURE = 0
  21. _FH_EXTRACT_VERSION = 1
  22. _FH_EXTRACT_SYSTEM = 2                  # is this meaningful?
  23. _FH_GENERAL_PURPOSE_FLAG_BITS = 3
  24. _FH_COMPRESSION_METHOD = 4
  25. _FH_LAST_MOD_TIME = 5
  26. _FH_LAST_MOD_DATE = 6
  27. _FH_CRC = 7
  28. _FH_COMPRESSED_SIZE = 8
  29. _FH_UNCOMPRESSED_SIZE = 9
  30. _FH_FILENAME_LENGTH = 10
  31. _FH_EXTRA_FIELD_LENGTH = 11
  32.  
  33. # indexes of entries in the central directory structure
  34. _CD_SIGNATURE = 0
  35. _CD_CREATE_VERSION = 1
  36. _CD_CREATE_SYSTEM = 2
  37. _CD_EXTRACT_VERSION = 3
  38. _CD_EXTRACT_SYSTEM = 4                  # is this meaningful?
  39. _CD_FLAG_BITS = 5
  40. _CD_COMPRESS_TYPE = 6
  41. _CD_TIME = 7
  42. _CD_DATE = 8
  43. _CD_CRC = 9
  44. _CD_COMPRESSED_SIZE = 10
  45. _CD_UNCOMPRESSED_SIZE = 11
  46. _CD_FILENAME_LENGTH = 12
  47. _CD_EXTRA_FIELD_LENGTH = 13
  48. _CD_COMMENT_LENGTH = 14
  49. _CD_DISK_NUMBER_START = 15
  50. _CD_INTERNAL_FILE_ATTRIBUTES = 16
  51. _CD_EXTERNAL_FILE_ATTRIBUTES = 17
  52. _CD_LOCAL_HEADER_OFFSET = 18
  53.  
  54.  
  55. #open beta
  56. table1 = array('B',
  57.       "\x2f\x5d\x51\xf7\x01\xe9\xb4\x93\x4e\x51\x81\x3e\xaf\x3f\xdf\x99"
  58.       "\x80\x5e\x13\x83\x9b\x46\x57\xb5\x1b\x5c\xec\xb1\x29\x7c\xa9\x31"
  59.       "\x68\xe5\xda\xa7\xf6\x4f\xae\x16\x9a\x7f\x03\xcf\x1d\x5e\xd0\x51"
  60.       "\x5a\xe5\x02\xd9\x11\xd0\xfb\xf4\xf8\x7c\xa2\x88\x26\xd8\x1f\xa2"
  61.       "\x43\xda\x33\xa9\xac\x4e\x5a\x0d\xed\x78\x86\x2d\xb2\x6a\xc4\x9b"
  62.       "\xaa\x77\x85\x57\x6a\xa6\xd8\x35\xd8\x97\x6b\x17\x24\xb7\x7a\x1d"
  63.       "\xd3\x3b\x9e\x79\xf2\xae\x9f\x01\xe6\x9d\x29\x40\xed\x2f\x9c\x16"
  64.       "\xda\x18\xd1\x99\x0e\xd4\x0a\x63\x2d\x92\xd7\xeb\xb4\xa7\x50\x21"
  65.       "\xd8\x0f\x45\xd6\xc6\xbf\xcc\x47\xcc\x59\xed\x3e\x71\xfe\xa0\x26"
  66.       "\xfc\xd1\x07\x85\x8a\xee\x12\x36\x11\x5a\x60\xe1\x8f\xbd\x9e\xf7"
  67.       "\xb6\x64\x39\xcd\x49\x5a\x9a\xf7\x90\x1c\xc1\xa2\x0b\xb3\x81\xf7"
  68.       "\xca\xb8\x2a\x4b\x95\x13\xdc\x2e\x4a\xe5\x64\x16\x94\x99\xc9\xb1"
  69.       "\x7b\x53\x76\xae\xc4\xdf\x26\xf7\xc8\x5f\x78\x31\xae\xaf\x5a\x7f"
  70.       "\xa4\xe7\x29\x5e\x0e\xe2\xbb\x91\x41\x32\x2c\xf0\xce\x60\x9e\x27"
  71.       "\xdc\xfa\xdc\x13\xac\x37\xf7\xf1\xb4\xa4\xcd\xf4\x7a\xdc\xa9\x7b"
  72.       "\x95\x82\xda\x7d\xfb\x8d\x6b\x6e\x0c\x43\xe7\x23\x6c\xc0\x53\xf9"
  73.       "\x39\x82\x38\xde\x9b\xd0\xfe\x57\x3d\x75\x65\x43\xb0\xae\x5a\x6e"
  74.       "\x4e\xb3\xfb\xae\x8c\xc4\x0f\x9b\x65\x27\xaf\xa2\xc6\xf1\x84\x91"
  75.       "\x94\x1a\x39\x39\x53\xa5\x90\x64\xf0\x62\xcc\xb5\xbf\x1e\xbc\xa7"
  76.       "\x28\xae\x33\x3f\x16\xc6\x30\xb7\xb1\xf2\x83\xb1\x5e\xb0\x37\x20"
  77.       "\x9d\xf7\x7b\x95\xbe\x35\x6e\x1b\x07\x05\x77\x32\x3a\xae\x8a\x39"
  78.       "\x25\xaf\x10\xc5\x18\x56\xc2\x2b\xf9\xc4\x4b\xd6\xdc\x44\xd7\x9d"
  79.       "\xa8\x5c\x7f\xad\xef\x88\xbc\x46\x5f\xfe\xc0\xe3\xde\x69\xe3\x03"
  80.       "\xed\xf8\x06\x1f\x38\xc1\x22\x23\xf4\xc1\xd7\xe1\x11\x7b\x3c\xcb"
  81.       "\xb4\x8d\xaf\x82\x23\x30\x0d\x78\x82\xf9\xed\x3e\x91\xe1\x52\xa7"
  82.       "\xd5\xd5\x75\x71\x46\xda\x11\x97\xfb\x16\xdf\xea\xf3\xab\xa0\x32"
  83.       "\x66\xdb\x5e\x5e\xb9\x43\x55\x0e\x9e\xa5\x2a\xfd\x5e\x31\xc6\x93"
  84.       "\xd4\x9a\xa2\x2b\x37\x00\xb9\x46\x13\xf7\x05\x51\xa7\xb2\xaa\x22"
  85.       "\x0c\x9d\xc5\xd2\x3d\x62\xf4\x28\x8c\xbc\x89\x25\x79\xfa\x9a\xfd"
  86.       "\x8d\xa1\xbc\x02\x2b\x15\xb0\xb6\xe6\xa4\xcd\xbc\x72\xf8\x68\xb4"
  87.       "\x9a\x33\x08\xba\x62\xb7\xb1\xb1\xca\x00\x08\x01\x40\x68\x8e\xe1"
  88.       "\x49\x4f\xd8\xf2\x67\x85\xf0\x37\xc9\x61\xab\x1e\xc6\x6a\x4d\xca"
  89.       "\xaf\x03\x2f\x36\x02\xf0\xbc\x5e\x81\x39\x8a\x25\x38\x2c\xca\x04"
  90.       "\xf9\x0d\xf6\x44\x5b\x46\xdb\xde\xb7\x7b\xf4\xac\x3b\x7f\x36\x0d"
  91.       "\x90\x7c\x2c\xb0\x20\x48\xab\xa9\x7f\x39\xdb\x6d\x0b\x80\xe2\xf1"
  92.       "\x37\x50\xfa\x83\x9d\xd3\x3e\x8c\x54\x48\xeb\xe7\x92\x34\x6a\xeb"
  93.       "\x2b\x18\xda\xda\xe5\x7c\x7e\xd3\x3d\xd9\xb1\xfd\x90\x28\xcd\x00"
  94.       "\x45\x93\xb3\x86\xeb\x32\x4b\xe6\xea\x24\xb6\x97\xb4\x11\x94\xa0"
  95.       "\x16\x53\xfb\xae\xa6\xd7\x9a\xe9\xd9\xfb\xa6\x41\xc2\x6d\xec\x4b"
  96.       "\x0b\x59\xd7\x6c\x2e\xec\x9b\x5d\x6f\x76\x66\xcb\xb0\x23\xca\x2c"
  97.       "\x8d\xb6\x3a\x6e\xdc\x29\xd1\xbd\x1d\x89\x3f\xeb\xc7\x22\x09\xb8"
  98.       "\x1d\x2e\x04\x98\x71\x1a\x35\x26\x7d\xaa\xf2\xdb\xc0\x01\x8a\x56"
  99.       "\x76\xd1\x27\xa3\x2b\xc8\x58\xea\x76\x72\xe6\xf9\xea\xa0\x54\xf4"
  100.       "\xb2\xa4\xc0\xbb\xec\x54\x81\x3f\x58\x37\x3c\x69\x45\xc8\xb7\xb1"
  101.       "\x60\x3b\x3d\x20\x5b\x97\xce\xd2\xfc\xb1\xf2\xaf\xa2\xcb\x67\x74"
  102.       "\xad\x58\x79\xc8\xfe\xc1\x54\x71\xea\x98\x0b\x59\xc6\x21\xa0\x94"
  103.       "\x7f\x91\xde\xfd\x61\xfc\x3c\xa1\x71\x47\x9f\x97\x89\x0d\x43\x74"
  104.       "\x97\xec\x85\xfe\x2e\x0d\xe7\x49\xca\x55\x0e\xdd\xf4\x38\xf8\x22"
  105.       "\xb1\x7e\x55\x9e\x56\xea\x0f\x4a\x3a\x3d\x0f\x86\x64\x57\x51\xf9"
  106.       "\xa3\x0c\x23\xe4\x2a\x6a\xdf\x20\x31\xf8\xdd\x6d\xa8\xc4\xdf\x42"
  107.       "\x7d\xae\xd2\xac\x7d\xd7\x1f\x85\x67\xa4\x4f\x97\x21\x25\x61\xd0"
  108.       "\xa9\x6b\x77\x47\xc7\x97\x47\x13\x03\x1a\xfa\xc8\xe2\x05\xd7\xa6"
  109.       "\x0e\xda\x71\x18\x42\xc5\xaa\xd8\xb0\x96\x53\x2f\xd3\x78\xad\x8f"
  110.       "\x2b\xc4\x91\x3b\x07\xd7\x90\x09\xcb\x55\xcc\xf7\xcc\xbd\xcf\xc5"
  111.       "\x3b\xc1\x34\x1d\x35\x3c\x59\x8d\x75\x35\xf7\xf7\xb7\xdb\xd6\x90"
  112.       "\x53\xdb\x66\x20\x0e\xf7\x98\xb0\xbd\x51\xa4\x49\xb4\x3f\x1d\xe2"
  113.       "\x82\x2b\x04\x3c\x13\x4b\x39\xb6\xbd\xa8\x00\xe7\x33\x60\xe5\xfa"
  114.       "\xf1\x7b\xd5\x9b\x2b\x4c\x9f\x81\xb6\xb9\xb8\x55\x16\x5f\x7a\x05"
  115.       "\x07\xe6\xb3\x3e\xbc\x8b\xc3\x2f\x37\x23\x19\x39\xd1\xa2\x4c\xba"
  116.       "\x81\x78\xa3\x99\xd3\xb0\x53\xb9\x38\x44\x2b\xfc\x8f\x7b\x0f\xfe"
  117.       "\x99\xca\xfb\x37\x3e\x1d\xd4\x99\x3c\xdd\xd5\x6f\x48\xc2\xe1\x83"
  118.       "\x23\xab\x7f\x52\xa9\x89\xc4\x61\x6f\xae\x02\x66\xe9\x7a\x67\x67"
  119.       "\xad\xb7\x80\x7f\xc8\xa8\xb5\x61\xc9\x1a\xb3\x57\x73\x6c\xe9\xd3"
  120.       "\xa0\xfa\xfe\x43\x70\xc3\x71\x46\x2e\xbe\x2e\x02\x17\xca\x78\xa0"
  121. )
  122.  
  123. #closed beta
  124. table2 = array('B',
  125.       "\x86\xFA\x1A\x1C\x07\xBD\xD8\x64\xCE\xEE\x59\x88\xCD\xA9\x1D\x06"
  126.       "\xF7\x3D\x31\x58\x83\xA1\x5C\x7E\xDF\xA6\x50\x9E\x89\xA8\x12\xD2"
  127.       "\x25\x49\x75\xE2\x07\x0F\xEB\x01\x97\x4A\x66\x35\xAB\x32\x9D\xA7"
  128.       "\x4E\xA2\x89\x62\x0F\x55\x41\xC5\x52\x10\x1F\x47\xB0\xA0\x63\xA6"
  129.       "\xF0\x1C\x1C\x4C\x9B\x3C\xAC\xE2\xB3\x4E\x9F\xF1\xA4\x91\x29\x82"
  130.       "\xE4\x76\x0D\x8D\x4F\xA3\x34\x4A\xCC\x1C\xC7\x18\x48\x8E\xFE\x18"
  131.       "\x79\x08\x87\x28\x8E\x24\xB7\x6B\x38\xF2\x58\x01\x2D\xA8\x58\x0E"
  132.       "\x9C\x54\x29\xCF\xA1\xAE\x0A\xD2\x3B\x4A\x10\xF8\xD8\x19\x31\x7D"
  133.       "\xF3\xAE\x1B\x90\xD2\x2F\x16\xC7\xE5\x3B\xCC\xEF\xE1\xE1\x2C\x86"
  134.       "\x00\xDD\x35\x67\x8D\x25\xFC\xED\x32\x1F\xA9\x1A\x12\x6D\xB0\xF7"
  135.       "\x3D\xB6\x1F\xE8\x81\x4D\x36\xE7\x25\x30\x21\x90\x86\x30\x0E\xEE"
  136.       "\x40\xBE\x6E\xDA\xC1\x3A\xAF\xF2\xEC\x28\x2C\xF1\xCD\x44\x98\x72"
  137.       "\xDA\xCD\xC6\xD9\xDF\xF7\xEE\x88\x04\xE1\x62\x00\x08\x0E\xCD\x16"
  138.       "\x37\xAB\xF9\xF5\x14\xAA\x2E\x00\x4E\xF8\x18\x41\x0B\xD9\x6F\x9B"
  139.       "\xFA\xAD\x2B\x54\x56\x2E\x7F\x2C\x3B\x6A\x82\xA1\x7C\x7C\xA6\x8F"
  140.       "\x66\x5E\xE7\xCF\x83\xB9\xEA\xFC\xE2\x31\xD4\x10\xF3\xF4\x22\xEC"
  141.       "\x73\x14\x4F\x94\x78\x79\x8F\x1E\x29\xEA\x5F\x21\x1E\x08\x37\xB8"
  142.       "\xF6\x9A\x2D\xC5\x36\x34\xC1\x97\xDC\x75\xB2\xAD\xD7\xE3\x04\xA7"
  143.       "\xC0\xC9\x1C\x1A\x00\xE9\x2D\x6F\xD6\x8D\xBC\x73\x52\xC0\x8A\xB6"
  144.       "\xBA\x2C\xA6\x7D\x7B\x6F\xF4\x47\x1A\x72\xE9\xB2\x30\x7D\xD4\xD3"
  145.       "\x09\x9C\x65\xB0\xD0\x17\xCF\xFC\xF2\xFF\x46\xD2\xA6\x43\x11\x76"
  146.       "\x2B\xE5\x1D\xE5\xC9\x47\x2F\x4B\x1B\xDD\x9A\xFD\x9D\x20\xB6\x43"
  147.       "\x1A\x64\xE3\x68\xF3\x21\x57\x68\xD4\x04\x8F\xC3\xCE\xAF\xA3\xAB"
  148.       "\x69\xA3\x3C\x34\xBE\x1F\x84\xA8\x0E\x74\xCB\xB7\xE6\xB1\x39\x8D"
  149.       "\x68\x00\x3A\x9B\x9C\xB1\x09\x1C\x7D\x52\x15\x12\xA6\xB0\x83\xD3"
  150.       "\x40\x47\x9B\xE4\x22\xE3\x6E\x30\xC4\xFC\x6F\x4F\xFE\x9F\x51\x14"
  151.       "\x13\x57\xF1\xEB\x25\xF7\x95\x4C\x92\xB6\x3C\xD0\x34\x79\x59\x33"
  152.       "\x20\xBE\xB8\xBF\xE0\x0A\xD2\x77\xBC\x43\x5C\x7D\xFC\xE1\x59\x00"
  153.       "\xDE\x5A\x7D\x44\x11\xAC\x13\xF2\x64\x84\x4F\x5D\xA2\xC4\x36\xD7"
  154.       "\x23\xFA\xF8\xD1\x14\x8D\xF9\xDD\x17\x1D\x52\x41\x22\xF5\x1A\x42"
  155.       "\x39\xFE\x36\xD5\x0A\x10\x01\xD2\xEA\x12\x82\x5A\x48\xD2\x94\x95"
  156.       "\x0A\xF7\xAB\x70\xF7\xF2\x98\x89\xA1\x68\xF9\xE1\xD6\xE1\xBD\x92"
  157.       "\x38\x45\x5F\x19\xE2\xEA\x46\x76\xC5\xC3\xF2\xB4\x9F\x70\x53\x09"
  158.       "\x3F\xB8\x06\x3A\xF3\x46\xC8\x6A\xCD\x0A\xE3\xF0\xAA\x34\xD9\x72"
  159.       "\x98\x34\x23\xD1\x96\x8C\x32\x32\x3B\x00\xA3\x9E\x4F\xED\xBC\x97"
  160.       "\xD4\x4A\x26\x15\x96\x1D\x0E\x36\xB8\xEE\x86\x45\x57\x04\x6D\x2B"
  161.       "\xC0\xDB\x91\x0A\x46\xCE\x7C\x1F\x3C\x3A\x81\x94\x22\x26\x82\x6D"
  162.       "\x83\xBD\x13\x2D\x96\x91\x53\x6C\x26\x0C\x44\xFE\xBD\xEE\xDA\xCC"
  163.       "\xBD\x52\xA6\x11\x3E\x10\x42\x20\x60\xEB\x5F\x5B\x0D\x7C\xBB\x80"
  164.       "\xAC\x2F\xB9\xF9\xD2\x4A\xEB\x54\x80\x60\x62\x85\xE5\x1A\xF0\x30"
  165.       "\x45\xB7\x44\x82\xEF\x3A\x0C\xE0\xE5\x94\xFA\xFD\x2E\xD9\xEB\x8D"
  166.       "\x5A\xC2\xEF\x39\x51\x71\x92\xFA\xDB\xEF\x14\x88\x00\xFF\xE3\xF6"
  167.       "\xB5\x34\x34\x40\xF5\xBB\xC8\xD3\xB5\xBD\xF6\xCF\xC7\xB1\xF9\x18"
  168.       "\x3D\xA2\x74\xEF\x40\xBC\x6B\x39\xF2\xC8\x6E\x00\x64\x78\x52\x88"
  169.       "\x13\xF4\x27\x74\x14\x8F\xCE\x34\x5E\xF9\xE0\x6D\x47\xFC\x38\x6D"
  170.       "\xB0\x03\xED\x6C\xF6\x68\x00\xAC\x2B\xFE\x73\x2C\x94\x9E\x3F\x17"
  171.       "\x0C\x33\xB9\x8F\x33\x34\xDE\x05\x18\xE1\x2B\xB9\x42\x3F\x5F\xA2"
  172.       "\xB4\x1E\xE9\x45\xF3\x38\x43\xBB\x8E\xB0\x0A\x94\x39\xEE\xFF\x9A"
  173.       "\xF4\x2D\x6C\x4B\x66\xB1\x1E\x0F\xC2\x18\x32\xE1\x74\xFF\x90\x94"
  174.       "\xF2\x38\xDD\x56\xDC\x78\x91\x96\xD1\x04\x03\x09\x21\x39\xB2\xD4"
  175.       "\xCC\x2A\xA8\xAB\xE8\x99\x1C\xE7\xE4\x43\x3B\x58\xC1\x59\x54\xE8"
  176.       "\xBD\x9C\x28\xC6\x81\xFC\xAD\x33\x4F\x24\x16\xA0\x47\xD1\x4C\x4D"
  177.       "\x39\x7A\xC1\xF7\x1D\x04\xCF\xE7\xAE\x17\x71\xD9\x37\xDC\x9C\x0A"
  178.       "\x0E\x9D\x0E\x04\xD7\x24\xC1\x50\x0C\x49\xE3\xBC\xCA\x98\x89\x55"
  179.       "\x86\x73\xF1\xC3\x8D\x8F\x99\x34\xF7\x4B\xE7\x69\x0A\xB0\xC1\x2F"
  180.       "\x85\x97\xBF\xC3\xFD\xD0\x62\x75\xB1\xAD\xF3\x04\xF3\xF3\x77\x06"
  181.       "\xAA\x77\x5A\xE7\xEB\x67\x3F\xB5\x40\xA1\x9C\x53\x96\xFD\x85\x53"
  182.       "\x6E\xED\x52\x05\x3B\x6E\x89\xEF\x95\x98\xB6\x66\x34\xD0\x8A\x3F"
  183.       "\x44\xEA\x06\x86\x13\x39\xEF\x20\xAD\xE4\x73\x2C\x61\x77\x10\x3D"
  184.       "\xB9\x0B\xC2\x0C\xFD\xF2\x99\xD8\xB1\x57\x83\x1B\x24\xA6\xA0\xAB"
  185.       "\x97\x3E\xE5\x09\x07\x3F\x43\xED\x12\xE3\x36\xCE\x16\x58\xF2\x78"
  186.       "\x00\x63\xF7\x67\xDC\xD9\x5F\x0D\xAA\x3E\x9A\xA3\x83\x72\xFE\xBA"
  187.       "\x92\xE9\xD4\x22\xF0\x38\x38\x61\xE2\x79\x9B\x5E\x8A\x62\x27\x59"
  188.       "\x84\x71\xC0\xEB\x95\x28\x0D\x34\xCB\xAB\x25\xC6\x3B\xBC\x52\xA5"
  189.       "\xCA\x6B\x93\xCA\x23\x6D\x35\x87\x41\x87\x3E\x48\xB9\xDF\x0E\xFD"
  190.       "\x30\xB8\xD1\xB8\x10\x68\x3D\xBC\x09\x04\x31\x94\x5C\x91\xAF\x6C"
  191. )
  192.  
  193. def detect_version(cdata, usize, crc, comp_method):
  194.  
  195.   if comp_method!=0 and comp_method!=8:
  196.     raise Exception("Unknown compression method %d!"%comp_method)
  197.  
  198.   csize = len(cdata)
  199.  
  200.   xorsize = 32
  201.   if xorsize>csize: xorsize=csize
  202.  
  203.   #version 1
  204.   tbloff = (csize&0x1F)*32
  205.   for i in range(xorsize):
  206.     cdata[i]^=table1[tbloff+i]
  207.  
  208.   comp_ok = True
  209.   bytes = cdata.tostring()
  210.   if comp_method == 8:
  211.     try:
  212.       #print "before decompress 1"
  213.       dc = zlib.decompressobj(-15)
  214.       bytes = dc.decompress(bytes)
  215.       ex = dc.decompress('Z') + dc.flush()
  216.       if ex:
  217.           bytes = bytes + ex    
  218.       #print "after decompress 1"
  219.     except:
  220.       #print "exception decompress 1"
  221.       comp_ok = False
  222.  
  223.   for i in range(xorsize):
  224.     cdata[i]^=table1[tbloff+i]
  225.    
  226.   if comp_ok:
  227.     #print "len: %d(%d), crc: %08X(%08X)"%(len(bytes),usize, binascii.crc32(bytes), crc)
  228.     if len(bytes)==usize and crc == binascii.crc32(bytes):
  229.       return 1
  230.  
  231.   #version 2
  232.   tbloff = (csize&0x3FF)
  233.   for i in range(xorsize):
  234.     cdata[i]^=table2[tbloff+i]
  235.  
  236.   comp_ok = True
  237.   bytes = cdata.tostring()
  238.   if comp_method == 8:
  239.     try:
  240.       #print "before decompress 2"
  241.       dc = zlib.decompressobj(-15)
  242.       bytes = dc.decompress(bytes)
  243.       ex = dc.decompress('Z') + dc.flush()
  244.       if ex:
  245.           bytes = bytes + ex    
  246.       #print "after decompress 2"
  247.     except:
  248.       #print "exception decompress 2"
  249.       comp_ok = False
  250.  
  251.   for i in range(xorsize):
  252.     cdata[i]^=table2[tbloff+i]
  253.  
  254.   if comp_ok:
  255.     #print "len: %d(%d), crc: %08X(%08X)"%(len(bytes),usize, binascii.crc32(bytes), crc)
  256.     if len(bytes)==usize and crc == binascii.crc32(bytes):
  257.       return 2
  258.  
  259.   return None
  260.  
  261. def main():
  262.   if len(sys.argv)<3:
  263.     print("Usage: pak2zip.py file.pak file.zip")
  264.     sys.exit(1)
  265.  
  266.   pak = open(sys.argv[1],"rb")
  267.   zip = open(sys.argv[2],"wb")
  268.  
  269.   version = None
  270.  
  271.   while True:
  272.     #print("%08X"%pak.tell())
  273.     sig = pak.read(4)
  274.     if len(sig)==0:
  275.       break
  276.     if sig==stringFileHeader2:
  277.       # handle the file header:
  278.       fheaders = sig+pak.read(30-4)
  279.       fheader = struct.unpack(structFileHeader, fheaders)
  280.       fname = pak.read(fheader[_FH_FILENAME_LENGTH])
  281.       if fheader[_FH_EXTRA_FIELD_LENGTH]:
  282.         extra = pak.read(fheader[_FH_EXTRA_FIELD_LENGTH])
  283.       csize = fheader[_FH_COMPRESSED_SIZE]
  284.       cdata = pak.read(csize)
  285.       cdata = array('B', cdata)
  286.  
  287.       if version==None:
  288.         version = detect_version(cdata, fheader[_FH_UNCOMPRESSED_SIZE], fheader[_FH_CRC], fheader[_FH_COMPRESSION_METHOD])
  289.         if version==None:
  290.           raise Exception("Unknown AION version")
  291.         print "Version %d found"%version
  292.  
  293.       if version==1:
  294.         tbloff = (csize&0x1F)*32
  295.         table = table1
  296.       if version==2:
  297.         tbloff = (csize&0x3FF)
  298.         table = table2
  299.  
  300.       if csize>32: csize=32    
  301.       for i in range(csize):
  302.         cdata[i]^=table[tbloff+i]
  303.      
  304.       print(fname)
  305.  
  306.       fheaders = stringFileHeader+fheaders[4:]
  307.       zip.write(fheaders)
  308.       zip.write(fname)
  309.       if fheader[_FH_EXTRA_FIELD_LENGTH]:
  310.         zip.write(extra)
  311.       cdata.tofile(zip)
  312.     elif sig==stringCentralDir2:
  313.       # handle the central dir:
  314.       centdirs = sig+pak.read(46-4)
  315.       centdir = struct.unpack(structCentralDir, centdirs)
  316.       fname = pak.read(centdir[_CD_FILENAME_LENGTH])
  317.       #print fname
  318.       extra = pak.read(centdir[_CD_EXTRA_FIELD_LENGTH]+centdir[_CD_COMMENT_LENGTH])
  319.       centdirs = stringCentralDir+centdirs[4:]
  320.       zip.write(centdirs)
  321.       zip.write(fname)
  322.       zip.write(extra)
  323.     elif sig==stringEndArchive2:
  324.       zip.write(stringEndArchive)
  325.       zip.write(pak.read(22-4))
  326.     else:
  327.       raise Exception("Bad signature: %r"%sig)
  328.  
  329. try:
  330.   main()
  331. except Exception, e:
  332.   print "Error: %s"%e
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement