From fcb6e0d2677266f20dcfdc69156bbfc16d773c56 Mon Sep 17 00:00:00 2001 From: 7ka1 <7ka1@noreply.localhost> Date: Fri, 6 Mar 2026 10:12:00 +0000 Subject: [PATCH] Actualiser 7lna.py --- 7lna.py | 63 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/7lna.py b/7lna.py index 10a4733..ae102f8 100644 --- a/7lna.py +++ b/7lna.py @@ -51,7 +51,7 @@ class RealTimeShieldHandler(FileSystemEventHandler): class Antivirus7LnA(ctk.CTk): def __init__(self): super().__init__() - self.title("7LnA Security Suite - V8 Enterprise Edition") + self.title("7LnA Security Suite - V8.2 Enterprise Edition") self.geometry("1250x850") self.minsize(1000, 700) @@ -95,7 +95,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="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.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.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_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.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 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) ----- - def run_rootkit_scan(self): + # ----- 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 :"): + """Fonction gĂ©nĂ©rique pour demander le mot de passe sudo proprement""" dialog = ctk.CTkToplevel(self) - dialog.title("SĂ©curitĂ© Administrateur") + 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="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.pack(pady=10) @@ -224,17 +225,19 @@ class Antivirus7LnA(ctk.CTk): pwd = pwd_entry.get() dialog.destroy() 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("", on_submit) - # Attendre que la fenĂȘtre soit dessinĂ©e Ă  l'Ă©cran (Universel pour Linux) dialog.wait_visibility() dialog.attributes("-topmost", True) dialog.grab_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): 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() @@ -258,27 +261,45 @@ class Antivirus7LnA(ctk.CTk): if process.returncode in [0, 1]: self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Analyse Rootkit terminĂ©e.\n", "success") 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: self.scan_console.insert("end", f"{self.get_time_prefix()}❌ Erreur : {e}\n", "danger") finally: self.scan_progress.stop() self.scan_console.see("end") - def update_virus_db(self): - threading.Thread(target=self._run_freshclam, daemon=True).start() + def update_virus_db_prompt(self): + 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.btn_db_update.configure(state="disabled") try: - process = subprocess.Popen(['freshclam'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) - for line in process.stdout: - self.scan_console.insert("end", line) + 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") + process.terminate() + break + else: + self.scan_console.insert("end", line) self.scan_console.see("end") + process.wait() - self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Signatures Ă  jour.\n", "success") - except: pass - finally: self.scan_progress.stop() + if process.returncode == 0: + self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Signatures virales mises Ă  jour avec succĂšs.\n", "success") + 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): path = filedialog.askdirectory() if is_dir else filedialog.askopenfilename()