Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import os
- import sys
- import zlib
- from struct import pack, unpack
- from time import ctime
- def parse_npk(filename):
- f = open(filename, "r")
- data = f.read()
- f.close()
- # location different each time, not going to waste time on this, changed all the 70 and 74's below
- #header = data[:65]
- header = data[:74]
- #(58:62 @ 6.4)
- #(70:74 @ 6.38.3)
- #dsize = unpack("<I", header[58:62])[0]
- dsize = unpack("<I", header[70:74])[0]
- print "Dsize: %s" % (dsize)
- header += data[74:74+dsize+40]
- data = data[74+dsize+40:]
- res=[]
- while len(data)>6:
- type = unpack("<H", data[:2])[0]
- size = unpack("<I", data[2:6])[0]
- #print "type: %s, size: %s" % (type,size)
- contents = data[6:6+size]
- if type == 4:
- contents = zlib.decompress(contents)
- res.append({"type": type, "size": size, "contents": contents})
- data = data[6+size:]
- return header, res
- def parse_data(data):
- res = []
- while len(data)>30:
- header = data[:30]
- dsize = unpack("<I", header[24:28])[0]
- fsize = unpack("<H", header[28:30])[0]
- if len(data) - 30 - fsize - dsize < 0:
- dsize = len(data) - 30 - fsize
- fstuff = data[30:30+fsize]
- dstuff = data[30+fsize:30+fsize+dsize]
- res.append({"header": header, "file": fstuff, "data": dstuff})
- data = data[30+fsize+dsize:]
- return res
- if __name__ == "__main__":
- w = 1
- if len(sys.argv) > 1:
- for i in sys.argv[1:]:
- header, res = parse_npk(i)
- for j in res:
- if j["type"] == 4:
- print "Kernel files in package:"
- data = parse_data(j["contents"])
- for k in data:
- perm, type, z1, z2, tim = unpack("<BBHII", k["header"][:12])
- pathname_len = len(k["file"])
- pathname_len -= 1
- pathname_check = k["file"][ :-pathname_len]
- if pathname_check == "/":
- k["file"] = k["file"][1: ]
- if perm == 237:
- perm = "ex"
- if perm == 164:
- perm = "nx"
- if type == 65:
- type = "dir"
- if k["file"] == "boot":
- if not os.path.exists(k["file"]):
- os.mkdir(k["file"])
- if type == 129:
- if k["file"][-6:] == "kernel":
- type = "fil"
- print "-> " + k["file"] + str(w)
- try:
- f = open(k["file"] + str(w), "wb+")
- f.write(k['data'])
- f.close()
- w = w + 1
- except:
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement