Lucas Teske zrewidował ten Gist 12 years ago. Przejdź do rewizji
1 file changed, 1 insertion, 1 deletion
offsets.txt
| @@ -52,7 +52,7 @@ songID # 0x00 0x04 LE hex | |||
| 52 | 52 | difficulty # 0x04 0x01 byte | |
| 53 | 53 | mode # 0x05 0x01 byte | |
| 54 | 54 | grade # 0x06 0x01 byte | |
| 55 | - | clearAndUnlockedState # 0x07 0x01 byte | |
| 55 | + | clearAndUnlockedState # 0x07 0x01 byte # Do an |= 0x40 to unlock | |
| 56 | 56 | scoreTotal # 0x08 0x04 LE int | |
| 57 | 57 | playCountTotal # 0x0C 0x04 LE int | |
| 58 | 58 | nullPadding # 0x10 0x04 LE int | |
Lucas Teske zrewidował ten Gist 12 years ago. Przejdź do rewizji
1 file changed, 59 insertions
offsets.txt(stworzono plik)
| @@ -0,0 +1,59 @@ | |||
| 1 | + | #Name # offset length datatype | |
| 2 | + | adler32 # 0x00 0x04 LE int | |
| 3 | + | adlerSeed # 0x04 0x04 LE int | |
| 4 | + | playerID # 0x08 0x08 string (null term) | |
| 5 | + | region # 0x14 0x04 LE int | |
| 6 | + | avatarID # 0x18 0x04 LE int | |
| 7 | + | level # 0x1C 0x04 LE int | |
| 8 | + | totalCalories # 0x20 0x04 LE float | |
| 9 | + | totalV02 # 0x24 0x04 LE float | |
| 10 | + | numberRunningSteps # 0x28 0x08 LE int64 | |
| 11 | + | numberGamesPlayed # 0x30 0x08 LE int64 | |
| 12 | + | exp # 0x38 0x08 LE int64 | |
| 13 | + | arcadeScore # 0x40 0x08 LE int64 | |
| 14 | + | numberMissionsCompleted # 0x48 0x04 LE int | |
| 15 | + | numberCoopMissionsCompleted # 0x4C 0x04 LE int | |
| 16 | + | battleCountWins # 0x50 0x04 LE int | |
| 17 | + | battleCountLoses # 0x54 0x04 LE int | |
| 18 | + | battleCountDraws # 0x58 0x04 LE int | |
| 19 | + | ||
| 20 | + | versionString # 0x120 0x08 string (null term) | |
| 21 | + | cpuString # 0x128 0x80 string (null term) | |
| 22 | + | motherboardString # 0x1A8 0x80 string (null term) | |
| 23 | + | gfxcardString # 0x228 0x80 string (null term) | |
| 24 | + | hddString # 0x2A8 0x20 string (null term) | |
| 25 | + | totalRamBytes # 0x2C8 0x04 LE int | |
| 26 | + | haspkeyID # 0x2CC 0x04 LE int | |
| 27 | + | machineStatsBeginnerModePlayCount # 0x2D0 0x04 LE int | |
| 28 | + | machineStatsManiacModePlayCount # 0x2D4 0x04 LE int | |
| 29 | + | machineStatsUnknown # 0x2D8 0x04 LE int | |
| 30 | + | machineStatsUnknown2 # 0x2DC 0x04 LE int | |
| 31 | + | machineStatsBattleModePlayCount # 0x2E0 0x04 LE int | |
| 32 | + | machineStatsMissionZonePlayCount # 0x2E4 0x04 LE int | |
| 33 | + | machineStatsSkillZonePlayCount # 0x2E8 0x04 LE int | |
| 34 | + | machineStatsCoopMissionPlayCount # 0x2EC 0x04 LE int | |
| 35 | + | ||
| 36 | + | ||
| 37 | + | # Machine HighScore Struct (The array starts at 0x2F0) | |
| 38 | + | songID # 0x00 0x04 LE hex | |
| 39 | + | difficulty # 0x04 0x01 byte | |
| 40 | + | mode # 0x05 0x01 byte | |
| 41 | + | grade # 0x06 0x01 byte | |
| 42 | + | clearState # 0x07 0x01 byte | |
| 43 | + | scoreTotal # 0x08 0x04 LE int | |
| 44 | + | playCountTotal # 0x0C 0x04 LE int | |
| 45 | + | unknown # 0x10 0x04 LE int | |
| 46 | + | playerID # 0x14 0x08 string (null term) | |
| 47 | + | unknown2 # 0x1C 0x04 LE int | |
| 48 | + | nullPadding # 0x20 0x04 LE int | |
| 49 | + | ||
| 50 | + | # Personal HighScore Struct (The array starts at 0x25970) | |
| 51 | + | songID # 0x00 0x04 LE hex | |
| 52 | + | difficulty # 0x04 0x01 byte | |
| 53 | + | mode # 0x05 0x01 byte | |
| 54 | + | grade # 0x06 0x01 byte | |
| 55 | + | clearAndUnlockedState # 0x07 0x01 byte | |
| 56 | + | scoreTotal # 0x08 0x04 LE int | |
| 57 | + | playCountTotal # 0x0C 0x04 LE int | |
| 58 | + | nullPadding # 0x10 0x04 LE int | |
| 59 | + | ||
Lucas Teske zrewidował ten Gist 12 years ago. Przejdź do rewizji
1 file changed, 46 insertions
tool.py(stworzono plik)
| @@ -0,0 +1,46 @@ | |||
| 1 | + | import struct | |
| 2 | + | import zlib | |
| 3 | + | ||
| 4 | + | def decryptprofile(savedata,rankdata): | |
| 5 | + | ||
| 6 | + | seed = 0xEBADA1 | |
| 7 | + | for i in range(0,len(savedata)): | |
| 8 | + | smbuff = savedata[i] | |
| 9 | + | savedata[i] ^= (seed >> 8) & 0xFF | |
| 10 | + | seed = (0x68993 * (smbuff + seed) + 0x4FDCF) & 0xFFFFFFFF | |
| 11 | + | ||
| 12 | + | seed = 0xEBADA1 | |
| 13 | + | for i in range(0,len(rankdata)): | |
| 14 | + | smbuff = rankdata[i] | |
| 15 | + | rankdata[i] ^= (seed >> 8) & 0xFF | |
| 16 | + | seed = (0x68993 * (smbuff + seed) + 0x4FDCF) & 0xFFFFFFFF | |
| 17 | + | ||
| 18 | + | return savedata,rankdata | |
| 19 | + | ||
| 20 | + | def encryptprofile(savedata,rankdata): | |
| 21 | + | adlerseed = struct.unpack("<I",savedata[4:8]) | |
| 22 | + | newsaveadler = zlib.adler32(savedata[4:],adlerseed[0]) & 0xFFFFFFFF | |
| 23 | + | newrankadler = zlib.adler32(rankdata[4:],adlerseed[0]) & 0xFFFFFFFF | |
| 24 | + | ||
| 25 | + | #savedata[0:4] = struct.pack("<I",newsaveadler) | |
| 26 | + | #rankdata[0:4] = struct.pack("<I",newrankadler) | |
| 27 | + | savedata = struct.pack("<I",newsaveadler) + savedata[4:] | |
| 28 | + | rankdata = struct.pack("<I",newrankadler) + rankdata[4:] | |
| 29 | + | ||
| 30 | + | savedata = bytearray(savedata) | |
| 31 | + | rankdata = bytearray(rankdata) | |
| 32 | + | ||
| 33 | + | seed = 0xEBADA1 | |
| 34 | + | for i in range(0,len(savedata)): | |
| 35 | + | smbuff = savedata[i] ^ (seed >> 8) & 0xFF | |
| 36 | + | savedata[i] = smbuff | |
| 37 | + | seed = (0x68993 * (smbuff + seed) + 0x4FDCF) & 0xFFFFFFFF | |
| 38 | + | ||
| 39 | + | seed = 0xEBADA1 | |
| 40 | + | ||
| 41 | + | for i in range(0,len(rankdata)): | |
| 42 | + | smbuff = rankdata[i] ^ (seed >> 8) & 0xFF | |
| 43 | + | rankdata[i] = smbuff | |
| 44 | + | seed = (0x68993 * (smbuff + seed) + 0x4FDCF) & 0xFFFFFFFF | |
| 45 | + | ||
| 46 | + | return savedata,rankdata | |