Skip to content

Instantly share code, notes, and snippets.

@figgyc
Created December 26, 2020 19:35
Show Gist options
  • Select an option

  • Save figgyc/defb4dc2f40dc8b1dd3f53cb88344d2e to your computer and use it in GitHub Desktop.

Select an option

Save figgyc/defb4dc2f40dc8b1dd3f53cb88344d2e to your computer and use it in GitHub Desktop.
BDSX - parse the Login Packet
import * as jwt from 'jsonwebtoken'; // npm i --save jsonwebtoken
class LoginPacket {
protocolVersion: number
chainData: any
clientData: ClientData
extraData: ExtraData
}
enum InputMode {
Mouse = 1,
Touch,
Gamepad,
MotionController
}
// https://github.com/Sandertv/gophertunnel/blob/master/minecraft/protocol/login/data.go#L73
// This isnt complete but you should be able to figure it out from the link above
class ClientData {
DefaultInputMode: InputMode
CurrentInputMode: InputMode
}
class ExtraData {
XUID: String
identity: String
displayName: String
titleId: String
}
function readLoginPacket(ptr: NativePointer, size: number): LoginPacket {
let loginPacket = new LoginPacket()
ptr.move(1); // the first byte is the packet id
loginPacket.protocolVersion = ptr.readInt32();
let chainRaw = Buffer.from(ptr.readBuffer(ptr.readVarUint()))
let chainLength = chainRaw.readInt32LE()
let chainString = chainRaw.toString("utf8", 4, chainLength+4)
loginPacket.chainData = JSON.parse(chainString);
for (let token of loginPacket.chainData.chain) {
let payload = jwt.decode(token)!
if (Object.keys(payload).includes("extraData")) {
loginPacket.extraData = (payload as any).extraData
}
console.log(payload)
}
let tokenString = chainRaw.toString("utf8", chainLength+8)
loginPacket.clientData = jwt.decode(tokenString)! as ClientData
console.log(loginPacket.clientData.CurrentInputMode)
return loginPacket
}
netevent.raw(PacketId.Login).on((ptr, size, networkIdentifier, packetId) => {
let packet = readLoginPacket(ptr, size);
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment