Advertisement
Guest User

ED6 Decompress TEST1

a guest
Jul 19th, 2015
838
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.78 KB | None | 0 0
  1. # Decompression algorithm spreadsheet:
  2. # https://docs.google.com/spreadsheets/d/1ipgx25yp0XOtf-48-5a5j78TL67fE_6a2vXCiFvcxYo/edit#gid=0
  3. # Both lines 101 and 147 go to line 278. I couldn't figure out how these are related
  4. # So I made everything after 278 into a subroutine (and made almost all variables globals)
  5.  
  6. import struct, os
  7.  
  8. def get_data(filename):
  9.     totalbytes = os.path.getsize(filename)
  10.     infile = open(filename, 'rb')
  11.     totalfiledata = infile.read(totalbytes)
  12.     infile.close()
  13.     return totalfiledata
  14.  
  15. def load_flag_bits():
  16.     global num_flag_bits, flag_bits, input_pos, filedata
  17.     flag_bits = struct.unpack('<H',filedata[input_pos:input_pos+2])[0]
  18. ##    print 'New flag bits:   {:016b}'.format(flag_bits) #Prints flag bits
  19.     input_pos += 2
  20.     num_flag_bits = 0x10
  21.  
  22. def sub_0x89b11dc():
  23.     global num_flag_bits, flag_bits, a0, a1, a2, v1, v2, s0, s1, s2, s4
  24.     global input_pos, filedata, output, output_size
  25. #1     -> s2 = 2
  26. #01    -> s2 = 3
  27. #001   -> s2 = 4
  28. #0001  -> s2 = 5
  29. #00001 -> s2 = 6 plus next three flag bits (a number between 0 and 7)
  30. #00000 -> s2 = next byte of input plus 0xE
  31.     if num_flag_bits == 0:
  32.         load_flag_bits()
  33.     flag_bit = flag_bits & 1
  34.     flag_bits = flag_bits >> 1
  35.     num_flag_bits -= 1
  36.     s2 = 2
  37.     if flag_bit == 0: #0x89b123c
  38.         if num_flag_bits == 0:
  39.             load_flag_bits()
  40.         flag_bit = flag_bits & 1
  41.         flag_bits = flag_bits >> 1
  42.         num_flag_bits -= 1
  43.         s2 = 3
  44.         if flag_bit == 0: #0x89b12a0
  45.             if num_flag_bits == 0:
  46.                 load_flag_bits()
  47.             flag_bit = flag_bits & 1
  48.             flag_bits = flag_bits >> 1
  49.             num_flag_bits -= 1
  50.             s2 = 4
  51.             if flag_bit == 0: #0x89b1308
  52.                 if num_flag_bits == 0:
  53.                     load_flag_bits()
  54.                 flag_bit = flag_bits & 1
  55.                 flag_bits = flag_bits >> 1
  56.                 num_flag_bits -= 1
  57.                 s2 = 5
  58.                 if flag_bit == 0: #0x89b1370
  59.                     if num_flag_bits == 0:
  60.                         load_flag_bits()
  61.                     flag_bit = flag_bits & 1
  62.                     flag_bits = flag_bits >> 1
  63.                     num_flag_bits -= 1
  64.                     if flag_bit == 0: #0x89b13d8
  65.                         s2 = ord(filedata[input_pos])
  66.                         input_pos += 1
  67.                         s2 += 0xE
  68.                     else:
  69.                         t0 = 3
  70.                         a2 = 0
  71.                         while t0 != 0:
  72.                             v0 = a2 << 1
  73.                             a2 = v0 & 0xFFFF
  74.                             if num_flag_bits == 0:
  75.                                 load_flag_bits()
  76.                             v1 = flag_bits & 1
  77.                             flag_bits = flag_bits >> 1
  78.                             num_flag_bits -= 1
  79.                             v1 += a2
  80.                             t0 -= 1
  81.                             a2 = v1 & 0xFFFF
  82.                         s2 = a2 & 0xFFFF
  83.                         s2 += 6
  84. #Starting "copy from buffer" operation
  85. #a1 is how far to go back, s2 is how much to copy
  86.     s0 = len(output) - a1 #Where to start copying
  87.     s4 = s2 + output_size
  88.     v1 = 0
  89.     if 0x3FFF0 < s4: #0x89b14b8
  90.         return False
  91. ##    if unpacked_size < s4: #0x89b14c8
  92. ##        return False
  93. ##    if s2 >= 4: #0x89b14d0
  94. ##        v0 = len(output) - s0 #How far back to start copying
  95. ##        
  96. ##        if v0 >= 4: #0x89b14e8
  97. ##            print 'Fail'
  98. ##            quit()
  99. ##            v0 = s0 + s2 #???
  100. ##            #Go to 0x89B1528 (where to start is <4 back and size >=4)
  101.     if s2 != 0: #0x89b14f0
  102.         a1 = 0
  103.         while a1 != s2:
  104.             output += output[s0]
  105.             s0 += 1
  106.             a1 += 1
  107.     output_size = s4
  108.     v1 = 0
  109.     return True
  110.        
  111. def decompress_text(filename):
  112.     global filedata, input_pos, num_flag_bits, flag_bits, output, output_size, \
  113.            unpacked_size, a1, a2, a3, s2, s4, v0, v1
  114.     filedata = get_data(filename + '.orig')
  115.     output = ''
  116.     output_size = 8
  117.     output += filedata[:8]
  118.     input_pos = 8
  119.     num_flag_bits = 0
  120.    
  121.     #89b0df0
  122.     while True:
  123.         if num_flag_bits == 0:
  124.             load_flag_bits()
  125.         flag_bit = flag_bits & 1
  126.         flag_bits = flag_bits >> 1
  127.         num_flag_bits -= 1
  128.         if flag_bit == 0: #89b0e48
  129.             output += filedata[input_pos]
  130.             input_pos += 1
  131.             output_size += 1
  132.             continue
  133.         else: #89b0e98
  134.             if num_flag_bits == 0:
  135.                 load_flag_bits()
  136.             flag_bit = flag_bits & 1
  137.             flag_bits = flag_bits >> 1
  138.             num_flag_bits -= 1
  139.             if flag_bit == 0: #89b0ef4
  140.                 a1 = ord(filedata[input_pos])
  141.                 input_pos += 1
  142.                 flag = sub_0x89b11dc()
  143.                 if flag:
  144.                     continue
  145.                 else:
  146.                     break
  147.             else: #89b0f20
  148.                 a3 = 0x5
  149.                 a2 = 0
  150.                 while a3 != 0: #This JC is at 0x89b0fa0
  151.                     v0 = a2 << 1 #89b0f30
  152.                     a2 = v0 & 0xFFFF
  153.                     if num_flag_bits == 0:
  154.                         load_flag_bits()
  155.                     v1 = flag_bits & 1
  156.                     flag_bits = flag_bits >> 1
  157.                     num_flag_bits -= 1
  158.                     v1 += a2
  159.                     a3 -= 1
  160.                     a2 = v1 & 0xFFFF
  161.                 a2 = a2 << 8
  162.                 a2 += ord(filedata[input_pos])
  163.                 input_pos += 1
  164.                 if a2 == 0:
  165.                     break
  166.                 a1 = a2
  167.                 if a2 != 1: #0x89b0fd0
  168.                     flag = sub_0x89b11dc()
  169.                     if flag:
  170.                         continue
  171.                     else:
  172.                         break
  173.                 if num_flag_bits == 0: #0x89b0fd8
  174.                     load_flag_bits()
  175.                 flag_bit = flag_bits & 1
  176.                 flag_bits = flag_bits >> 1
  177.                 num_flag_bits -= 1
  178.                 if flag_bit == 0: #89b101c
  179.                     a3 = 4
  180.                     a2 = 0
  181.                     while a3 != 0:
  182.                         v0 = a2 << 1
  183.                         a2 = v0 & 0xFFFF
  184.                         if num_flag_bits == 0: #0x89b0fd8
  185.                             load_flag_bits()
  186.                         v1 = flag_bits & 1
  187.                         flag_bits = flag_bits >> 1
  188.                         num_flag_bits -= 1
  189.                         v1 += a2
  190.                         a3 -= 1
  191.                         a2 = v1 & 0xFFFF
  192.                     s2 = a2 & 0xFFFF
  193.                     s4 = s2 + 0xE
  194.                     # Go to 0x89b1190
  195.                 else: #0x89b10dc
  196.                     a3 = 4
  197.                     a2 = 0
  198.                     while a3 != 0:
  199.                         v0 = a2 << 1
  200.                         a2 = v0 & 0xFFFF
  201.                         if num_flag_bits == 0: #0x89b0fd8
  202.                             load_flag_bits()
  203.                         v1 = flag_bits & 1
  204.                         flag_bits = flag_bits >> 1
  205.                         num_flag_bits -= 1
  206.                         v1 += a2
  207.                         a3 -= 1
  208.                         a2 = v1 & 0xFFFF
  209.                     s2 = a2 << 8
  210.                     s2 += ord(filedata[input_pos])
  211.                     input_pos += 1
  212.                     s4 = s2 + 0xE
  213.                 a1 = ord(filedata[input_pos]) #0x89b1190
  214.                 input_pos += 1
  215.                 output += chr(a1)*s4
  216.                 output_size += s4
  217.                 continue
  218.     input_pos += 4
  219.     output_file = open(filename + '.unpack2','wb')
  220.     output_file.write(output)
  221.     output_file.close()
  222.  
  223. decompress_text('T_TITLE._DT')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement