Последняя активность 1 month ago

Pump Prime Server Profile Getter.

geprofile.py Исходник
1#!/usr/bin/env python
2
3import socket
4import struct
5import time
6import sys
7import os
8import binascii
9from prime import *
10
11import struct
12import pysodium
13
14LAST_NOUNCE = "\x00" * 24
15
16# Just run sudo pip install pysodium
17# And then python getprofile.py profile.bin
18# With the file that you put on the USB drive
19
20# Prime Server Public Key
21pk = "\xB0\xEB\x81\x47\x51\x0A\x2E\x20\x32\xED\x2F\xC0\xF9\xD4\xEB\x88\xB0\xCA\x2D\xBD\xE7\xD6\x4E\xE2\xD0\x83\x4C\x3B\xB6\xFB\x31\x55"
22# Prime Server Private Key
23sk = "\x93\xB2\xF8\xA0\xE0\x95\x49\xDF\xAF\xFE\x36\x56\xE6\xAD\x9C\x9A\x53\x9B\xF6\x63\xD3\x7C\x08\xF0\xA4\xE6\x29\x3C\xBF\xFA\x64\x56"
24
25try:
26 os.mkdir('profiles')
27except:
28 pass
29
30if len(sys.argv) == 2:
31
32 if ".bin" in sys.argv[1]:
33 print "File Access Key Mode"
34 f = open(sys.argv[1], "rb")
35 data = f.read()
36 f.close()
37 ACCESS_KEY = binascii.hexlify(data)
38 if len(ACCESS_KEY) != 32:
39 print "Invalid Access Key!"
40 exit(1)
41 print "Read access key from %s is %s" %(sys.argv[1],ACCESS_KEY)
42 else:
43 ACCESS_KEY = sys.argv[1].lower().replace(" ","")
44 if len(ACCESS_KEY) != 32:
45 print "Invalid Access Key: %s (parsed to: %s)" %(sys.argv[1], ACCESS_KEY)
46 exit(1)
47
48 IP = "115.68.108.183"
49 #IP = "127.0.0.1"
50 PORT = 60000
51
52 accesscode = ACCESS_KEY.lower().replace(" ","")
53
54
55 ProfileID = 0
56 MachineID = 1154
57
58 login = LoginPacket()
59 login.AccessCode = accesscode
60 login.MachineID = MachineID
61 login.PlayerID = 0
62
63 tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
64 dest = (OFICIAL_SERVER_IP, 60000)
65 tcp.connect(dest)
66 data = EncryptPacket(login.ToBinary(), pk, sk)
67 tcp.send (data)
68 time.sleep(0.01)
69
70 gprof = None
71
72 msg = ""
73 profile = ""
74 while True:
75 msg += tcp.recv(4)
76 if len(msg) > 0:
77 size = struct.unpack("<I", msg[:4])[0]
78 msg = msg[4:]
79 msg += tcp.recv(size-4-len(msg))
80 while len(msg) < size-4:
81 msg += tcp.recv((size-4) - len(msg))
82
83 data = DecryptPacket(msg, pk, sk)
84 msg = ""
85 try:
86 packtype = struct.unpack("<I",data[4:8])[0]
87 if packtype == ProfilePacket.PacketType:
88 profile = ProfilePacket()
89 profile.FromBinary(data)
90 f = open ("profiles/%s" %accesscode, "wb")
91 f.write(data)
92 f.close()
93 gprof = profile
94 break
95
96 elif packtype == KeepAlivePacket.PacketType:
97 #print "Received KeepAlive"
98 pass
99
100 elif packtype == ProfileBusyPacket.PacketType:
101 break
102
103 else:
104 #print "PacketType: %s (%x)" %(packtype, packtype)
105 f = open("pack-%s-%x.bin"%(packtype,packtype),"wb")
106 f.write(data)
107 f.close()
108 except Exception,e:
109 print "Error: %s" %e
110 tcp.close()
111 if gprof == None:
112 print '{}'
113 else:
114 print '{"avatar":"%s","name":"%s"}' % (gprof.Avatar, gprof.Nickname)
115else:
116 print "{}"
117
prime.py Исходник
1#!/usr/bin/env python
2
3'''
4 ____ _ _ _ _
5 | _ \ _ __(_)_ __ ___ ___ | | (_) |__ _ __ __ _ _ __ _ _
6 | |_) | '__| | '_ ` _ \ / _ \ | | | | '_ \| '__/ _` | '__| | | |
7 | __/| | | | | | | | | __/ | |___| | |_) | | | (_| | | | |_| |
8 |_| |_| |_|_| |_| |_|\___| |_____|_|_.__/|_| \__,_|_| \__, |
9 |___/
10
11 This is a Prime Library for Prime Server
12'''
13
14import struct
15import binascii
16import pysodium
17import time
18import socket
19
20LAST_NOUNCE = "\x00" * 24
21OFICIAL_SERVER_IP = "115.68.108.183"
22
23def DownloadProfile(accesscode, pk, sk):
24 accesscode = accesscode.lower().replace(" ","")
25
26 login = LoginPacket()
27 login.AccessCode = accesscode
28
29 tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
30 dest = (OFICIAL_SERVER_IP, 60000)
31 tcp.connect(dest)
32 data = EncryptPacket(login.ToBinary(), pk, sk)
33 tcp.send (data)
34 time.sleep(0.1)
35 msg = ""
36 profile = ""
37 while True:
38 msg += tcp.recv(4)
39 if len(msg) > 0:
40 size = struct.unpack("<I", msg[:4])[0]
41 msg = msg[4:]
42 msg += tcp.recv(size-4-len(msg))
43 while len(msg) < size-4:
44 msg += tcp.recv((size-4) - len(msg))
45
46 data = DecryptPacket(msg, pk, sk)
47 try:
48 packtype = struct.unpack("<I",data[4:8])[0]
49 if packtype == ProfilePacket.PacketType:
50 print "Got Profile Packet!"
51 profile = ProfilePacket()
52 profile.FromBinary(data)
53 print "NickName: %s" %profile.Nickname
54 break
55 else:
56 print "PacketType: %s (%x)" %(packtype, packtype)
57 except Exception,e:
58 print "Error: %s" %e
59 tcp.close()
60 return profile
61
62def SendSongPacket(accesscode, pk, sk):
63 pass
64
65def DecryptPacket(packet, pk, sk):
66 nounce = packet[:24]
67 data = packet[24:]
68 LAST_NOUNCE = nounce
69 return pysodium.crypto_box_open(data, nounce, pk, sk)
70
71def EncryptPacket(packet, pk, sk):
72 nounce = LAST_NOUNCE
73 data = pysodium.crypto_box(packet, nounce, pk, sk)
74 return struct.pack("<I",len(data)+24+4) + nounce + data
75
76class RequestWorldBest:
77 PacketHead = 2
78 PacketType = 0x1000008
79
80 def ToBinary(self):
81 return struct.pack("<2I", self.PacketHead, self.PacketType)
82
83 def FromBinary(self,binary):
84 self.PacketHead, self.PacketType = struct.unpack("<2I", binary)
85
86class RequestRankMode:
87 PacketHead = 3
88 PacketType = 0x100000A
89
90 def ToBinary(self):
91 return struct.pack("<2I", self.PacketHead, self.PacketType)
92
93 def FromBinary(self,binary):
94 self.PacketHead, self.PacketType = struct.unpack("<2I", binary)
95
96
97class ACKPacket:
98 PacketHead = 1
99 PacketType = 0x1000002
100 MachineID = 0xFFFFFFF
101
102 def ToBinary(self):
103 return struct.pack("<3I", self.PacketHead, self.PacketType, self.MachineID)
104
105 def FromBinary(self,binary):
106 self.PacketHead, self.PacketType, self.MachineID = struct.unpack("<3I", binary)
107
108class KeepAlivePacket():
109 PacketHead = 1
110 PacketType = 0x3000000
111 PacketTrail = 65535
112
113 def ToBinary(self):
114 return struct.pack("<3I", self.PacketHead, self.PacketType, self.PacketTrail)
115
116 def FromBinary(self,binary):
117 self.PacketHead, self.PacketType, self.PacketTrail = struct.unpack("<3I", binary)
118
119class ByePacket:
120 PacketHead = 1
121 PacketType = 0x1000010
122 ProfileID = 3029
123
124 def ToBinary(self):
125 return struct.pack("<3I", self.PacketHead, self.PacketType, self.ProfileID)
126
127 def FromBinary(self,binary):
128 self.PacketHead, self.PacketType, self.ProfileID = struct.unpack("<3I", binary)
129
130
131class ProfileBusyPacket():
132 PacketHead = 1
133 PacketType = 0x1000005
134 unk0 = 0
135
136 def ToBinary(self):
137 return struct.pack("<3I", self.PacketHead, self.PacketType, self.unk0)
138
139 def FromBinary(self,binary):
140 self.PacketHead, self.PacketType, self.unk0 = struct.unpack("<3I", binary)
141
142class RankModePacket:
143 PacketHead = 3
144 PacketType = 0x100000B
145 rankdata = {}
146
147 _TOTAL_SIZE = 16008
148
149 def ToBinary(self):
150 packet = struct.pack("<2I", self.PacketHeader, self.PacketType)
151 for key in self.rankdata.keys():
152 packet += struct.pack("<I12s12s12s",key,self.rankdata[key][0],self.rankdata[key][1],self.rankdata[key][2])
153 packet += "\x00" * (self._TOTAL_SIZE - len(packet))
154 return packet
155
156 def FromBinary(self, binary):
157 self.PacketHead, self.PacketType = struct.unpack("<2I", binary[:8])
158 data = binary[8:]
159 i = 0
160 while i < len(data):
161 songid, first, second, third = struct.unpack("<I12s12s12s",data[i:i+40])
162 if songid == 0x00:
163 break
164 i+= 40
165 first = first.split("\x00")[0]
166 second = second.split("\x00")[0]
167 third = third.split("\x00")[0]
168 self.rankdata[songid] = [first,second,third]
169
170 def Print(self):
171 print "RankModePacket"
172 for key in self.rankdata.keys():
173 print "0x%04x: %s -> %s -> %s" % (key,self.rankdata[key][0],self.rankdata[key][1],self.rankdata[key][2])
174
175
176class MachineInfoPacket:
177 '''
178 Send from client when game starts
179 '''
180 PacketHead = 1
181 PacketType = 0x1000001
182 unk0 = 0
183 unk1 = 0
184 unk2 = 0
185 MacAddress = "" # 20 bytes
186 Version = "" # 12 bytes
187 Processor = "" # 128 bytes
188 MotherBoard = "" # 128 bytes
189 GraphicsCard = "" # 128 bytes
190 HDDSerial = "" # 32 bytes
191 USBMode = "" # 128 bytes
192 Memory = 0
193 unk6 = 0
194 unk7 = 0
195 unk8 = 0
196 unk9 = 0
197 unk10 = 0
198 unk11 = 0
199 unk12 = 0
200 unk13 = 0
201 unk14 = 0
202 unk15 = "" # 104 bytes
203 PacketTrail = 0xFFFFFFFF
204
205 def ToBinary(self):
206 return struct.pack("<5I20s12s128s128s128s32s128s10I104sI", self.PacketHead, self.PacketType, self.unk0, self.DongleID, self.unk2, self.MacAddress, self.Version, self.Processor, self.MotherBoard, self.GraphicsCard, self.HDDSerial, self.USBMode, self.Memory, self.unk6, self.unk7, self.unk8, self.unk9, self.unk10, self.unk11, self.unk12, self.unk13, self.unk14, self.unk15, self.PacketTrail)
207
208 def FromBinary(self,binary):
209 self.PacketHead, self.PacketType, self.unk0, self.DongleID, self.unk2, self.MacAddress, self.Version, self.Processor, self.MotherBoard, self.GraphicsCard, self.HDDSerial, self.USBMode, self.Memory, self.unk6, self.unk7, self.unk8, self.unk9, self.unk10, self.unk11, self.unk12, self.unk13, self.unk14, self.unk15, self.PacketTrail = struct.unpack("<5I20s12s128s128s128s32s128s10I104sI", binary)
210 self.MacAddress = self.MacAddress.split("\x00")[0]
211 self.Version = self.Version.split("\x00")[0]
212 self.Processor = self.Processor.split("\x00")[0]
213 self.MotherBoard = self.MotherBoard.split("\x00")[0]
214 self.GraphicsCard = self.GraphicsCard.split("\x00")[0]
215 self.HDDSerial = self.HDDSerial.split("\x00")[0]
216 self.USBMode = self.USBMode.split("\x00")[0]
217
218 def Print(self):
219 print "Machine Packet"
220 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
221 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
222 print "\tUnknown uint32_t 0: %s (0x%x)" %(self.unk0,self.unk0)
223 print "\tDongle ID: %s (0x%x)" %(self.DongleID,self.DongleID)
224 print "\tUnknown uint32_t 2: %s (0x%x)" %(self.unk2,self.unk2)
225 print "\tMac Address: %s" %self.MacAddress
226 print "\tVersion: %s" %self.Version
227 print "\tProcessor: %s" %self.Processor
228 print "\tMother Board: %s" %self.MotherBoard
229 print "\tGraphics Card: %s" %self.GraphicsCard
230 print "\tHDD Serial: %s" %self.HDDSerial
231 print "\tUSB Mode: %s" %self.USBMode
232 print "\tMemory: %s" %self.Memory
233 print "\tUnknown uint32_t 6: %s (0x%x)" %(self.unk6,self.unk6)
234 print "\tUnknown uint32_t 7: %s (0x%x)" %(self.unk7,self.unk7)
235 print "\tUnknown uint32_t 8: %s (0x%x)" %(self.unk8,self.unk8)
236 print "\tUnknown uint32_t 9: %s (0x%x)" %(self.unk9,self.unk9)
237 print "\tUnknown uint32_t 10: %s (0x%x)" %(self.unk10,self.unk10)
238 print "\tUnknown uint32_t 11: %s (0x%x)" %(self.unk11,self.unk11)
239 print "\tUnknown uint32_t 12: %s (0x%x)" %(self.unk12,self.unk12)
240 print "\tUnknown uint32_t 13: %s (0x%x)" %(self.unk13,self.unk13)
241 print "\tUnknown uint32_t 14: %s (0x%x)" %(self.unk14,self.unk14)
242 print "\tUnknown String: %s" %(binascii.hexlify(self.unk15))
243 print "\tPacket Trail: %s (0x%x)" %(self.PacketTrail, self.PacketTrail);
244
245class MachineInfoPacket_v2:
246 '''
247 Send from client when game starts
248 '''
249 PacketHead = 1
250 PacketType = 0x1000011
251 MachineID = 1130
252 DongleID = 0xC0FEBABE
253 CountryID = 24
254 MacAddress = "" # 20 bytes
255 Version = "" # 12 bytes
256 Processor = "" # 128 bytes
257 MotherBoard = "" # 128 bytes
258 GraphicsCard = "" # 128 bytes
259 HDDSerial = "" # 32 bytes
260 USBMode = "" # 128 bytes
261 Memory = 0
262 ConfigMagic = 345396
263 unk7 = 0xFFFFFFFF
264 unk8 = 0xFFFFFF
265 unk9 = 516
266 unk10 = 0
267 unk11 = 262144
268 unk12 = 16777216
269 unk13 = 256
270 unk14 = 16777217
271 unk15 = 1052672
272 unk16 = 0
273 unk17 = 0
274 unk18 = 0
275 unk19 = 0
276 unk20 = 0
277 unk21 = 0
278 unk22 = 145840
279 unk23 = "" # 76 bytes
280 netaddr = "" # 16 bytes
281 def ToBinary(self):
282 return struct.pack("<5I20s12s128s128s128s32s128s18I76s16s", self.PacketHead, self.PacketType, self.MachineID, self.DongleID, self.CountryID, self.MacAddress, self.Version, self.Processor, self.MotherBoard, self.GraphicsCard, self.HDDSerial, self.USBMode, self.Memory, self.ConfigMagic, self.unk7, self.unk8, self.unk9, self.unk10, self.unk11, self.unk12, self.unk13, self.unk14, self.unk15, self.unk16, self.unk17, self.unk18, self.unk19, self.unk20, self.unk21, self.unk22, self.unk23, self.netaddr)
283
284 def FromBinary(self,binary):
285 self.PacketHead, self.PacketType, self.MachineID, self.DongleID, self.CountryID, self.MacAddress, self.Version, self.Processor, self.MotherBoard, self.GraphicsCard, self.HDDSerial, self.USBMode, self.Memory, self.ConfigMagic, self.unk7, self.unk8, self.unk9, self.unk10, self.unk11, self.unk12, self.unk13, self.unk14, self.unk15, self.unk16, self.unk17, self.unk18, self.unk19, self.unk20, self.unk21, self.unk22, self.unk23, self.netaddr = struct.unpack("<5I20s12s128s128s128s32s128s18I76s16s", binary)
286 self.MacAddress = self.MacAddress.split("\x00")[0]
287 self.Version = self.Version.split("\x00")[0]
288 self.Processor = self.Processor.split("\x00")[0]
289 self.MotherBoard = self.MotherBoard.split("\x00")[0]
290 self.GraphicsCard = self.GraphicsCard.split("\x00")[0]
291 self.HDDSerial = self.HDDSerial.split("\x00")[0]
292 self.USBMode = self.USBMode.split("\x00")[0]
293
294 def Print(self):
295 print "Machine Packet"
296 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
297 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
298 print "\tMachineID: %s (0x%x)" %(self.MachineID,self.MachineID)
299 print "\tDongle ID: %s (0x%x)" %(self.DongleID,self.DongleID)
300 print "\tCountry ID: %s (0x%x)" %(self.CountryID,self.CountryID)
301 print "\tMac Address: %s" %self.MacAddress
302 print "\tVersion: %s" %self.Version
303 print "\tProcessor: %s" %self.Processor
304 print "\tMother Board: %s" %self.MotherBoard
305 print "\tGraphics Card: %s" %self.GraphicsCard
306 print "\tHDD Serial: %s" %self.HDDSerial
307 print "\tUSB Mode: %s" %self.USBMode
308 print "\tMemory: %s" %self.Memory
309 print "\tConfig Magic: %s (0x%x)" %(self.ConfigMagic,self.ConfigMagic)
310 print "\tUnknown uint32_t 7: %s (0x%x)" %(self.unk7,self.unk7)
311 print "\tUnknown uint32_t 8: %s (0x%x)" %(self.unk8,self.unk8)
312 print "\tUnknown uint32_t 9: %s (0x%x)" %(self.unk9,self.unk9)
313 print "\tUnknown uint32_t 10: %s (0x%x)" %(self.unk10,self.unk10)
314 print "\tUnknown uint32_t 11: %s (0x%x)" %(self.unk11,self.unk11)
315 print "\tUnknown uint32_t 12: %s (0x%x)" %(self.unk12,self.unk12)
316 print "\tUnknown uint32_t 13: %s (0x%x)" %(self.unk13,self.unk13)
317 print "\tUnknown uint32_t 14: %s (0x%x)" %(self.unk14,self.unk14)
318 print "\tUnknown uint32_t 15: %s (0x%x)" %(self.unk14,self.unk15)
319 print "\tUnknown uint32_t 16: %s (0x%x)" %(self.unk14,self.unk16)
320 print "\tUnknown uint32_t 17: %s (0x%x)" %(self.unk14,self.unk17)
321 print "\tUnknown uint32_t 18: %s (0x%x)" %(self.unk14,self.unk18)
322 print "\tUnknown uint32_t 19: %s (0x%x)" %(self.unk14,self.unk19)
323 print "\tUnknown uint32_t 20: %s (0x%x)" %(self.unk14,self.unk20)
324 print "\tUnknown uint32_t 21: %s (0x%x)" %(self.unk14,self.unk21)
325 print "\tUnknown uint32_t 22: %s (0x%x)" %(self.unk14,self.unk22)
326 print "\tUnknown String: %s" %(binascii.hexlify(self.unk23))
327 print "\tNet Address: %s" %(self.netaddr);
328
329class ScoreBoardPacket():
330 '''
331 Send from client when finishes a Song
332 '''
333 PacketHead = 0x0000001
334 PacketType = 0x100000E
335
336 SongID = 0
337 ChartLevel = 0
338 Type = 0
339 Flag = 0
340 Score = 0
341 RealScore0 = 0
342
343 unk0 = "" # 16 bytes
344
345 RealScore1 = 0
346 Grade = 0
347 Kcal = 0
348
349 Perfect = 0
350 Great = 0
351 Good = 0
352 Bad = 0
353 Miss = 0
354 MaxCombo = 0
355 EXP = 0
356 PP = 0
357
358 RunningStep = 0
359 unk2 = 0
360 unk3 = 0
361 unk4 = 0
362 unk5 = 0
363 RushSpeed = 0
364
365 GameVersion = "" # 12 Bytes
366
367 MachineID = 0xFFFFFFFF
368 ProfileID = 0x00
369
370 def ToBinary(self):
371 return struct.pack("<3IH2B2I16s2If6I4H3If12s2I", self.PacketHead, self.PacketType, self.SongID, self.ChartLevel, self.Type, self.Flag, self.Score, self.RealScore0, self.unk0, self.RealScore1, self.Grade, self.Kcal, self.Perfect, self.Great, self.Good, self.Bad, self.Miss, self.MaxCombo, self.EXP, self.PP, self.RunningStep, self.unk2, self.unk3, self.unk4, self.unk5, self.RushSpeed, self.GameVersion, self.MachineID, self.ProfileID)
372
373 def FromBinary(self,binary):
374 self.PacketHead, self.PacketType, self.SongID, self.ChartLevel, self.Type, self.Flag, self.Score, self.RealScore0, self.unk0, self.RealScore1, self.Grade, self.Kcal, self.Perfect, self.Great, self.Good, self.Bad, self.Miss, self.MaxCombo, self.EXP, self.PP, self.RunningStep, self.unk2, self.unk3, self.unk4, self.unk5, self.RushSpeed, self.GameVersion, self.MachineID, self.ProfileID = struct.unpack("<3IH2B2I16s2If6I4h3If12s2I", binary)
375
376 def Print(self):
377 print "Score Board Packet"
378 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
379 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
380 print "\tSongID: %s (0x%x)" %(self.SongID,self.SongID)
381 print "\tChart Level: %s" %self.ChartLevel
382 print "\tType: %s (0x%x)" %(self.Type,self.Type)
383 print "\tFlag: %s (0x%x)" %(self.Flag, self.Flag)
384 print "\tScore: %s" %self.Score
385 print "\tRealScore0: %s" %self.RealScore0
386 print "\tUnknown String 0: %s" %binascii.hexlify(self.unk0)
387 print "\tRealScore1: %s" %self.RealScore1
388 print "\t\tGrade: %s (0x%x)" %(self.Grade, self.Grade)
389 print "\t\tKcal: %s" %self.Kcal
390 print "\t\tPerfect: %s" %self.Perfect
391 print "\t\tGreat: %s" %self.Great
392 print "\t\tGood: %s" %self.Good
393 print "\t\tBad: %s" %self.Bad
394 print "\t\tMiss: %s" %self.Miss
395 print "\t\tMaxCombo: %s" %self.MaxCombo
396 print "\t\tEXP: %s" %self.EXP
397 print "\t\tPP: %s" %self.PP
398 print ""
399 print "\tRunning Step: %s" %(self.RunningStep)
400 print "\tUnknown uint16_t 2: %s (0x%x)" %(self.unk2,self.unk2)
401 print "\tUnknown uint32_t 3: %s (0x%x)" %(self.unk3,self.unk3)
402 print "\tUnknown uint32_t 4: %s (0x%x)" %(self.unk4,self.unk4)
403 print "\tUnknown uint32_t 5: %s (0x%x)" %(self.unk5,self.unk5)
404 print "\tRushSpeed: %s" %(self.RushSpeed)
405 print "\tMachineID: %s (0x%x)" %(self.MachineID, self.MachineID);
406 print "\tProfileID: %s (0x%x)" %(self.ProfileID, self.ProfileID);
407
408
409class LoginPacket():
410 '''
411 Packet that Client sends to Server to Receive Login Stuff
412 '''
413 PacketHead = 1
414 PacketType = 0x1000003
415 PlayerID = 0
416 MachineID = 1130
417 AccessCode = "" # 32 bytes
418 PacketTrail = 0x0
419
420 def ToBinary(self):
421 return struct.pack("<4I32sI", self.PacketHead, self.PacketType, self.PlayerID, self.MachineID, self.AccessCode, self.PacketTrail)
422
423 def FromBinary(self,binary):
424 self.PacketHead, self.PacketType, self.PlayerID, self.MachineID, self.AccessCode, self.PacketTrail = struct.unpack("<4I32sI", binary)
425
426 def Print(self):
427 print "LoginPacket"
428 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
429 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
430 print "\tPlayerID: %s (0x%x)" %(self.PlayerID, self.PlayerID)
431 print "\tMachineID: %s (0x%x)" %(self.MachineID, self.MachineID)
432 print "\tAccessCode: %s" %self.AccessCode
433 print "\tPacketTrail: %s (0x%x)" %(self.PacketTrail,self.PacketTrail)
434
435class uScore():
436 '''
437 Song Score Entry on Profile Data
438 '''
439 SongID = 0
440 ChartLevel = 0
441 unk0 = 0
442 unk1 = 0
443 Score = 0
444 RealScore = 0
445 unk2 = 0
446
447 def ToBinary(self):
448 return struct.pack("<I2BH3I", self.SongID, self.ChartLevel, self.unk0, self.unk1, self.Score, self.RealScore, self.unk2)
449
450 def FromBinary(self,binary):
451 self.SongID, self.ChartLevel, self.unk0, self.unk1, self.Score, self.RealScore, self.unk2 = struct.unpack("<I2BH3I", binary)
452
453 def Print(self):
454 print "\t\tSongID: %s (0x%x) at level %s - Score: %s - RealScore: %s - [Unk0: %s(0x%x), Unk1: %s(0x%x), Unk2: %s(0x%x)]" %(self.SongID, self.SongID, self.ChartLevel, self.Score, self.RealScore, self.unk0, self.unk0, self.unk1, self.unk1, self.unk2, self.unk2)
455
456class EnterProfilePacket():
457 '''
458 Packet Received when Someone enters ingame
459 '''
460 PacketHead = 2
461 PacketType = 0x100000F
462 PlayerID = 0
463 MachineID = 1130
464 ProfileID = 0
465 def ToBinary(self):
466 return struct.pack("<5I", self.PacketHead, self.PacketType, self.PlayerID, self.MachineID, self.ProfileID)
467
468 def FromBinary(self,binary):
469 self.PacketHead, self.PacketType, self.PlayerID, self.MachineID, self.ProfileID = struct.unpack("<5I", binary)
470
471 def Print(self):
472 print "EnterProfilePacket: "
473 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
474 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
475 print "\tPlayerID: %s (0x%x)" %(self.PlayerID, self.PlayerID)
476 print "\tMachineID: %s (0x%x)" %(self.MachineID, self.MachineID)
477 print "\tProfileID: %s (0x%x)" %(self.ProfileID, self.ProfileID)
478
479class ProfilePacket():
480 '''
481 Packet send by server to client after LoginPacket
482 '''
483 __USCORE_PACK_LENGTH = 20 # Used for packing/unpacking uScore packets
484
485 PacketHead = 1
486 PacketType = 0x1000004
487 PlayerID = 0 # 32 bit
488 AccessCode = "" # 36 bytes
489 Nickname = "" # 12 Bytes
490 ProfileID = 0 # 32 bit
491 CountryID = 0 # 8 bit
492 Avatar = 0 # 8 bit
493 Level = 0 # 8 bit
494 unk2 = 0 # 8 bit
495 EXP = 0 # 64 bit
496 PP = 0 # 64 bit
497 RankSingle = 0 # 64 bit
498 RankDouble = 0 # 64 bit
499 RunningStep = 0 # 64 bit
500 PlayCount = 0 # 32 bit
501 Kcal = 0 # Float
502 Modifiers = 0 # 64 bit
503 unk3 = 0 # 32 bit
504 RushSpeed = 0 # Float
505 unk4 = 0 # 32 bit
506 Scores = [] # 4384 uScore Items
507
508 def ToBinary(self):
509 data0 = struct.pack("<3I36s12sI4B5QIfQIfI", self.PacketHead, self.PacketType, self.PlayerID, self.AccessCode, self.Nickname, self.ProfileID, self.CountryID, self.Avatar, self.Level, self.unk2, self.EXP, self.PP, self.RankSingle, self.RankDouble, self.RunningStep, self.PlayCount, self.Kcal, self.Modifiers, self.unk3, self.RushSpeed, self.unk4)
510 data1 = ""
511 for i in self.Scores:
512 data1 += i.ToBinary()
513
514 data1 += "\x00" * (4384 - len(self.Scores)) * self.__USCORE_PACK_LENGTH
515 return data0 + data1
516
517 def FromBinary(self,binary):
518 data0 = binary[:0x88]
519 data1 = binary[0x88:]
520 self.PacketHead, self.PacketType, self.PlayerID, self.AccessCode, self.Nickname, self.ProfileID, self.CountryID, self.Avatar, self.Level, self.unk2, self.EXP, self.PP, self.RankSingle, self.RankDouble, self.RunningStep, self.PlayCount, self.Kcal, self.Modifiers, self.unk3, self.RushSpeed, self.unk4 = struct.unpack("<3I36s12sI4B5QIfQIfI", data0)
521 i = 0
522 c = 0
523 self.Nickname = self.Nickname.split("\x00")[0]
524 while i < len(data1):
525 scoretmp = uScore()
526 scoretmp.FromBinary(data1[i:i+self.__USCORE_PACK_LENGTH])
527 if scoretmp.SongID != 0:
528 self.Scores.append(scoretmp)
529 c += 1
530 i += self.__USCORE_PACK_LENGTH
531 #print "Loaded %s uScores" %c
532
533 def Print(self):
534 print "Profile Packet"
535 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
536 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
537 print "\tPlayerID: %s (0x%x)" %(self.PlayerID, self.PlayerID)
538 print "\tAcessCode: %s" %self.AccessCode
539 print "\tNickName: %s" %self.Nickname
540 print "\tProfileID: %s (0x%x)" %(self.ProfileID, self.ProfileID)
541 print "\tCountryID: %s (0x%x)" %(self.CountryID, self.CountryID)
542 print "\tAvatar: %s (0x%x)" %(self.Avatar, self.Avatar)
543 print "\tLevel: %s " %(self.Level)
544 print "\tUnknown uint32_t 2: %s (0x%x)" %(self.unk2, self.unk2)
545 print "\tExperience: %s" %self.EXP
546 print "\tPP: %s" %self.PP
547 print "\tRank Single: %s (0x%x)" %(self.RankSingle, self.RankSingle)
548 print "\tRank Double: %s (0x%x)" %(self.RankDouble, self.RankDouble)
549 print "\tRunning Steps: %s" % self.RunningStep
550 print "\tPlay Count: %s" % self.PlayCount
551 print "\tKcal: %s" % self.Kcal
552 print "\tModifiers: %s (0x%x)" % (self.Modifiers, self.Modifiers)
553 print "\tUnknown uint32_t 3: %s (0x%s)" % (self.unk3, self.unk3)
554 print "\tRush Speed: %s" % self.RushSpeed
555 print "\tUnknown uint32_t 3: %s (0x%s)" % (self.unk3, self.unk4)
556 print "\tScore Board: "
557 for i in self.Scores:
558 i.Print()
559
560class RequestLevelUpInfoPacket():
561 '''
562 Packet send by client after all musics has been played.
563 '''
564
565 PacketHead = 1
566 PacketType = 0x100000C
567 ProfileID = 3029
568
569 def ToBinary(self):
570 return struct.pack("<3I", self.PacketHead, self.PacketType, self.ProfileID)
571
572 def FromBinary(self,binary):
573 self.PacketHead, self.PacketType, self.ProfileID = struct.unpack("<3I", binary)
574
575 def Print(self):
576 print "RequestLevelUpInfoPacket: "
577 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
578 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
579 print "\tProfileID: %s (0x%x)" %(self.ProfileID, self.ProfileID)
580
581class LevelUpInfoPacket():
582 '''
583 Packet send by server after receiving a RequestLevelUpInfoPacket
584 '''
585 PacketHead = 1
586 PacketType = 0x100000D
587 ProfileID = 3029
588 Level = 0
589
590 def ToBinary(self):
591 return struct.pack("<4I", self.PacketHead, self.PacketType, self.ProfileID, self.Level)
592
593 def FromBinary(self,binary):
594 self.PacketHead, self.PacketType, self.ProfileID, self.Level = struct.unpack("<4I", binary)
595
596 def Print(self):
597 print "EnterProfilePacket: "
598 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
599 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
600 print "\tProfileID: %s (0x%x)" %(self.ProfileID, self.ProfileID)
601 print "\tLevel: %s" %(self.Level)
602
603
604class GameOverPacket():
605 '''
606 Packet send by client on GameOver
607 '''
608
609 PacketHead = 1
610 PacketType = 0x1000001
611 ProfileID = 3029
612
613 def ToBinary(self):
614 return struct.pack("<3I", self.PacketHead, self.PacketType, self.ProfileID)
615
616 def FromBinary(self,binary):
617 self.PacketHead, self.PacketType, self.ProfileID = struct.unpack("<3I", binary)
618
619 def Print(self):
620 print "EnterProfilePacket: "
621 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
622 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
623 print "\tProfile ID: %s (0x%x)" %(self.ProfileID, self.ProfileID)
624
625class WorldBestScore():
626 '''
627 WorldBest Entry
628 '''
629 SongID = 0
630 ChartLevel = 0
631 ChartMode = 0
632 Score = 0
633 unk0 = 0
634 unk1 = 0
635 Nickname = ""
636
637 def ToBinary(self):
638 return struct.pack("<I2H3I12s", self.SongID, self.ChartLevel, self.ChartMode, self.Score, self.unk0, self.unk1, self.Nickname)
639
640 def FromBinary(self,binary):
641 self.SongID, self.ChartLevel, self.ChartMode, self.Score, self.unk0, self.unk1, self.Nickname = struct.unpack("<I2H3I12s", binary)
642 self.Nickname = self.Nickname.split("\x00")[0]
643
644 def Print(self):
645 print "\tNickname: %s - SongID: %x (lvl %s mode 0x%x) - Score: %s - Unk(%s[0x%x],%s[0x%x])" %(self.Nickname, self.SongID, self.ChartLevel, self.ChartMode, self.Score, self.unk0, self.unk0, self.unk1, self.unk1)
646
647class WorldBestPacket():
648 '''
649 World Best Packet
650 '''
651 __WORLDBESTSCORE_PACK_LENGTH = 32
652
653 PacketHead = 2
654 PacketType = 0x1000009
655 Scores = [] # 4096
656
657 def ToBinary(self):
658 data0 = struct.pack("<2I", self.PacketHead, self.PacketType)
659 data1 = ""
660 for i in self.Scores:
661 data1 += i.ToBinary()
662
663 data1 += "\x00" * (4096 - len(self.Scores)) * self.__USCORE_PACK_LENGTH
664 return data0 + data1
665
666 def FromBinary(self,binary):
667 data0 = binary[:0x8]
668 data1 = binary[0x8:]
669 self.PacketHead, self.PacketType = struct.unpack("<2I", data0)
670 i = 0
671 c = 0
672 while i < len(data1):
673 scoretmp = WorldBestScore()
674 scoretmp.FromBinary(data1[i:i+self.__WORLDBESTSCORE_PACK_LENGTH ])
675 if scoretmp.SongID != 0:
676 self.Scores.append(scoretmp)
677 c += 1
678 i += self.__WORLDBESTSCORE_PACK_LENGTH
679 print "Loaded %s World Best Scores" %c
680
681 def Print(self):
682 print "World Best Score Packet"
683 print "\tPacketHead: %s (0x%x)" %(self.PacketHead,self.PacketHead)
684 print "\tPacketType: %s (0x%x)" %(self.PacketType,self.PacketType)
685 print "\tScores: "
686 for i in self.Scores:
687 i.Print()
688