inject.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 inject> [Partition offset] [data 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. data_offset = parseint(sys.argv[5])
  22. if len(sys.argv) == 7:
  23. copy_length = parseint(sys.argv[6])
  24. data_len = os.stat(data_name).st_size
  25. if copy_length == None:
  26. copy_length = data_len - data_offset
  27. copy_end = data_offset + copy_length
  28. if copy_length < 0:
  29. print "Error: negative copy length"
  30. sys.exit(1)
  31. if copy_end > data_len:
  32. print "Error: data file is too small"
  33. sys.exit(1)
  34. disc = wii.WiiDisc(iso_name)
  35. disc.showinfo()
  36. part = wii.WiiCachedPartition(disc, partno, cachesize=32, debug=False, checkhash=False)
  37. dataf = open(data_name, "rb")
  38. dataf.seek(data_offset)
  39. left = copy_length
  40. offset = part_offset
  41. while left > 0:
  42. blocklen = min(left, 4*1024*1024)
  43. d = dataf.read(blocklen)
  44. if len(d) != blocklen:
  45. print "File EOF reached!"
  46. sys.exit(1)
  47. part.write(offset, d)
  48. offset += blocklen
  49. left -= blocklen
  50. part.flush()
  51. part.update()
  52. part.tmd.null_signature()
  53. part.tmd.brute_sha()
  54. part.updatetmd()