Actualiser 7lna.py

This commit is contained in:
2026-03-06 10:31:34 +00:00
parent e0791bb0c0
commit 0258e1b479

119
7lna.py
View File

@@ -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("<Return>", 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("<Return>", 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))