Actualiser 7lna.py
This commit is contained in:
119
7lna.py
119
7lna.py
@@ -52,7 +52,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 - V9 Cyber-Sentinel")
|
self.title("7LnA Security Suite - V10 Quantum Edition")
|
||||||
self.geometry("1250x850")
|
self.geometry("1250x850")
|
||||||
self.minsize(1000, 700)
|
self.minsize(1000, 700)
|
||||||
|
|
||||||
@@ -96,7 +96,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="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.version_label.grid(row=10, column=0, pady=20, sticky="s")
|
||||||
|
|
||||||
self.views = {}
|
self.views = {}
|
||||||
@@ -179,6 +179,32 @@ class Antivirus7LnA(ctk.CTk):
|
|||||||
sys_info = f"🖥️ OS : {platform.system()} {platform.release()} | 👤 Compte : {os.getlogin()}"
|
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")
|
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 ---
|
# --- VUE : SCANNER MANUEL ---
|
||||||
def init_scanner_view(self):
|
def init_scanner_view(self):
|
||||||
frame = ctk.CTkFrame(self, fg_color="transparent")
|
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 = 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 V9 prêt...\n", "info")
|
self.scan_console.insert("end", f"{self.get_time_prefix()}[*] Moteur de détection V10 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()
|
|
||||||
|
|
||||||
def run_rootkit_scan(self):
|
def run_rootkit_scan(self):
|
||||||
self.get_sudo_password(lambda pwd: threading.Thread(target=self._exec_rootkit, args=(pwd,), daemon=True).start())
|
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:
|
try:
|
||||||
cmd = ['sudo', '-S', 'freshclam']
|
cmd = ['sudo', '-S', 'freshclam']
|
||||||
process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1)
|
process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1)
|
||||||
|
|
||||||
process.stdin.write(pwd + '\n')
|
process.stdin.write(pwd + '\n')
|
||||||
process.stdin.flush()
|
process.stdin.flush()
|
||||||
|
|
||||||
for line in iter(process.stdout.readline, ''):
|
for line in iter(process.stdout.readline, ''):
|
||||||
if "incorrect password" in line.lower() or "try again" in line.lower():
|
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()
|
process.terminate()
|
||||||
break
|
break
|
||||||
else:
|
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()
|
||||||
if process.returncode == 0:
|
if process.returncode == 0:
|
||||||
self.scan_console.insert("end", f"{self.get_time_prefix()}[+] Signatures virales mises à jour avec succès.\n", "success")
|
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()
|
if console == self.scan_console: self.scan_progress.stop()
|
||||||
console.see("end")
|
console.see("end")
|
||||||
|
|
||||||
# --- VUE : AUDIT & PARE-FEU ---
|
# --- VUE : AUDIT & PARE-FEU (AVEC WIFI GUARD V10) ---
|
||||||
def init_audit_view(self):
|
def init_audit_view(self):
|
||||||
frame = ctk.CTkFrame(self, fg_color="transparent")
|
frame = ctk.CTkFrame(self, fg_color="transparent")
|
||||||
frame.grid_rowconfigure(2, weight=1)
|
frame.grid_rowconfigure(2, weight=1)
|
||||||
frame.grid_columnconfigure(0, weight=1)
|
frame.grid_columnconfigure(0, weight=1)
|
||||||
self.views["audit"] = frame
|
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))
|
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 = ctk.CTkFrame(frame, fg_color="transparent")
|
||||||
btn_frame.grid(row=1, column=0, sticky="ew", pady=(0, 10))
|
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 = 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")
|
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")
|
else: self.audit_console.insert("end", f"{self.get_time_prefix()}⚠️ PARE-FEU INACTIF.\n")
|
||||||
except: pass
|
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):
|
def init_tools_view(self):
|
||||||
frame = ctk.CTkScrollableFrame(self, fg_color="transparent")
|
frame = ctk.CTkScrollableFrame(self, fg_color="transparent")
|
||||||
self.views["tools"] = frame
|
self.views["tools"] = frame
|
||||||
ctk.CTkLabel(frame, text="Boîte à Outils", font=ctk.CTkFont(size=34, weight="bold")).pack(anchor="w", pady=(0, 20))
|
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 = ctk.CTkFrame(frame, fg_color="#1F2937", corner_radius=10)
|
||||||
breach_card.pack(fill="x", pady=10, ipady=15)
|
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))
|
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))
|
||||||
|
|||||||
Reference in New Issue
Block a user