Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- import mmap
- import struct
- import zlib
- fi = open(sys.argv[1], "rb")
- mm = mmap.mmap(fi.fileno(), 0, prot=mmap.PROT_READ)
- last_inode = 0x6d08
- ofs = 0x50
- while ofs <= last_inode :
- name_len = mm[ofs+9]
- if name_len :
- ty = mm[ofs+1]
- if ty == 0x81 :
- s = struct.unpack("IIII", mm[ofs:ofs+0x10])
- size = s[1]&((1<<26)-1)
- n_blocks = (size - 1) // 4096 + 1
- blockptr_offset = s[3]<<2
- name = mm[ofs+0x10:ofs+0x10+4*name_len].strip(b"\0").decode()
- print("name", name, hex(blockptr_offset), size, n_blocks)
- block_start = blockptr_offset+(n_blocks*4)
- try :
- print("name")
- with open("ex/%s"%name, "wb") as ofi:
- for i in range(n_blocks) :
- block_end = struct.unpack("I", mm[blockptr_offset+4*i:blockptr_offset+4*(i+1)])[0]
- ofi.write(zlib.decompress(mm[block_start:block_end]))
- block_start = block_end
- except zlib.error:
- print("error", name)
- ofs += 0x10+name_len*4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement