Actualiser 7lna.py

This commit is contained in:
2026-03-06 10:12:00 +00:00
parent 5327c85b08
commit fcb6e0d267

61
7lna.py
View File

@@ -51,7 +51,7 @@ class RealTimeShieldHandler(FileSystemEventHandler):
class Antivirus7LnA(ctk.CTk): class Antivirus7LnA(ctk.CTk):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.title("7LnA Security Suite - V8 Enterprise Edition") self.title("7LnA Security Suite - V8.2 Enterprise Edition")
self.geometry("1250x850") self.geometry("1250x850")
self.minsize(1000, 700) self.minsize(1000, 700)
@@ -95,7 +95,7 @@ class Antivirus7LnA(ctk.CTk):
self.btn_history = self.create_nav_button("📜 Rapports", 8, "history") self.btn_history = self.create_nav_button("📜 Rapports", 8, "history")
self.btn_update = self.create_nav_button("🔄 Mise à jour", 9, "update") self.btn_update = self.create_nav_button("🔄 Mise à jour", 9, "update")
self.version_label = ctk.CTkLabel(self.sidebar, text="v8.1 - Enterprise", text_color="#6B7280", font=ctk.CTkFont(weight="bold")) self.version_label = ctk.CTkLabel(self.sidebar, text="v8.2 - Enterprise", text_color="#6B7280", font=ctk.CTkFont(weight="bold"))
self.version_label.grid(row=10, column=0, pady=20, sticky="s") self.version_label.grid(row=10, column=0, pady=20, sticky="s")
self.views = {} self.views = {}
@@ -193,7 +193,7 @@ class Antivirus7LnA(ctk.CTk):
self.btn_scan_d = ctk.CTkButton(frame, text="📁 Analyser Dossier", command=lambda: self.start_manual_scan(is_dir=True), height=45, fg_color="#4F46E5", hover_color="#4338CA") self.btn_scan_d = ctk.CTkButton(frame, text="📁 Analyser Dossier", command=lambda: self.start_manual_scan(is_dir=True), height=45, fg_color="#4F46E5", hover_color="#4338CA")
self.btn_scan_d.grid(row=1, column=1, padx=(5, 5), pady=5, sticky="ew") self.btn_scan_d.grid(row=1, column=1, padx=(5, 5), pady=5, sticky="ew")
self.btn_db_update = ctk.CTkButton(frame, text="🔄 MaJ Signatures", command=self.update_virus_db, height=45, fg_color="#059669", hover_color="#047857") self.btn_db_update = ctk.CTkButton(frame, text="🔄 MaJ Signatures", command=self.update_virus_db_prompt, height=45, fg_color="#059669", hover_color="#047857")
self.btn_db_update.grid(row=1, column=2, padx=(5, 0), pady=5, sticky="ew") self.btn_db_update.grid(row=1, column=2, padx=(5, 0), pady=5, sticky="ew")
self.btn_rootkit = ctk.CTkButton(frame, text="🕵️ Chasse aux Rootkits (rkhunter)", command=self.run_rootkit_scan, height=45, fg_color="#7C3AED", hover_color="#6D28D9") self.btn_rootkit = ctk.CTkButton(frame, text="🕵️ Chasse aux Rootkits (rkhunter)", command=self.run_rootkit_scan, height=45, fg_color="#7C3AED", hover_color="#6D28D9")
@@ -206,16 +206,17 @@ 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 = 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.scan_console.grid(row=4, column=0, columnspan=3, pady=20, sticky="nsew")
self.setup_console_tags(self.scan_console) self.setup_console_tags(self.scan_console)
self.scan_console.insert("end", f"{self.get_time_prefix()}[*] Moteur de détection V8 prêt...\n", "info") self.scan_console.insert("end", f"{self.get_time_prefix()}[*] Moteur de détection V8.2 prêt...\n", "info")
# ----- CORRECTION DU ROOTKIT (Compatible X11 & Wayland) ----- # ----- CORRECTION ROOTKIT ET MAJ SIGNATURES (Authentification) -----
def run_rootkit_scan(self): def get_sudo_password(self, callback_func, title="Sécurité Administrateur", msg="Privilèges requis pour cette action.\nEntrez votre mot de passe session :"):
"""Fonction générique pour demander le mot de passe sudo proprement"""
dialog = ctk.CTkToplevel(self) dialog = ctk.CTkToplevel(self)
dialog.title("Sécurité Administrateur") dialog.title(title)
dialog.geometry("400x230") 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="⚠️ Privilèges Requis", font=ctk.CTkFont(size=20, weight="bold"), text_color="#F59E0B").pack(pady=(20, 5))
ctk.CTkLabel(dialog, text="L'analyse anti-rootkit nécessite les droits sudo.\nEntrez votre mot de passe session :", justify="center").pack(pady=5) ctk.CTkLabel(dialog, text=msg, justify="center").pack(pady=5)
pwd_entry = ctk.CTkEntry(dialog, show="*", width=250) pwd_entry = ctk.CTkEntry(dialog, show="*", width=250)
pwd_entry.pack(pady=10) pwd_entry.pack(pady=10)
@@ -224,17 +225,19 @@ class Antivirus7LnA(ctk.CTk):
pwd = pwd_entry.get() pwd = pwd_entry.get()
dialog.destroy() dialog.destroy()
if pwd: if pwd:
threading.Thread(target=self._exec_rootkit, args=(pwd,), daemon=True).start() callback_func(pwd)
ctk.CTkButton(dialog, text="Lancer l'analyse", command=on_submit, fg_color="#DC2626", hover_color="#991B1B").pack(pady=10) ctk.CTkButton(dialog, text="Confirmer", command=on_submit, fg_color="#DC2626", hover_color="#991B1B").pack(pady=10)
dialog.bind("<Return>", on_submit) dialog.bind("<Return>", on_submit)
# Attendre que la fenêtre soit dessinée à l'écran (Universel pour Linux)
dialog.wait_visibility() dialog.wait_visibility()
dialog.attributes("-topmost", True) dialog.attributes("-topmost", True)
dialog.grab_set() dialog.grab_set()
pwd_entry.focus_set() pwd_entry.focus_set()
def run_rootkit_scan(self):
self.get_sudo_password(lambda pwd: threading.Thread(target=self._exec_rootkit, args=(pwd,), daemon=True).start())
def _exec_rootkit(self, pwd): def _exec_rootkit(self, pwd):
self.scan_console.insert("end", f"\n{self.get_time_prefix()}[*] Lancement de rkhunter (cela peut prendre du temps)...\n", "info") self.scan_console.insert("end", f"\n{self.get_time_prefix()}[*] Lancement de rkhunter (cela peut prendre du temps)...\n", "info")
self.scan_progress.start() self.scan_progress.start()
@@ -258,27 +261,45 @@ class Antivirus7LnA(ctk.CTk):
if process.returncode in [0, 1]: if process.returncode in [0, 1]:
self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Analyse Rootkit terminée.\n", "success") self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Analyse Rootkit terminée.\n", "success")
except FileNotFoundError: except FileNotFoundError:
self.scan_console.insert("end", f"{self.get_time_prefix()}[-] rkhunter n'est pas installé. (Lancez le nouveau script install.sh)\n", "warning") self.scan_console.insert("end", f"{self.get_time_prefix()}[-] rkhunter n'est pas installé.\n", "warning")
except Exception as e: except Exception as e:
self.scan_console.insert("end", f"{self.get_time_prefix()}❌ Erreur : {e}\n", "danger") self.scan_console.insert("end", f"{self.get_time_prefix()}❌ Erreur : {e}\n", "danger")
finally: finally:
self.scan_progress.stop() self.scan_progress.stop()
self.scan_console.see("end") self.scan_console.see("end")
def update_virus_db(self): def update_virus_db_prompt(self):
threading.Thread(target=self._run_freshclam, daemon=True).start() self.get_sudo_password(lambda pwd: threading.Thread(target=self._run_freshclam, args=(pwd,), daemon=True).start(), msg="La mise à jour des signatures ClamAV nécessite\nles droits sudo. Entrez votre mot de passe :")
def _run_freshclam(self): def _run_freshclam(self, pwd):
self.scan_console.insert("end", f"\n{self.get_time_prefix()}[*] Lancement de la mise à jour (freshclam)...\n", "info")
self.scan_progress.start() self.scan_progress.start()
self.btn_db_update.configure(state="disabled")
try: try:
process = subprocess.Popen(['freshclam'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) cmd = ['sudo', '-S', 'freshclam']
for line in process.stdout: 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")
process.terminate()
break
else:
self.scan_console.insert("end", line) self.scan_console.insert("end", line)
self.scan_console.see("end") self.scan_console.see("end")
process.wait() process.wait()
self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Signatures à jour.\n", "success") if process.returncode == 0:
except: pass self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Signatures virales mises à jour avec succès.\n", "success")
finally: self.scan_progress.stop() except Exception as e:
self.scan_console.insert("end", f"{self.get_time_prefix()}❌ Erreur freshclam : {e}\n", "danger")
finally:
self.scan_progress.stop()
self.btn_db_update.configure(state="normal")
self.scan_console.see("end")
def start_manual_scan(self, is_dir): def start_manual_scan(self, is_dir):
path = filedialog.askdirectory() if is_dir else filedialog.askopenfilename() path = filedialog.askdirectory() if is_dir else filedialog.askopenfilename()