import sys sys.path.append('..\\..') from PyStand import Struct uint32 = Struct.uint32 class XBEHeader(Struct): __endian__ = Struct.LE def __format__(self): self.magic = Struct.string(4) self.sig = Struct.string(0x100) self.base, self.headerSize, self.imageSize = uint32[3] self.imageHeaderSize, self.timestamp = uint32[2] self.certAddr, self.numSects, self.sectHeaders = uint32[3] self.flags, self.entry, self.tls = uint32[3] self.stackCommit, self.heapReserve, self.heapCommit = uint32[3] self.baseAddress, self.peImageSize = uint32[2] self.peChecksum, self.peTimestamp = uint32[2] self.pathName, self.fileName, self.uniFileName = uint32[3] self.thunkAddr, self.nonKernel = uint32[2] self.numLibraryVers, self.libraryVers = uint32[2] self.kernelLibraryVers, self.xapiLibraryVers = uint32[2] self.logoBitmapAddr, self.logoBitmapSize = uint32[2] class XBECert(Struct): __endian__ = Struct.LE def __format__(self): self.certSize, self.timestamp, self.titleID = uint32[3] self.titleName = Struct.string(0x50, encoding='utf-16', stripNulls=True) self.altTitleIDs = uint32[16] self.media, self.region, self.rating = uint32[3] self.diskNumber, self.version = uint32[2] self.LANKey, self.sigKey = Struct.string(16)[2] self.altSigKeys = Struct.string(16)[16] class XBESectionHeader(Struct): __endian__ = Struct.LE def __format__(self): self.flags, self.virtAddr, self.virtSize = uint32[3] self.rawAddr, self.rawSize = uint32[2] self.nameAddr, self.nameRefCount = uint32[2] self.headRefCount, self.tailRefCount = uint32[2] self.digest = Struct.string(20) class XBELibraryVersion(Struct): __endian__ = Struct.LE def __format__(self): self.library = Struct.string(8) self.majorVersion, self.minorVersion, self.buildVersion = Struct.uint16[3] self.flags = Struct.uint16 class XBETLS(Struct): __endian__ = Struct.LE def __format__(self): self.dataStart, self.dataEnd = uint32[2] self.indexAddress, self.callbackAddress = uint32[2] self.zeroFillSize, self.characteristics = uint32[2] class XBE(object): def __init__(self, fp): data = fp.read() header = XBEHeader(data) assert header.magic == 'XBEH' cert = XBECert(data, header.certAddr - header.base) print cert.titleName self.sections = {} sectPos = header.sectHeaders - header.base for sect in range(header.numSects): sect = XBESectionHeader(data, sectPos) sectPos += len(sect) nameAddr = sect.nameAddr - header.base sectName = data[nameAddr:nameAddr+20].split('\0', 1)[0] sectData = data[sect.rawAddr:sect.rawAddr+sect.rawSize] self.sections[sectName] = XBESection(name=sectName, addr=sect.virtAddr, size=sect.virtSize, data=sectData) class XBESection(object): def __init__(self, name, addr, size, data): self.name, self.addr, self.size, self.data = \ name, addr, size, data if __name__=='__main__': XBE(file(sys.argv[1], 'rb'))