Merge branch 'master' of git@github.com:icefire/Wii.py

This commit is contained in:
Xuzz 2009-07-02 09:54:49 -07:00
commit a0c35e7467
2 changed files with 267 additions and 129 deletions

View File

@ -11,6 +11,13 @@ def nullterm(str_plus):
else: else:
return str_plus return str_plus
def denullterm(str_plus):
z = str_plus.find('\r\n')
if z != -1:
return str_plus[:z]
else:
return str_plus
class BMG(object): class BMG(object):
class BMG_DAT1(Struct): class BMG_DAT1(Struct):
__endian__ = Struct.BE __endian__ = Struct.BE
@ -21,6 +28,10 @@ class BMG(object):
return_string = "Magic: %s\n" % self.magic return_string = "Magic: %s\n" % self.magic
return_string += "Length: %08x\n " % self.length return_string += "Length: %08x\n " % self.length
return return_string return return_string
def write(self, file):
file.write(self.magic)
file.write(struct.pack('>I', self.length))
return
class BMG_INF1(Struct): class BMG_INF1(Struct):
__endian__ = Struct.BE __endian__ = Struct.BE
@ -35,6 +46,12 @@ class BMG(object):
return_string += "Count: %04x\n" % self.count return_string += "Count: %04x\n" % self.count
return_string += "Unknown: %04x\n" % self.unknown01 return_string += "Unknown: %04x\n" % self.unknown01
return return_string return return_string
def write(self, file):
file.write(self.magic)
file.write(struct.pack('>I', self.length))
file.write(struct.pack('>H', self.count))
file.write(struct.pack('>H', self.unknown01))
return
class BMG_Header(Struct): class BMG_Header(Struct):
__endian__ = Struct.BE __endian__ = Struct.BE
@ -61,122 +78,180 @@ class BMG(object):
return_string += "Unknown05: %08x\n" % self.unknown05 return_string += "Unknown05: %08x\n" % self.unknown05
return_string += "Unknown06: %08x\n" % self.unknown06 return_string += "Unknown06: %08x\n" % self.unknown06
return return_string return return_string
def write(self, file):
file.write(self.magic)
file.write(self.magic2)
file.write(struct.pack('>I', self.length))
file.write(struct.pack('>I', self.chunk_cnt))
file.write(struct.pack('>B', self.unknown01))
file.write(struct.pack('>B', self.unknown02))
file.write(struct.pack('>H', self.unknown03))
file.write(struct.pack('>I', self.unknown04))
file.write(struct.pack('>I', self.unknown05))
file.write(struct.pack('>I', self.unknown06))
return
def __init__(self, data): def __init__(self, data=None, out_file=None, debug=False):
self.data = [] self.data = []
if data != None: if data != None:
self.Unpack(data) self.Unpack(data, out_file, debug)
def Unpack(self, data): def Unpack(self, data, out_file, debug):
pos = 0 file = open(out_file, 'wb')
header = self.BMG_Header() if file:
header.unpack(data[pos:pos+len(header)]) pos = 0
pos += len(header) header = self.BMG_Header()
print header header.unpack(data[pos:pos+len(header)])
pos += len(header)
if debug == True:
print header
print "\n%08x\n" % pos
print "\n%08x\n" % pos info = self.BMG_INF1()
info.unpack(data[pos:pos+len(info)])
pos += len(info)
if debug == True:
print info
info = self.BMG_INF1() unknown = Struct.uint32(data[pos:pos+4], endian='>')
info.unpack(data[pos:pos+len(info)])
pos += len(info)
print info
unknown = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4
print "Unknown: %08x" % unknown
print "\n%08x\n" % pos
offset_list = []
for x in xrange(info.count):
offset = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4
print "Offset: %08x" % offset
offset_list.append(offset)
while pos % 0x10:
padding = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4 pos += 4
print "Padding: %08x" % padding if debug == True:
print "Unknown: %08x" % unknown
print "\n%08x\n" % pos
print "\n%08x\n" % pos offset_list = []
for x in xrange(info.count):
offset = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4
if debug == True:
print "Offset: %08x" % offset
offset_list.append(offset)
dat1 = self.BMG_DAT1() while pos % 0x10:
dat1.unpack(data[pos:pos+len(dat1)]) padding = Struct.uint32(data[pos:pos+4], endian='>')
pos += len(dat1) pos += 4
print dat1 if debug == True:
print "Padding: %08x" % padding
print "\n%08x\n" % pos if debug == True:
temp = pos print "\n%08x\n" % pos
unknown = Struct.uint16(data[pos:pos+2], endian='>') dat1 = self.BMG_DAT1()
pos += 2 dat1.unpack(data[pos:pos+len(dat1)])
print "Unknown: %04x" % unknown pos += len(dat1)
if debug == True:
print dat1
for x in xrange(info.count): if debug == True:
pos = temp + offset_list[x] print "\n%08x\n" % pos
string = nullterm(data[pos:]) temp = pos
string = unicode(string, 'utf_16_be')
print "String: %s" % string
#''' TEST DATA unknown = Struct.uint16(data[pos:pos+2], endian='>')
unknown = Struct.uint32(data[pos:pos+4], endian='>') pos += 2
pos += 4 if debug == True:
print "Unknown: %08x" % unknown print "Unknown: %04x" % unknown
unknown = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4 for x in xrange(info.count):
print "Unknown: %08x" % unknown pos = temp + offset_list[x]
unknown = Struct.uint32(data[pos:pos+4], endian='>') string = nullterm(data[pos:])
pos += 4 string = unicode(string, 'utf_16_be')
print "Unknown: %08x" % unknown file.write(string.encode('utf-8'))
unknown = Struct.uint32(data[pos:pos+4], endian='>') file.write('\r')
pos += 4 file.write('\n')
print "Unknown: %08x" % unknown if debug == True:
unknown = Struct.uint32(data[pos:pos+4], endian='>') print "String: %s" % string.encode('utf-8')
pos += 4 file.close()
print "Unknown: %08x" % unknown else:
unknown = Struct.uint32(data[pos:pos+4], endian='>') print "Could not open file for writing"
pos += 4 sys.exit(1)
print "Unknown: %08x" % unknown def write(self, data, out_file):
unknown = Struct.uint32(data[pos:pos+4], endian='>') file = open(out_file, 'wb')
pos += 4 if file:
print "Unknown: %08x" % unknown pos = 0
unknown = Struct.uint32(data[pos:pos+4], endian='>') count = 0
pos += 4 strings_list = []
print "Unknown: %08x" % unknown while pos < len(data):
unknown = Struct.uint32(data[pos:pos+4], endian='>') temp = denullterm(data[pos:])
pos += 4 pos += len(temp) + 2
print "Unknown: %08x" % unknown string = unicode(temp, 'utf-8')
unknown = Struct.uint32(data[pos:pos+4], endian='>') strings_list.append(string)
pos += 4 count += 1
print "Unknown: %08x" % unknown offsets_list = []
unknown = Struct.uint32(data[pos:pos+4], endian='>') offset = 2
pos += 4 for x in xrange(count):
print "Unknown: %08x" % unknown offsets_list.append(offset)
unknown = Struct.uint32(data[pos:pos+4], endian='>') offset += len(strings_list[x]) * 2 + 2
pos += 4 dat1 = self.BMG_DAT1()
print "Unknown: %08x" % unknown dat1.length = offset + 8 + (0x10 - (offset % 0x10))
unknown = Struct.uint32(data[pos:pos+4], endian='>') dat_pad_to_add = 0x10 - (offset % 0x10)
pos += 4 info = self.BMG_INF1()
print "Unknown: %08x" % unknown info.length = 0x10 + 4 * count + (0x10 - ((4 * count) % 0x10))
unknown = Struct.uint32(data[pos:pos+4], endian='>') info_pad_to_add = 0x10 - ((4*count) % 0x10)
pos += 4 header = self.BMG_Header()
print "Unknown: %08x" % unknown header.magic = "MESG"
#END TEST DATA ''' header.magic2 = "bmg1"
header.length = info.length + dat1.length + 0x20
header.chunk_cnt = 2
header.unknown01 = 2
header.unknown02 = 0
header.unknown03 = 0
header.unknown04 = 0
header.unknown05 = 0
header.unknown06 = 0
header.write(file)
info.magic = "INF1"
info.count = count
info.unknown01 = 4
info.write(file)
unknown = 0
file.write(struct.pack('>I', unknown))
offset_list = []
for x in offsets_list:
file.write(struct.pack('>I', x))
padding = 0
for x in xrange(info_pad_to_add):
file.write(struct.pack('>B', padding))
dat1.magic = "DAT1"
dat1.write(file)
unknown = 0
file.write(struct.pack('>H', unknown))
for x in strings_list:
file.write(x.encode('utf_16_be'))
file.write('\x00\x00')
file.write("\n")
padding = 0
for x in xrange(dat_pad_to_add):
file.write(struct.pack('>B', padding))
file.close()
else:
print "Could not open file for writing"
sys.exit(1)
def main(): def main():
if len(sys.argv) == 1: if len(sys.argv) == 1:
print 'Usage: python bmg.py' print 'Usage: python bmg.py -r <filename.bmg> <filename.hog>'
print ' == OR == '
print 'Usage: python bmg.py -w> <filename.hog> <filename.bmg'
sys.exit(1) sys.exit(1)
f = open(sys.argv[1], 'rb') if sys.argv[1] == "-r":
if f: f = open(sys.argv[2], 'rb')
bmg_buffer = f.read() if f:
f.close() bmg_buffer = f.read()
else: f.close()
print 'Could not open file for reading' else:
sys.exit(1) print 'Could not open file for reading'
sys.exit(1)
bmg = BMG(bmg_buffer) bmg = BMG(bmg_buffer, sys.argv[3], debug=False)
elif sys.argv[1] == "-w":
f = open(sys.argv[2], 'rb')
if f:
bmg_buffer = f.read()
f.close()
else:
print "Could not open file for reading"
sys.exit(1)
bmg = BMG()
bmg.write(bmg_buffer, sys.argv[3])
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -11,50 +11,113 @@ def nullterm(str_plus):
else: else:
return str_plus return str_plus
def denullterm(str_plus):
z = str_plus.find('\x0a')
if z != -1:
return str_plus[:z]
else:
return str_plus
class ZND(object): class ZND(object):
def __init__(self, data): def __init__(self, data=None, out_file=None, debug=False):
self.data = [] self.data = []
if data != None: if data != None:
self.Unpack(data) self.Unpack(data, out_file, debug)
def Unpack(self, data): def Unpack(self, data, out_file, debug=False):
pos = 0 file = open(out_file, 'wb')
if file:
pos = 0
count = Struct.uint32(data[pos:pos+4], endian='>') count = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4
print "Count: %08x" % count
print "\n%08x\n" % pos
offset_list = []
for x in xrange(count):
offset = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4 pos += 4
print "Offset: %08x" % offset if debug == True:
offset_list.append(offset) print "Count: %08x" % count
print "\n%08x\n" % pos
print "\n%08x\n" % pos offset_list = []
for x in xrange(count):
offset = Struct.uint32(data[pos:pos+4], endian='>')
pos += 4
if debug == True:
print "Offset: %08x" % offset
offset_list.append(offset)
for x in xrange(count): if debug == True:
pos = offset_list[x] print "\n%08x\n" % pos
string = nullterm(data[pos:])
string = unicode(string, 'utf_16_be') for x in xrange(count):
print "String: %s" % string pos = offset_list[x]
pos += len(string) string = nullterm(data[pos:])
string = unicode(string, 'utf_16_be')
if debug == True:
print "String: %s" % string.encode('utf-8')
pos += len(string)
file.write(string.encode('utf-8'))
file.write('\n')
file.close()
else:
print "Could not open file for writing"
sys.exit(1)
def write(self, data, out_file):
file = open(out_file, 'wb')
if file:
pos = 0
count = 0
string_list = []
while pos < len(data):
temp = denullterm(data[pos:])
pos += len(temp) + 1
string = unicode(temp, 'utf-8')
string_list.append(string)
count += 1
file.write(struct.pack('>I', count))
pos = count * 4 + 4
for x in xrange(count):
file.write(struct.pack('>I', pos))
pos += len(string_list[x]) * 2 + 2
for x in xrange(count):
file.write(string_list[x].encode('utf_16_be'))
file.write('\x00\x00')
while pos % 0x20:
pos += 2
file.write('\x00\x00')
file.close()
else:
print "Could not open file for writing"
sys.exit(1)
def main(): def main():
if len(sys.argv) == 1: if len(sys.argv) == 1:
print 'Usage: python znd.py <filename>' print 'Usage: python znd.py -r <filename.znd> <filename.hog>'
print ' == OR == '
print 'Usage: python znd.py -w <filename.hog> <filename.znd>'
sys.exit(1) sys.exit(1)
f = open(sys.argv[1], 'rb') if sys.argv[1] == "-r":
if f: f = open(sys.argv[2], 'rb')
znd_buffer = f.read() if f:
f.close() znd_buffer = f.read()
f.close()
else:
print 'Could not open file for reading'
sys.exit(1)
znd = ZND(znd_buffer, sys.argv[3], debug=False)
elif sys.argv[1] == "-w":
f = open(sys.argv[2], 'rb')
if f:
buffer = f.read()
f.close()
else:
print 'Could not open file for reading'
sys.exit(1)
znd = ZND()
znd.write(buffer, sys.argv[3])
else: else:
print 'Could not open file for reading' print 'Usage: python znd.py -r <filename.znd> <filename.hog>'
print ' == OR == '
print 'Usage: python znd.py -w <filename.hog> <filename.znd>'
sys.exit(1) sys.exit(1)
znd = ZND(znd_buffer)
if __name__ == "__main__": if __name__ == "__main__":
main() main()