Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.87 KB | None | 0 0
  1. #pak
  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