import sys
import os
import time
import threading
import requests
import socket
import subprocess
import json
import webbrowser
import random
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
from tkinter import messagebox, simpledialog
# =================================================================
# 🚀 SYSTEME AUTO-UPDATER (INVISIBLE)
# =================================================================
VERSION_ACTUELLE = "1.0.6"
# REMPLACE PAR TON LIEN RAW PASTEBIN ICI :
URL_SCRIPT_RAW = "TON_LIEN_PASTEBIN_RAW_ICI"
def check_for_updates():
try:
response = requests.get(URL_SCRIPT_RAW, timeout=5)
if response.status_code == 200:
nouveau_code = response.text
# Si la version dans le pastebin est différente de VERSION_ACTUELLE
if f'VERSION_ACTUELLE = "{VERSION_ACTUELLE}"' not in nouveau_code:
path_actuel = sys.argv[0]
with open(path_actuel, "w", encoding="utf-8") as f:
f.write(nouveau_code)
# Redémarrage automatique sur le nouveau code
os.execv(sys.executable, ['python'] + sys.argv)
except:
pass # Continue si pas d'internet ou erreur
# On lance la vérification avant tout le reste
check_for_updates()
# =================================================================
try:
import customtkinter as ctk
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", "customtkinter", "requests"])
import customtkinter as ctk
ctk.set_appearance_mode("dark")
# --- SERVEUR OAUTH2 SÉCURISÉ ---
class OAuthHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
query = parse_qs(urlparse(self.path).query)
if 'code' in query:
self.server.auth_code = query['code'][0]
self.wfile.write("<html><body style='background:#121212;color:#8A2BE2;text-align:center;padding-top:100px;font-family:sans-serif;'><h1>VÉRIFICATION EN COURS...</h1><p style='color:white;'>Retournez sur l'application MAROKINOS.</p></body></html>".encode('utf-8'))
def log_message(self, format, *args): return
class MarokinosVirusApp(ctk.CTk):
def __init__(self):
super().__init__()
# --- CONFIGURATION ---
self.client_id = "1461073791634509896"
self.client_secret = "efJeGuzIqEz5kcskyaq8v5j75xyCWlTb"
self.bot_token = "MTQ2MTA3Mzc5MTYzNDUwOTg5Ng.Gu4FYv.fod5BqseLNdVw7_Wp2n6x5Z7sEYzqkPuv7f7Mc"
self.guild_id = "1458168227396980778"
self.admin_discord_id = "1458168227396980778"
self.owner_email = "ayouzymarwan11@gmail.com"
self.owner_pass = "06150"
self.redirect_uri = "http://localhost:5000/callback"
# Chemins des fichiers
self.db_path = os.path.join(os.getenv('APPDATA'), "marokinos_accounts.json")
self.config_path = os.path.join(os.getenv('APPDATA'), "marokinos_config.json")
self.ensure_files_exist()
self.current_hwid = self.get_hwid()
self.purple_main = "#8A2BE2"
self.title(f"MAROKINOS - V{VERSION_ACTUELLE}")
self.geometry("450x650")
self.resizable(False, False)
# --- SYSTÈME DE PARTICULES (FOND UNIQUE) ---
self.canvas = ctk.CTkCanvas(self, background="#0F0F0F", highlightthickness=0)
self.canvas.place(x=0, y=0, relwidth=1, relheight=1)
self.particles = []
for _ in range(40):
self.particles.append({
"x": random.randint(0, 1000),
"y": random.randint(0, 700),
"speed": random.uniform(0.5, 2.5),
"id": self.canvas.create_oval(0, 0, 2, 2, fill="white", outline="")
})
self.animate_particles()
self.withdraw()
self.start_verification_process()
def ensure_files_exist(self):
if not os.path.exists(self.db_path):
with open(self.db_path, "w") as f: json.dump({}, f)
if not os.path.exists(self.config_path):
with open(self.config_path, "w") as f: json.dump({"remember_email": "", "remember_pass": ""}, f)
def animate_particles(self):
for p in self.particles:
p["y"] += p["speed"]
if p["y"] > 700:
p["y"] = -5
p["x"] = random.randint(0, 1000)
self.canvas.coords(p["id"], p["x"], p["y"], p["x"]+2, p["y"]+2)
self.after(30, self.animate_particles)
def get_hwid(self):
try: return subprocess.check_output('wmic csproduct get uuid', shell=True).decode().split('\n')[1].strip()
except: return socket.gethostname()
def start_verification_process(self):
input_id = simpledialog.askstring("VÉRIFICATION", "Entrez votre ID Discord :")
if not input_id: self.on_closing()
webbrowser.open(f"https://discord.com/api/oauth2/authorize?client_id={self.client_id}&redirect_uri=http%3A%2F%2Flocalhost%3A5000%2Fcallback&response_type=code&scope=identify")
server = HTTPServer(('localhost', 5000), OAuthHandler)
server.auth_code = None
def run_check():
server.handle_request()
code = server.auth_code
try:
data = {'client_id': self.client_id, 'client_secret': self.client_secret, 'grant_type': 'authorization_code', 'code': code, 'redirect_uri': self.redirect_uri}
r = requests.post('https://discord.com/api/v10/oauth2/token', data=data).json()
token = r.get('access_token')
user_info = requests.get('https://discord.com/api/v10/users/@me', headers={'Authorization': f'Bearer {token}'}).json()
real_id = user_info.get('id')
if real_id != input_id:
messagebox.showerror("SÉCURITÉ", "ID incorrect ou compte Discord différent !")
self.on_closing()
return
url = f"https://discord.com/api/v10/guilds/{self.guild_id}/members/{real_id}"
res = requests.get(url, headers={"Authorization": f"Bot {self.bot_token}"})
if res.status_code == 200 or real_id == self.admin_discord_id:
self.after(0, self.show_main_login)
else:
messagebox.showerror("REFUSÉ", "Vous n'avez pas le grade requis.")
self.on_closing()
except:
messagebox.showerror("ERREUR", "Échec de l'authentification.")
self.on_closing()
threading.Thread(target=run_check, daemon=True).start()
def show_main_login(self):
self.deiconify()
self.show_auth_screen()
def show_auth_screen(self):
self.clear_window_keep_bg()
with open(self.config_path, "r") as f:
cfg = json.load(f)
ctk.CTkLabel(self, text="MAROKINOS LOGIN", font=("Impact", 45), text_color=self.purple_main).pack(pady=40)
self.e_entry = ctk.CTkEntry(self, placeholder_text="Email", width=300, height=45)
self.e_entry.insert(0, cfg.get("remember_email", ""))
self.e_entry.pack(pady=10)
self.p_entry = ctk.CTkEntry(self, placeholder_text="Mot de passe", width=300, height=45, show="*")
self.p_entry.insert(0, cfg.get("remember_pass", ""))
self.p_entry.pack(pady=10)
ctk.CTkButton(self, text="SE CONNECTER", fg_color=self.purple_main, width=300, height=50, command=self.login).pack(pady=20)
ctk.CTkButton(self, text="CRÉER MON PASS", fg_color="#333", width=300, height=40, command=self.create_password).pack(pady=5)
ctk.CTkButton(self, text="BOUTIQUE", fg_color="transparent", border_width=1, border_color=self.purple_main, width=300, height=40, command=lambda: webbrowser.open("https://marokinosshop.mysellauth.com/")).pack(pady=20)
def save_credentials(self, e, p):
with open(self.config_path, "w") as f:
json.dump({"remember_email": e, "remember_pass": p}, f)
def login(self):
e, p = self.e_entry.get(), self.p_entry.get()
self.save_credentials(e, p)
if e == self.owner_email and p == self.owner_pass:
self.is_owner = True
self.start_main()
return
with open(self.db_path, "r") as f: accs = json.load(f)
if e in accs and accs[e]["password"] == p:
if accs[e]["hwid"] in ["", self.current_hwid]:
if accs[e]["hwid"] == "":
accs[e]["hwid"] = self.current_hwid
with open(self.db_path, "w") as f: json.dump(accs, f)
self.start_main()
else: messagebox.showerror("HWID", "Mauvais PC.")
else: messagebox.showerror("ERREUR", "Email ou mot de passe faux.")
def create_password(self):
e, p = self.e_entry.get(), self.p_entry.get()
with open(self.db_path, "r") as f: accs = json.load(f)
if e in accs and accs[e]["password"] == "":
accs[e]["password"], accs[e]["hwid"] = p, self.current_hwid
with open(self.db_path, "w") as f: json.dump(accs, f)
messagebox.showinfo("OK", "Compte activé.")
def start_main(self):
self.clear_window_keep_bg()
self.geometry("1000x700")
sidebar = ctk.CTkFrame(self, width=220, fg_color="#121212")
sidebar.pack(side="left", fill="y")
ctk.CTkLabel(sidebar, text="MAROKINOS", font=("Impact", 32), text_color=self.purple_main).pack(pady=40)
ctk.CTkButton(sidebar, text="FIVEM SPOOFER", fg_color=self.purple_main, command=self.show_spoof_view).pack(pady=10, padx=20, fill="x")
if self.is_owner:
ctk.CTkButton(sidebar, text="👑 DATABASE", fg_color="#4B0082", command=self.show_db_view).pack(pady=10, padx=20, fill="x")
self.container = ctk.CTkFrame(self, fg_color="transparent")
self.container.pack(side="right", expand=True, fill="both", padx=20, pady=20)
self.show_spoof_view()
def show_spoof_view(self):
for w in self.container.winfo_children(): w.destroy()
ctk.CTkLabel(self.container, text="FIVEM UNBAN SYSTEM", font=("Roboto", 24, "bold"), text_color="white").pack(pady=20)
self.btn_spoof = ctk.CTkButton(self.container, text="LANCER LE SPOOFING", fg_color=self.purple_main, height=60, width=400, command=self.run_spoof_thread)
self.btn_spoof.pack(pady=20)
self.log_box = ctk.CTkTextbox(self.container, width=600, height=300, fg_color="#000", text_color="#0F0")
self.log_box.pack(pady=10)
def run_spoof_thread(self):
threading.Thread(target=self.execute_spoof, daemon=True).start()
def execute_spoof(self):
self.btn_spoof.configure(state="disabled")
for s in ["Vérification...", "Nettoyage Cache...", "Changement HWID...", "SPOOF RÉUSSI !"]:
self.log_box.insert("end", f"[+] {s}\n"); self.log_box.see("end")
time.sleep(1.5)
messagebox.showinfo("OK", "Fini !")
self.btn_spoof.configure(state="normal")
def show_db_view(self):
for w in self.container.winfo_children(): w.destroy()
scroll = ctk.CTkScrollableFrame(self.container, width=650, height=500, fg_color="#111")
scroll.pack(pady=10)
with open(self.db_path, "r") as f: accs = json.load(f)
for email in accs:
row = ctk.CTkFrame(scroll, fg_color="#222")
row.pack(fill="x", pady=2)
ctk.CTkLabel(row, text=f"{email}").pack(side="left", padx=10)
ctk.CTkButton(row, text="RESET HWID", width=100, command=lambda e=email: self.db_reset(e)).pack(side="right", padx=5)
def db_reset(self, e):
with open(self.db_path, "r") as f: accs = json.load(f)
accs[e]["hwid"] = ""
with open(self.db_path, "w") as f: json.dump(accs, f, indent=4)
self.show_db_view()
def clear_window_keep_bg(self):
for w in self.winfo_children():
if w != self.canvas: w.destroy()
def on_closing(self):
self.destroy()
sys.exit()
if __name__ == "__main__":
app = MarokinosVirusApp()
app.mainloop()