extract.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/env python2
  2. import sys, os, os.path
  3. import pywii as wii
  4. wii.loadkeys()
  5. def parseint(d):
  6. if len(d) > 2 and d[0:2].lower()=='0x':
  7. return int(d,16)
  8. return int(d)
  9. if len(sys.argv) < 4 or len(sys.argv) > 7:
  10. print "Usage:"
  11. print " python %s <encrypted ISO> <partition number> <file to extract to> [Partition offset] [length]"%sys.argv[0]
  12. sys.exit(1)
  13. iso_name, partno, data_name = sys.argv[1:4]
  14. partno = int(partno)
  15. part_offset = 0
  16. data_offset = 0
  17. copy_length = None
  18. if len(sys.argv) >= 5:
  19. part_offset = parseint(sys.argv[4])
  20. if len(sys.argv) == 6:
  21. copy_length = parseint(sys.argv[5])
  22. if copy_length is not None and copy_length < 0:
  23. print "Error: negative copy length"
  24. sys.exit(1)
  25. disc = wii.WiiDisc(iso_name)
  26. disc.showinfo()
  27. part = wii.WiiCachedPartition(disc, partno, cachesize=32, debug=False, checkhash=False)
  28. if part_offset >= part.data_bytes:
  29. print "Error: Offset past end of partition"
  30. sys.exit(1)
  31. if copy_length is None:
  32. copy_length = part.data_bytes - part_offset
  33. if copy_length > (part.data_bytes - part_offset):
  34. print "Error: Length too large"
  35. sys.exit(1)
  36. dataf = open(data_name, "wb")
  37. left = copy_length
  38. offset = part_offset
  39. while left > 0:
  40. blocklen = min(left, 4*1024*1024)
  41. d = part.read(offset, blocklen)
  42. if len(d) != blocklen:
  43. print "Part EOF reached!"
  44. sys.exit(1)
  45. dataf.write(d)
  46. offset += blocklen
  47. left -= blocklen
  48. dataf.close()