Advertisement
Guest User

Untitled

a guest
Apr 17th, 2017
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.31 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import os
  4. import sys
  5. import zlib
  6.  
  7. from struct import pack, unpack
  8. from time import ctime
  9.  
  10. def parse_npk(filename):
  11.     f = open(filename, "r")
  12.     data = f.read()
  13.     f.close()
  14.  
  15.     # location different each time, not going to waste time on this, changed all the 70 and 74's below
  16.     #header = data[:65]
  17.     header = data[:74]
  18.  
  19.     #(58:62 @ 6.4)
  20.     #(70:74 @ 6.38.3)
  21.  
  22.     #dsize = unpack("<I", header[58:62])[0]
  23.     dsize = unpack("<I", header[70:74])[0]
  24.     print "Dsize: %s" % (dsize)
  25.     header += data[74:74+dsize+40]
  26.  
  27.     data = data[74+dsize+40:]
  28.     res=[]
  29.     while len(data)>6:
  30.         type = unpack("<H", data[:2])[0]
  31.         size = unpack("<I", data[2:6])[0]
  32.         #print "type: %s, size: %s" % (type,size)
  33.         contents = data[6:6+size]
  34.         if type == 4:
  35.             contents = zlib.decompress(contents)
  36.         res.append({"type": type, "size": size, "contents": contents})
  37.         data = data[6+size:]
  38.  
  39.     return header, res
  40.  
  41. def parse_data(data):
  42.     res = []
  43.     while len(data)>30:
  44.         header = data[:30]
  45.         dsize = unpack("<I", header[24:28])[0]
  46.         fsize = unpack("<H", header[28:30])[0]
  47.         if len(data) - 30 - fsize - dsize < 0:
  48.             dsize = len(data) - 30 - fsize
  49.         fstuff = data[30:30+fsize]
  50.         dstuff = data[30+fsize:30+fsize+dsize]
  51.         res.append({"header": header, "file": fstuff, "data": dstuff})
  52.         data = data[30+fsize+dsize:]
  53.     return res
  54.  
  55. if __name__ == "__main__":
  56.     w = 1
  57.     if len(sys.argv) > 1:
  58.         for i in sys.argv[1:]:
  59.             header, res = parse_npk(i)
  60.             for j in res:
  61.                 if j["type"] == 4:
  62.                     print "Kernel files in package:"
  63.                     data = parse_data(j["contents"])
  64.                     for k in data:
  65.                         perm, type, z1, z2, tim = unpack("<BBHII", k["header"][:12])
  66.                         pathname_len = len(k["file"])
  67.                         pathname_len -= 1
  68.                         pathname_check = k["file"][ :-pathname_len]
  69.                         if pathname_check == "/":
  70.                             k["file"] = k["file"][1: ]
  71.                         if perm == 237:
  72.                             perm = "ex"
  73.                         if perm == 164:
  74.                             perm = "nx"
  75.                         if type == 65:
  76.                             type = "dir"
  77.                             if k["file"] == "boot":
  78.                                 if not os.path.exists(k["file"]):
  79.                                     os.mkdir(k["file"])
  80.                         if type == 129:
  81.                             if k["file"][-6:] == "kernel":
  82.                                 type = "fil"
  83.                                 print "-> " + k["file"] + str(w)
  84.                                 try:
  85.                                     f = open(k["file"] + str(w), "wb+")
  86.                                     f.write(k['data'])
  87.                                     f.close()
  88.                                     w = w + 1
  89.                                 except:
  90.                                     pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement