Advertisement
Guest User

unpack.py

a guest
Aug 9th, 2016
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.94 KB | None | 0 0
  1. import sys
  2. import mmap
  3. import struct
  4. import zlib
  5. fi = open(sys.argv[1], "rb")
  6. mm = mmap.mmap(fi.fileno(), 0, prot=mmap.PROT_READ)
  7.  
  8. last_inode = 0x6d08
  9.  
  10. ofs = 0x50
  11. while ofs <= last_inode :
  12.     name_len = mm[ofs+9]
  13.     if name_len :
  14.         ty = mm[ofs+1]
  15.         if ty == 0x81 :
  16.             s = struct.unpack("IIII", mm[ofs:ofs+0x10])
  17.             size = s[1]&((1<<26)-1)
  18.             n_blocks = (size - 1) // 4096 + 1
  19.             blockptr_offset = s[3]<<2
  20.             name = mm[ofs+0x10:ofs+0x10+4*name_len].strip(b"\0").decode()
  21.             print("name", name, hex(blockptr_offset), size, n_blocks)
  22.             block_start = blockptr_offset+(n_blocks*4)
  23.             try :
  24.                 print("name")
  25.                 with open("ex/%s"%name, "wb") as ofi:
  26.                     for i in range(n_blocks) :
  27.                         block_end = struct.unpack("I", mm[blockptr_offset+4*i:blockptr_offset+4*(i+1)])[0]
  28.                         ofi.write(zlib.decompress(mm[block_start:block_end]))
  29.                         block_start = block_end
  30.             except zlib.error:
  31.                 print("error", name)
  32.            
  33.     ofs += 0x10+name_len*4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement