repack_pkg.py 761 B

123456789101112131415161718
  1. import struct,sys,json
  2. # repack.py in.pkg out.pkg name=replacementfile ...
  3. src,dst=sys.argv[1],sys.argv[2]
  4. repl=dict(a.split('=',1) for a in sys.argv[3:])
  5. f=open(src,'rb');r=lambda:struct.unpack('<I',f.read(4))[0]
  6. hl=r();header=f.read(hl);n=r();ents=[]
  7. for _ in range(n):
  8. nl=r();name=f.read(nl);o=r();l=r();ents.append((name,o,l))
  9. base=f.tell();data=[]
  10. for name,o,l in ents:
  11. k=name.decode('utf-8','replace')
  12. if k in repl: data.append((name,open(repl[k],'rb').read()))
  13. else: f.seek(base+o); data.append((name,f.read(l)))
  14. out=open(dst,'wb');w=lambda v:out.write(struct.pack('<I',v))
  15. w(len(header));out.write(header);w(len(data));off=0
  16. for name,b in data:
  17. w(len(name));out.write(name);w(off);w(len(b));off+=len(b)
  18. for _,b in data: out.write(b)