diff --git a/bns.py b/bns.py index 3708815..b21b2cf 100644 --- a/bns.py +++ b/bns.py @@ -76,6 +76,8 @@ class BNS_info(object): self.magic, self.size = struct.unpack('>4sI', buffer[offset+0:offset+8]) self.codec, self.has_loop = struct.unpack('>BB', buffer[offset+8:offset+10]) self.chan_cnt, self.zero = struct.unpack('>BB', buffer[offset+10:offset+12]) + assert self.chan_cnt > 0 + assert self.chan_cnt <=2 self.samplerate, self.pad0 = struct.unpack('>HH', buffer[offset+12:offset+16]) assert self.samplerate <= 48000 assert self.samplerate > 32000 @@ -175,7 +177,7 @@ class BNS_info(object): print "Samplerate: %04x %d" % ( self.samplerate , self.samplerate ) print "Padding: %04x" % self.pad0 print "Loop Start: %08x" % self.loop_start - print "Loop End: %08x" % self.loop_end + print "Sample Count / Loop End: %08x" % self.loop_end print "Channels Starts Offsets: %08x" % self.offset_to_chan_starts print "Padding: %08x" % self.pad2 print "Channel 1 Start Offset: %08x" % self.channel1_start_offset diff --git a/experimental/bmg.py b/experimental/bmg.py index 43ae6ba..7a2914a 100755 --- a/experimental/bmg.py +++ b/experimental/bmg.py @@ -231,7 +231,7 @@ def main(): if len(sys.argv) == 1: print 'Usage: python bmg.py -r ' print ' == OR == ' - print 'Usage: python bmg.py -w> ' sys.exit(1) if sys.argv[1] == "-r": f = open(sys.argv[2], 'rb') diff --git a/nand.py b/nand.py index 33445af..5d42d7f 100644 --- a/nand.py +++ b/nand.py @@ -370,7 +370,7 @@ class NAND: self.ES.AddTicket(title.tik) contents = title.tmd.getContents() for i, content in enumerate(contents): - self.ES.AddContentStart(title.tmd.titleid, content.cid) + self.ES.AddContentStart(title.tmd.getTitleID(), content.cid) data = title[content.index] self.ES.AddContentData(content.cid, data) self.ES.AddContentFinish(content.cid) diff --git a/tests/createNAND.py b/tests/createNAND.py new file mode 100644 index 0000000..f84aca8 --- /dev/null +++ b/tests/createNAND.py @@ -0,0 +1,19 @@ +#!/usr/bin/python + +import os, Wii + +nand = Wii.NAND('/home/megazig/Wii.py/nand') + +# change for region +sysV = 417 +iosV = 6174 + +#Wii.NUS.download(0x0000000100000002, sysV).dumpDir("0000000100000002") +#Wii.NUS.download(0x000000010000003C, iosV).dumpDir("000000010000003C") +#Wii.NUS.download(0x0001000848414C45).dumpDir("0001000848414C45") +#Wii.NUS.download(0x0001000848414B45).dumpDir("0001000848414B45") + +nand.importTitle(Wii.NUS.download(0x0000000100000002, sysV), False) +nand.importTitle(Wii.NUS.download(0x000000010000003C, iosV), False) +nand.importTitle(Wii.NUS.download(0x0001000848414C45), False) +nand.importTitle(Wii.NUS.download(0x0001000848414B45), False) diff --git a/tests/sysmenuUnpack.py b/tests/sysmenuUnpack.py index 01f5948..98ecb6b 100644 --- a/tests/sysmenuUnpack.py +++ b/tests/sysmenuUnpack.py @@ -1,10 +1,20 @@ -import os +#!/usr/bin/python + +import os, sys from U8 import * from title import WAD -sysmenuWad = WAD('/home/giuseppe/Scrivania/RVL-WiiSystemmenu-v258.wad') -sysmenuWad.unpack('/home/giuseppe/Scrivania/sysdump') +def main(): + if len(sys.argv) != 3: + print 'Usage: python sysmenuUnpack.py ' + sys.exit(1) -for file in os.listdir('/home/giuseppe/Scrivania/sysdump'): - if open('/home/giuseppe/Scrivania/sysdump/' + file).read(4) == '\x55\xaa\x38\x2d': - U8('/home/giuseppe/Scrivania/sysdump/' + file).unpack('/home/giuseppe/Scrivania/sysdump/' + file + '_decompressed/') + sysmenuWad = WAD(sys.argv[1]) + sysmenuWad.unpack(sys.argv[2]) + + for file in os.listdir(sys.argv[2]): + if open(sys.argv[2] + file).read(4) == '\x55\xaa\x38\x2d': + U8(sys.argv[2] + file).unpack(sys.argv[2] + file + '_decompressed/') + +if __name__ == "__main__": + main() diff --git a/tests/testLOC.py b/tests/testLOC.py index c70524a..8c5cd20 100644 --- a/tests/testLOC.py +++ b/tests/testLOC.py @@ -1,9 +1,19 @@ +#!/usr/bin/python + +import sys from formats import locDat -sdLoc = locDat('/home/giuseppe/Scrivania/sysmenu/loc.dat') +def main(): + if len(sys.argv) == 1: + print 'Usage: python testLOC.py ' + sys.exit(1) -print '%s' % sdLoc + sdLoc = locDat(sys.argv[1]) -#concorsiMii = sdLoc.getTitle(0, 0, 0) -sdLoc.delTitle(0, 0, 0) + print '%s' % sdLoc + #concorsiMii = sdLoc.getTitle(0, 0, 0) + sdLoc.delTitle(0, 0, 0) + +if __name__ == "__main__": + main() diff --git a/tests/testSAVE.py b/tests/testSAVE.py index 85c9d09..7311d6a 100644 --- a/tests/testSAVE.py +++ b/tests/testSAVE.py @@ -1,9 +1,20 @@ -from savedata import * +#!/usr/bin/python -save = Savegame('/home/giuseppe/Scrivania/data' + str(4) + '.bin') -save.analyzeHeader() -print '%s' % save -save.getBanner() -for i in range(save.getIconsCount()): - save.getIcon(i) -save.extractFiles() +import sys, Wii + +def main(): + if len(sys.argv) == 1: + print 'Usage: python testSAVE.py ' + sys.exit(1) + + save = Savegame(sys.argv[1]) + save.analyzeHeader() + print '%s' % save + save.getBanner() + for i in range(save.getIconsCount()): + save.getIcon(i) + save.extractFiles() + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/title.py b/title.py index 62c8aea..3975e7b 100644 --- a/title.py +++ b/title.py @@ -408,18 +408,24 @@ class NUS: certs = "" tmd = TMD.load(urllib.urlopen("http://nus.cdn.shop.wii.com/ccs/download/0000000100000002/tmd.289").read()) tik = Ticket.load(urllib.urlopen("http://nus.cdn.shop.wii.com/ccs/download/0000000100000002/cetk").read()) - - certs += tik.dump()[0x2A4:0x2A4 + 0x300] #XS - certs += tik.dump()[0x2A4 + 0x300:] #CA (tik) - certs += tmd.dump()[0x328:0x328 + 0x300] #CP + + rawtmd = urllib.urlopen("http://nus.cdn.shop.wii.com/ccs/download/0000000100000002/tmd.289").read() + rawtik = urllib.urlopen("http://nus.cdn.shop.wii.com/ccs/download/0000000100000002/cetk").read() + certs += rawtik[0x2A4:0x2A4 + 0x300] #XS + certs += rawtik[0x2A4 + 0x300:] #CA (tik) + certs += rawtmd[0x328:0x328 + 0x300] #CP + + #certs += tik.dump()[0x2A4:0x2A4 + 0x300] #XS + #certs += tik.dump()[0x2A4 + 0x300:] #CA (tik) + #certs += tmd.dump()[0x328:0x328 + 0x300] #CP if(Crypto.createMD5HashHex(certs) != "7ff50e2733f7a6be1677b6f6c9b625dd"): raise ValueError("Failed to create certs! MD5 mistatch.") - if(self.version == None): + if(version == None): versionstring = "" else: - versionstring = ".%u" % self.version + versionstring = ".%u" % version titleurl = self.url + "%08x%08x/" % (titleid >> 32, titleid & 0xFFFFFFFF) @@ -434,8 +440,9 @@ class NUS: contents = tmd.getContents() for content in contents: encdata = urllib.urlopen(titleurl + ("%08x" % content.cid)).read(content.size) - decdata = Crypto.decryptContent(titlekey, content.index, encdata) + decdata = Crypto.decryptContent(tik.titlekey, content.index, encdata) if(Crypto.validateSHAHash(decdata, content.hash) == 0): raise ValueError("Decryption failed! SHA1 mismatch.") title.contents.append(decdata) + return title download = classmethod(download)