Actualiser 7lna.py
This commit is contained in:
63
7lna.py
63
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("<Return>", 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()
|
||||
|
||||
Reference in New Issue
Block a user