最終更新 1 month ago

Pump It Up Fiesta 2 Save Decrypter/Encrypter

修正履歴 92bb0f0bdc194a1f9926d764fef528926fd73919

offsets.txt Raw
1#Name # offset length datatype
2adler32 # 0x00 0x04 LE int
3adlerSeed # 0x04 0x04 LE int
4playerID # 0x08 0x08 string (null term)
5region # 0x14 0x04 LE int
6avatarID # 0x18 0x04 LE int
7level # 0x1C 0x04 LE int
8totalCalories # 0x20 0x04 LE float
9totalV02 # 0x24 0x04 LE float
10numberRunningSteps # 0x28 0x08 LE int64
11numberGamesPlayed # 0x30 0x08 LE int64
12exp # 0x38 0x08 LE int64
13arcadeScore # 0x40 0x08 LE int64
14numberMissionsCompleted # 0x48 0x04 LE int
15numberCoopMissionsCompleted # 0x4C 0x04 LE int
16battleCountWins # 0x50 0x04 LE int
17battleCountLoses # 0x54 0x04 LE int
18battleCountDraws # 0x58 0x04 LE int
19
20versionString # 0x120 0x08 string (null term)
21cpuString # 0x128 0x80 string (null term)
22motherboardString # 0x1A8 0x80 string (null term)
23gfxcardString # 0x228 0x80 string (null term)
24hddString # 0x2A8 0x20 string (null term)
25totalRamBytes # 0x2C8 0x04 LE int
26haspkeyID # 0x2CC 0x04 LE int
27machineStatsBeginnerModePlayCount # 0x2D0 0x04 LE int
28machineStatsManiacModePlayCount # 0x2D4 0x04 LE int
29machineStatsUnknown # 0x2D8 0x04 LE int
30machineStatsUnknown2 # 0x2DC 0x04 LE int
31machineStatsBattleModePlayCount # 0x2E0 0x04 LE int
32machineStatsMissionZonePlayCount # 0x2E4 0x04 LE int
33machineStatsSkillZonePlayCount # 0x2E8 0x04 LE int
34machineStatsCoopMissionPlayCount # 0x2EC 0x04 LE int
35
36
37# Machine HighScore Struct (The array starts at 0x2F0)
38songID # 0x00 0x04 LE hex
39difficulty # 0x04 0x01 byte
40mode # 0x05 0x01 byte
41grade # 0x06 0x01 byte
42clearState # 0x07 0x01 byte
43scoreTotal # 0x08 0x04 LE int
44playCountTotal # 0x0C 0x04 LE int
45unknown # 0x10 0x04 LE int
46playerID # 0x14 0x08 string (null term)
47unknown2 # 0x1C 0x04 LE int
48nullPadding # 0x20 0x04 LE int
49
50# Personal HighScore Struct (The array starts at 0x25970)
51songID # 0x00 0x04 LE hex
52difficulty # 0x04 0x01 byte
53mode # 0x05 0x01 byte
54grade # 0x06 0x01 byte
55clearAndUnlockedState # 0x07 0x01 byte # Do an |= 0x40 to unlock
56scoreTotal # 0x08 0x04 LE int
57playCountTotal # 0x0C 0x04 LE int
58nullPadding # 0x10 0x04 LE int
59
tool.py Raw
1import struct
2import zlib
3
4def 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
20def 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