this repo has no description

feat: add the thing

dunkirk.sh 427867f5 7161b61e

verified
Changed files
+215 -76
proxy
server
+100 -74
proxy/index.ts
···
-
import mc from 'minecraft-protocol';
+
import mc from "minecraft-protocol";
const PROXY_PORT = 25565;
-
const TARGET_HOST = 'localhost';
-
const TARGET_PORT = 25566;
+
const TARGET_HOST = "one.strongcraft.org";
+
const TARGET_PORT = 25565;
+
const MINECRAFT_VERSION = "1.20.4";
-
const SPOOFED_USERNAME = 'admin';
-
const SPOOFED_UUID = '36881d51-7477-3eb6-91a1-dfc11065590d';
+
const SPOOFED_USERNAME = "BobTheBomber917";
+
const SPOOFED_UUID = "4b5db0b0-3165-3ef2-956f-2ee9f25479aa";
const server = mc.createServer({
-
'online-mode': false,
-
port: PROXY_PORT,
-
keepAlive: false,
-
version: '1.20.4'
+
"online-mode": false,
+
port: PROXY_PORT,
+
keepAlive: false,
+
version: MINECRAFT_VERSION,
});
console.log(`Minecraft proxy listening on port ${PROXY_PORT}`);
console.log(`Forwarding to ${TARGET_HOST}:${TARGET_PORT}`);
-
server.on('login', (client) => {
-
console.log('\n=== NEW CLIENT CONNECTION ===');
-
console.log(`Original Player: ${client.username}`);
-
console.log(`Original UUID: ${client.uuid}`);
-
console.log(`IP: ${client.socket.remoteAddress}`);
-
console.log(`Spoofing as: ${SPOOFED_USERNAME} (${SPOOFED_UUID})`);
-
-
const target = mc.createClient({
-
host: TARGET_HOST,
-
port: TARGET_PORT,
-
username: SPOOFED_USERNAME,
-
keepAlive: false,
-
version: '1.20.4',
-
auth: 'offline'
-
});
+
mc.ping({
+
host: TARGET_HOST,
+
port: TARGET_PORT,
+
version: MINECRAFT_VERSION,
+
})
+
.then((res) => {
+
return res as mc.NewPingResult;
+
})
+
.then((res) => {
+
console.log("description:", res.description);
+
console.log("players:", res.players);
+
console.log("version:", res.version);
+
console.log("latency:", res.latency);
+
})
+
.catch((err) => {
+
console.error("Ping failed:", err);
+
});
-
target.on('connect', () => {
-
console.log(`Connected to target server for ${client.username}`);
-
});
+
server.on("login", (client) => {
+
console.log("\n=== NEW CLIENT CONNECTION ===");
+
console.log(`Original Player: ${client.username}`);
+
console.log(`Original UUID: ${client.uuid}`);
+
console.log(`IP: ${client.socket.remoteAddress}`);
+
console.log(`Spoofing as: ${SPOOFED_USERNAME} (${SPOOFED_UUID})`);
-
target.on('error', (err) => {
-
console.error(`Target error for ${client.username}:`, err.message);
-
client.end('Connection to server failed');
-
});
+
console.log("\n=== CONNECTED USERS ===");
+
console.log("=======================\n");
-
client.on('packet', (data, meta) => {
-
if (meta.name.includes('auth') ||
-
meta.name.includes('login') ||
-
meta.name.includes('encryption') ||
-
meta.name.includes('session')) {
-
console.log('\n--- AUTH PACKET (Client -> Server) ---');
-
console.log(`Packet: ${meta.name}`);
-
console.log(`State: ${meta.state}`);
-
console.log('Data:', JSON.stringify(data, null, 2));
-
console.log('--------------------------------------');
-
}
+
const target = mc.createClient({
+
host: TARGET_HOST,
+
port: TARGET_PORT,
+
username: SPOOFED_USERNAME,
+
keepAlive: false,
+
version: MINECRAFT_VERSION,
+
auth: "offline",
+
});
-
if (target.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
-
target.write(meta.name, data);
-
}
-
});
+
target.on("connect", () => {
+
console.log(`Connected to target server for ${client.username}`);
+
});
+
+
target.on("error", (err) => {
+
console.error(`Target error for ${client.username}:`, err.message);
+
client.end("Connection to server failed");
+
});
-
target.on('packet', (data, meta) => {
-
if (meta.name.includes('auth') ||
-
meta.name.includes('login') ||
-
meta.name.includes('encryption') ||
-
meta.name.includes('session') ||
-
meta.name.includes('compress')) {
-
console.log('\n--- AUTH PACKET (Server -> Client) ---');
-
console.log(`Packet: ${meta.name}`);
-
console.log(`State: ${meta.state}`);
-
console.log('Data:', JSON.stringify(data, null, 2));
-
console.log('--------------------------------------');
-
}
+
client.on("packet", (data, meta) => {
+
if (
+
meta.name.includes("auth") ||
+
meta.name.includes("login") ||
+
meta.name.includes("encryption") ||
+
meta.name.includes("session")
+
) {
+
console.log("\n--- AUTH PACKET (Client -> Server) ---");
+
console.log(`Packet: ${meta.name}`);
+
console.log(`State: ${meta.state}`);
+
console.log("Data:", JSON.stringify(data, null, 2));
+
console.log("--------------------------------------");
+
}
+
+
if (target.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
+
target.write(meta.name, data);
+
}
+
});
+
+
target.on("packet", (data, meta) => {
+
if (
+
meta.name.includes("auth") ||
+
meta.name.includes("login") ||
+
meta.name.includes("encryption") ||
+
meta.name.includes("session") ||
+
meta.name.includes("compress")
+
) {
+
console.log("\n--- AUTH PACKET (Server -> Client) ---");
+
console.log(`Packet: ${meta.name}`);
+
console.log(`State: ${meta.state}`);
+
console.log("Data:", JSON.stringify(data, null, 2));
+
console.log("--------------------------------------");
+
}
-
if (client.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
-
client.write(meta.name, data);
-
}
-
});
+
if (client.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
+
client.write(meta.name, data);
+
}
+
});
-
client.on('end', () => {
-
console.log(`Client ${client.username} disconnected`);
-
target.end();
-
});
+
client.on("end", () => {
+
console.log(`Client ${client.username} disconnected`);
+
target.end();
+
});
-
target.on('end', () => {
-
console.log(`Target server disconnected for ${client.username}`);
-
client.end('Server connection closed');
-
});
+
target.on("end", () => {
+
console.log(`Target server disconnected for ${client.username}`);
+
client.end("Server connection closed");
+
});
});
-
server.on('error', (err) => {
-
console.error('Server error:', err);
+
server.on("error", (err) => {
+
console.error("Server error:", err);
});
-
server.on('listening', () => {
-
console.log('Server ready for connections');
+
server.on("listening", () => {
+
console.log("Server ready for connections");
});
+113
proxy/roster-client.ts
···
+
import mc from "minecraft-protocol";
+
+
type Player = {
+
uuid: string;
+
name: string;
+
properties?: Record<string, unknown>;
+
listed?: boolean;
+
latency?: number;
+
gameMode?: number;
+
};
+
+
const TARGET_HOST = "localhost";
+
const TARGET_PORT = 25566;
+
const MINECRAFT_VERSION = "1.20.4";
+
+
const roster = new Map<string, Player>();
+
+
const client = mc.createClient({
+
host: TARGET_HOST,
+
port: TARGET_PORT,
+
username: "hepticWarbler",
+
version: MINECRAFT_VERSION,
+
keepAlive: true,
+
auth: "offline",
+
});
+
+
client.on("login", () => {
+
console.log("āœ… Joined server, tracking player list…");
+
});
+
+
client.on("packet", (data, meta) => {
+
if (meta.state !== "play") return;
+
+
switch (meta.name) {
+
case "player_info": {
+
const action = data.action;
+
for (const item of data.data) {
+
const uuid = item.UUID ?? item.uuid;
+
const name = item.name ?? item.username ?? "";
+
const entry = roster.get(uuid) ?? { uuid, name };
+
+
if (action === 0) {
+
roster.set(uuid, { ...entry, name });
+
console.log(`āž• join: ${name} (${uuid})`);
+
} else if (action === 1) {
+
roster.set(uuid, { ...entry, gameMode: item.gamemode });
+
} else if (action === 2) {
+
roster.set(uuid, { ...entry, latency: item.ping });
+
} else if (action === 4) {
+
roster.delete(uuid);
+
console.log(`āž– leave: ${name} (${uuid})`);
+
}
+
}
+
break;
+
}
+
case "player_info_update": {
+
const actions: string[] = data.actions;
+
for (const v of data.values) {
+
const uuid: string = v.uuid;
+
const prev = roster.get(uuid);
+
let name = prev?.name ?? v.name ?? v.profile?.name ?? "";
+
let listed = prev?.listed;
+
+
if (actions.includes("add_player")) {
+
name = v.name ?? name;
+
listed = true;
+
roster.set(uuid, {
+
uuid,
+
name,
+
listed,
+
properties: v.properties,
+
latency: v.latency,
+
gameMode: v.gamemode,
+
});
+
console.log(`āž• join: ${name} (${uuid})`);
+
}
+
if (actions.includes("update_latency")) {
+
roster.set(uuid, { ...(prev ?? { uuid, name }), latency: v.latency });
+
}
+
if (actions.includes("update_gamemode")) {
+
roster.set(uuid, {
+
...(prev ?? { uuid, name }),
+
gameMode: v.gamemode,
+
});
+
}
+
if (actions.includes("remove_player")) {
+
roster.delete(uuid);
+
console.log(`āž– leave: ${name} (${uuid})`);
+
}
+
}
+
break;
+
}
+
}
+
});
+
+
setInterval(() => {
+
const players = Array.from(roster.values());
+
console.log("\nšŸ“‹ Current players:", players.length);
+
players.forEach((p) => {
+
console.log(
+
` - ${p.name} (${p.uuid}) | ping: ${p.latency}ms | mode: ${p.gameMode}`,
+
);
+
});
+
console.log("");
+
}, 10000);
+
+
client.on("error", (err) => {
+
console.error("āŒ client error:", err);
+
});
+
+
client.on("end", (reason) => {
+
console.log("šŸ”Œ Disconnected:", reason);
+
});
+2 -2
server/docker-compose.yml
···
-
version: '3.8'
+
version: "3.8"
services:
minecraft:
···
VERSION: "1.20.4"
ONLINE_MODE: "FALSE"
ALLOW_FLIGHT: "TRUE"
-
MOTD: "Offline Minecraft Server"
+
MOTD: "where we do haxcy things"
DIFFICULTY: "easy"
MAX_PLAYERS: 20
VIEW_DISTANCE: 10