PARAHEX TEAM
رفتن به کانال در Telegram
1 659
مشترکین
+524 ساعت
+257 روز
-58430 روز
آرشیو پست ها
1 659
def var(v):
out = bytearray()
while True:
b = v & 0x7F; v >>= 7
out.append(b | (0x80 if v else 0))
if not v: return bytes(out)
def zz(v):
return var((v << 1) ^ (v >> 63))
def build_mark_info(owner_id: int, infos: list) -> bytes:
out = bytearray(var(owner_id))
out += zz(len(infos))
for m in infos:
out += var(m["TarPlayID"])
out += bytes([m["MarkerType"] & 0xFF])
out += var(m["MarkFlag"])
out += var(m["ScannerMarkFlag"])
return bytes(out)
moco = serialize_packet(0, 970, 0, flags,
build_mark_info(self.owner_id, marks),
self.tea_key, self.udp_mask)1 659
import re
from udptool import Reader
def decode_player_join(body: bytes) -> dict:
r = Reader(body)
uid = r.var()
r.var()
pid = r.var()
nick = r.string()
runs = [m.group().decode("utf-8", "replace")
for m in re.finditer(rb"[\x20-\x7e]{2,}", body)]
tail = [s for s in runs if s != nick]
ver = tail[-1] if tail else ""
return {"NickName": nick, "PlayerID": pid, "UserID": uid, "Version": ver}
if __name__ == "__main__":
import sys, json
body = bytes.fromhex('d987849e300084808020185265645a65644b696e672121baa208f8b801be870200000000000100020401000000010000000000000000000000000100000084808020000000000000044d45040000d987849e300000000000000000000000000000000000de8305c6c694303200000008c625aa26c205ca13000000000000b1028e0b0ebe0100a1fd89af03000000000000000000000000000000000000000000000000000000000000000000000000000000000086a9c5b0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021a599a8dd0300010286a9c5b0030000000286a9c5b00302c1fab8b103000000860100000020000000005900000000000000b10200006900000000000000020000c99ee5dd030000000000000400000000d987849e3000000000000000000000000000000000a09c01000100030010312e3133322e313100000100')
print(json.dumps(decode_player_join(body), ensure_ascii=False))1 659
```py
import re
from udptool import Reader
def decode_player_join(body: bytes) -> dict:
r = Reader(body)
uid = r.var()
r.var()
pid = r.var()
nick = r.string()
runs = [m.group().decode("utf-8", "replace")
for m in re.finditer(rb"[\x20-\x7e]{2,}", body)]
tail = [s for s in runs if s != nick]
ver = tail[-1] if tail else ""
return {"NickName": nick, "PlayerID": pid, "UserID": uid, "Version": ver}
if name == "main":
import sys, json
body = bytes.fromhex('d987849e300084808020185265645a65644b696e672121baa208f8b801be870200000000000100020401000000010000000000000000000000000100000084808020000000000000044d45040000d987849e300000000000000000000000000000000000de8305c6c694303200000008c625aa26c205ca13000000000000b1028e0b0ebe0100a1fd89af03000000000000000000000000000000000000000000000000000000000000000000000000000000000086a9c5b0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021a599a8dd0300010286a9c5b0030000000286a9c5b00302c1fab8b103000000860100000020000000005900000000000000b10200006900000000000000020000c99ee5dd030000000000000400000000d987849e3000000000000000000000000000000000a09c01000100030010312e3133322e313100000100')
print(json.dumps(decode_player_join(body), ensure_ascii=False))
```
1 659
def build_emote(
EmotionID=909000001,
EmotionEffIdx=0,
Loop=False,
IsLeadEmote=False,
LeadEmotionFollowPlayerId=4294967295,
CurrentSimServerTick=0,
CreateTime=0,
NickName="",
NeedCheck=False,
PeakPoints=0,
):
b = bytearray()
v = EmotionID
while v >= 0x80:
b.append((v & 0x7F) | 0x80)
v >>= 7
b.append(v)
b.append(EmotionEffIdx & 0xFF) # EmotionEffIdx
b.append(1 if Loop else 0) # Loop
b.append(1 if IsLeadEmote else 0) # IsLeadEmote
v = LeadEmotionFollowPlayerId
while v >= 0x80:
b.append((v & 0x7F) | 0x80)
v >>= 7
b.append(v)
v = CurrentSimServerTick
while v >= 0x80:
b.append((v & 0x7F) | 0x80)
v >>= 7
b.append(v)
v = CreateTime
while v >= 0x80:
b.append((v & 0x7F) | 0x80)
v >>= 7
b.append(v)
raw = NickName.encode("utf-8")
n = _zig(len(raw))
while n >= 0x80:
b.append((n & 0x7F) | 0x80)
n >>= 7
b.append(n)
b += raw
b.append(1 if NeedCheck else 0) # NeedCheck to bypass emote check
b.append(PeakPoints & 0xFF) # PeakPoints , useless
b.append(0)
return bytes(b)1 659
https://github.com/redzedx64/FF_DEOBF
if you need classes of the udp for any new update , this tool will auto parse them and provide them too .
1 659
def decode_emote(body: bytes) -> dict:
r = Reader(body)
out = {}
out["EmotionID"] = r.var()
out["EmotionEffIdx"] = r.raw(1)[0]
out["Loop"] = bool(r.raw(1)[0])
out["IsLeadEmote"] = bool(r.raw(1)[0])
out["LeadEmotionFollowPlayerId"] = r.var()
out["CurrentSimServerTick"] = r.var()
out["CreateTime"] = r.var()
out["NickName"] = r.string()
out["NeedCheck"] = bool(r.raw(1)[0])
out["PeakPoints"] = r.raw(1)[0]
if r.p < len(body):
out["_trailing_pad"] = r.raw(1)[0]
if r.p != len(body):
out["_leftover_hex"] = body[r.p:].hex()
out["_consumed"] = f"{r.p}/{len(body)}"
return out
Reader :
class Reader:
def __init__(self, b): self.b, self.p = b, 0
def var(self):
r = sh = 0
while True:
c = self.b[self.p]; self.p += 1
r |= (c & 0x7F) << sh; sh += 7
if not c & 0x80: return r
def zz(self):
v = self.var(); return (v >> 1) ^ -(v & 1)
def raw(self, n):
v = self.b[self.p:self.p + n]; self.p += n; return v
def string(self):
n = self.zz()
return self.raw(n).decode("utf-8", "replace") if n > 0 else ""1 659
Example :
def build_join_post_body(second_part , UserID , RoomID, GameMode , MapID , ClientVersion , ClientVersionCode , ClientUrl , server_ip , mode):
fields = {
"ReqInfo": {
"UserID": UserID,
"RoomID": RoomID,
"RoomType": 1,
"GameMode": GameMode,
"ServiceRoomID": RoomID,
"MapID": MapID,
"IsReconnect": 0,
"CustomRoomIndex": 0,
"GroupIcon": 0,
"IsPCClient": 0,
"IsEmulator": 1,
"IsEmulatorPool": 0,
"SystemPlatform": 1,
"CPUType": 2,
"ChannelType": 3,
"EnableFFANTIHACKTick": 0,
"ClientLanguage": 1,
"CountryCode": "DZ",
"Role": 0,
"BuildVariantType": 1,
"NewbieChoice": 1,
"FactionType": 0,
"RankMapCount": 1,
"IfHaveMapsBonus": 0,
"GSReplayEnabled": 0,
"AccountType": 4,
"ClientVersion": ClientVersion,
"ClientVersionCode": ClientVersionCode,
"ClientUrl": ClientUrl,
"NoPowerGun": 0,
"Gender": 0,
"FriendCount": 6,
"IsCadet": 0,
"DriftBottleOwnerID": 0,
"DriftBottleOwnerName": "",
"MobileReplayEnabled": 1,
"Workshop": {
"WorkshopShareCode": "",
"WorkshopMapName": "",
"IsUnlimitedAmmo": 0,
"ModeSetting": [],
"ClientEventsWhiteList": [],
"IsUnlimitedBullet": 0,
"IsUnlimitedGloowall": 0,
"IsUnlimitedThrowables": 0,
"UGCCustomMissions": [],
"NEW_0x50": {
"Value": ""
}
},
"RelationshipInfos": [],
"IsSpecialPool": 0,
"IsTransferReport": 1,
"IsHalfWayJoin": 0,
"ShowDamageType": 0,
"WeaponProficiencyMaxItemID": 4,
"UGCGameDataMD5": [],
"QuickMsgVocal": 0,
"IsBagShow": 1,
"SamoAIParam": "",
"MapLayerID": 1,
"IsVoiceBeMuted": 0,
"IsReconnectWithoutParseToken": 0,
"GroupMode": 3 if mode == 'cs' else 0,
"MatchMode": 1,
"IsAIChatOpen": 0,
"NEW_Ticks_0xD8": 639262961983238240,
"NEW_byte_0xE0": 2,
"NEW_bool_0xE1": 0,
"GameServerAddr": server_ip,
"SessionKeyHandshakeHex": ""
},
"TokenPart2": second_part
}
return build(fields)1 659
def modify_join_post_body(body: bytes):
decoded = decode(body, 'JoinMatchPost_Req')
decoded['ReqInfo']['SessionKeyHandshakeHex'] = ''
return build(decoded, 'JoinMatchPost_Req')
1 659
in cmd 448 :
to fix the packets that does not get decrypted , remove SessionKeyHandshakeHex
