From 0258e1b47906bc76f097449d050bcea76a7f2043 Mon Sep 17 00:00:00 2001 From: 7ka1 <7ka1@noreply.localhost> Date: Fri, 6 Mar 2026 10:31:34 +0000 Subject: [PATCH] Actualiser 7lna.py --- 7lna.py | 119 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 81 insertions(+), 38 deletions(-) diff --git a/7lna.py b/7lna.py index 8705f64..6fa4181 100644 --- a/7lna.py +++ b/7lna.py @@ -52,7 +52,7 @@ class RealTimeShieldHandler(FileSystemEventHandler): class Antivirus7LnA(ctk.CTk): def __init__(self): super().__init__() - self.title("7LnA Security Suite - V9 Cyber-Sentinel") + self.title("7LnA Security Suite - V10 Quantum Edition") self.geometry("1250x850") self.minsize(1000, 700) @@ -96,7 +96,7 @@ class Antivirus7LnA(ctk.CTk): self.btn_history = self.create_nav_button("📜 Rapports", 8, "history") self.btn_update = self.create_nav_button("🔄 Mise à jour", 9, "update") - self.version_label = ctk.CTkLabel(self.sidebar, text="v9.0 - Cyber-Sentinel", text_color="#6B7280", font=ctk.CTkFont(weight="bold")) + self.version_label = ctk.CTkLabel(self.sidebar, text="v10.0 - Quantum", text_color="#6B7280", font=ctk.CTkFont(weight="bold")) self.version_label.grid(row=10, column=0, pady=20, sticky="s") self.views = {} @@ -179,6 +179,32 @@ class Antivirus7LnA(ctk.CTk): sys_info = f"🖥️ OS : {platform.system()} {platform.release()} | 👤 Compte : {os.getlogin()}" ctk.CTkLabel(sys_frame, text=sys_info, font=ctk.CTkFont(size=16, weight="bold")).pack(padx=20, pady=10, anchor="w") + # --- FONCTION D'AUTHENTIFICATION GLOBALE --- + def get_sudo_password(self, callback_func, title="Sécurité Administrateur", msg="Privilèges requis pour cette action.\nEntrez votre mot de passe session :"): + dialog = ctk.CTkToplevel(self) + dialog.title(title) + dialog.geometry("400x230") + + ctk.CTkLabel(dialog, text="⚠️ Privilèges Requis", font=ctk.CTkFont(size=20, weight="bold"), text_color="#F59E0B").pack(pady=(20, 5)) + ctk.CTkLabel(dialog, text=msg, justify="center").pack(pady=5) + + pwd_entry = ctk.CTkEntry(dialog, show="*", width=250) + pwd_entry.pack(pady=10) + + def on_submit(event=None): + pwd = pwd_entry.get() + dialog.destroy() + if pwd: + callback_func(pwd) + + ctk.CTkButton(dialog, text="Confirmer", command=on_submit, fg_color="#DC2626", hover_color="#991B1B").pack(pady=10) + dialog.bind("", on_submit) + + dialog.wait_visibility() + dialog.attributes("-topmost", True) + dialog.grab_set() + pwd_entry.focus_set() + # --- VUE : SCANNER MANUEL --- def init_scanner_view(self): frame = ctk.CTkFrame(self, fg_color="transparent") @@ -207,33 +233,7 @@ class Antivirus7LnA(ctk.CTk): self.scan_console = ctk.CTkTextbox(frame, font=ctk.CTkFont(family="Consolas", size=13), fg_color="#111827", corner_radius=10) self.scan_console.grid(row=4, column=0, columnspan=3, pady=20, sticky="nsew") self.setup_console_tags(self.scan_console) - self.scan_console.insert("end", f"{self.get_time_prefix()}[*] Moteur de détection V9 prêt...\n", "info") - - # ----- CORRECTION ROOTKIT ET MAJ SIGNATURES (Authentification) ----- - def get_sudo_password(self, callback_func, title="Sécurité Administrateur", msg="Privilèges requis pour cette action.\nEntrez votre mot de passe session :"): - dialog = ctk.CTkToplevel(self) - dialog.title(title) - dialog.geometry("400x230") - - ctk.CTkLabel(dialog, text="⚠️ Privilèges Requis", font=ctk.CTkFont(size=20, weight="bold"), text_color="#F59E0B").pack(pady=(20, 5)) - ctk.CTkLabel(dialog, text=msg, justify="center").pack(pady=5) - - pwd_entry = ctk.CTkEntry(dialog, show="*", width=250) - pwd_entry.pack(pady=10) - - def on_submit(event=None): - pwd = pwd_entry.get() - dialog.destroy() - if pwd: - callback_func(pwd) - - ctk.CTkButton(dialog, text="Confirmer", command=on_submit, fg_color="#DC2626", hover_color="#991B1B").pack(pady=10) - dialog.bind("", on_submit) - - dialog.wait_visibility() - dialog.attributes("-topmost", True) - dialog.grab_set() - pwd_entry.focus_set() + self.scan_console.insert("end", f"{self.get_time_prefix()}[*] Moteur de détection V10 prêt...\n", "info") def run_rootkit_scan(self): self.get_sudo_password(lambda pwd: threading.Thread(target=self._exec_rootkit, args=(pwd,), daemon=True).start()) @@ -278,19 +278,16 @@ class Antivirus7LnA(ctk.CTk): try: cmd = ['sudo', '-S', 'freshclam'] process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1) - process.stdin.write(pwd + '\n') process.stdin.flush() - for line in iter(process.stdout.readline, ''): if "incorrect password" in line.lower() or "try again" in line.lower(): - self.scan_console.insert("end", f"{self.get_time_prefix()}[-] Mot de passe refusé par le système.\n", "danger") + self.scan_console.insert("end", f"{self.get_time_prefix()}[-] Mot de passe refusé.\n", "danger") process.terminate() break else: self.scan_console.insert("end", line) self.scan_console.see("end") - process.wait() if process.returncode == 0: self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Signatures virales mises à jour avec succès.\n", "success") @@ -366,17 +363,24 @@ class Antivirus7LnA(ctk.CTk): if console == self.scan_console: self.scan_progress.stop() console.see("end") - # --- VUE : AUDIT & PARE-FEU --- + # --- VUE : AUDIT & PARE-FEU (AVEC WIFI GUARD V10) --- def init_audit_view(self): frame = ctk.CTkFrame(self, fg_color="transparent") frame.grid_rowconfigure(2, weight=1) frame.grid_columnconfigure(0, weight=1) self.views["audit"] = frame + ctk.CTkLabel(frame, text="Audit Réseau & Pare-feu", font=ctk.CTkFont(size=34, weight="bold")).grid(row=0, column=0, sticky="w", pady=(0, 20)) + btn_frame = ctk.CTkFrame(frame, fg_color="transparent") btn_frame.grid(row=1, column=0, sticky="ew", pady=(0, 10)) - ctk.CTkButton(btn_frame, text="Lancer l'Audit", command=self.run_audit_thread, fg_color="#D97706", hover_color="#B45309", height=40).pack(side="left", padx=(0, 10)) - ctk.CTkButton(btn_frame, text="Vérifier UFW", command=self.check_firewall, fg_color="#4B5563", hover_color="#374151", height=40).pack(side="left") + + ctk.CTkButton(btn_frame, text="⚙️ Lancer l'Audit Processus", command=self.run_audit_thread, fg_color="#D97706", hover_color="#B45309", height=40).pack(side="left", padx=(0, 10)) + ctk.CTkButton(btn_frame, text="🛡️ Vérifier UFW", command=self.check_firewall, fg_color="#4B5563", hover_color="#374151", height=40).pack(side="left", padx=(0, 10)) + + # NOUVEAU BOUTON : WIFI GUARD + ctk.CTkButton(btn_frame, text="📡 WiFi Guard (Scanner Intrus)", command=self.run_wifi_guard_prompt, fg_color="#059669", hover_color="#047857", height=40).pack(side="left") + self.audit_console = ctk.CTkTextbox(frame, font=ctk.CTkFont(family="Consolas", size=13), fg_color="#111827", corner_radius=10) self.audit_console.grid(row=2, column=0, sticky="nsew") @@ -400,13 +404,52 @@ class Antivirus7LnA(ctk.CTk): else: self.audit_console.insert("end", f"{self.get_time_prefix()}⚠️ PARE-FEU INACTIF.\n") except: pass - # --- VUE : OUTILS AVANCÉS (V9 OSINT) --- + # ----- LOGIQUE WIFI GUARD ----- + def run_wifi_guard_prompt(self): + self.get_sudo_password(lambda pwd: threading.Thread(target=self._exec_wifi_guard, args=(pwd,), daemon=True).start(), title="WiFi Guard", msg="Le scan réseau profond nécessite les droits sudo.\nEntrez votre mot de passe session :") + + def _exec_wifi_guard(self, pwd): + self.audit_console.delete("0.0", "end") + self.audit_console.insert("end", f"{self.get_time_prefix()}[*] Démarrage du scan réseau (arp-scan). Recherche d'intrus...\n", "info") + + if not shutil.which("arp-scan"): + self.audit_console.insert("end", f"{self.get_time_prefix()}[!] L'outil arp-scan n'est pas installé.\n", "warning") + self.audit_console.insert("end", f"{self.get_time_prefix()}-> Ouvrez un terminal et tapez : sudo apt install arp-scan\n", "warning") + return + + try: + cmd = ['sudo', '-S', 'arp-scan', '--localnet'] + process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1) + + process.stdin.write(pwd + '\n') + process.stdin.flush() + + for line in iter(process.stdout.readline, ''): + if "incorrect password" in line.lower() or "try again" in line.lower(): + self.audit_console.insert("end", f"{self.get_time_prefix()}[-] Mot de passe refusé par le système.\n", "danger") + process.terminate() + break + else: + # Coloriser les adresses IP pour une meilleure lisibilité + if "192.168." in line or "10.0." in line: + self.audit_console.insert("end", line, "success") + else: + self.audit_console.insert("end", line) + self.audit_console.see("end") + + process.wait() + if process.returncode == 0: + self.audit_console.insert("end", f"\n{self.get_time_prefix()}[+] Scan réseau terminé. Vérifiez qu'aucun appareil inconnu n'est dans la liste.\n", "info") + except Exception as e: + self.audit_console.insert("end", f"{self.get_time_prefix()}❌ Erreur WiFi Guard : {e}\n", "danger") + + # --- VUE : OUTILS AVANCÉS (V10) --- def init_tools_view(self): frame = ctk.CTkScrollableFrame(self, fg_color="transparent") self.views["tools"] = frame ctk.CTkLabel(frame, text="Boîte à Outils", font=ctk.CTkFont(size=34, weight="bold")).pack(anchor="w", pady=(0, 20)) - # NOUVEAU : Vérificateur de Fuites de Données (OSINT) + # Vérificateur de Fuites de Données (OSINT) breach_card = ctk.CTkFrame(frame, fg_color="#1F2937", corner_radius=10) breach_card.pack(fill="x", pady=10, ipady=15) ctk.CTkLabel(breach_card, text="🌐 Vérificateur de Fuites (OSINT)", font=ctk.CTkFont(size=18, weight="bold"), text_color="#A855F7").pack(anchor="w", padx=20, pady=(10,0))