import os
import re
import chardet
import base64
import binascii
import zlib
import gzip
import zipfile
import tarfile
from io import BytesIO
# Fonction de détection de l'encodage du fichier
def detect_encoding(file_path):
with open(file_path, 'rb') as file:
raw_data = file.read()
result = chardet.detect(raw_data)
encoding = result['encoding']
confidence = result['confidence']
print(f"Encodage détecté : {encoding} (confiance : {confidence * 100}%)")
return encoding, raw_data
# Fonction pour tester plusieurs décodages
def try_decodings(raw_data):
# Test d’encodages standards
encodings = ['utf-8', 'latin-1', 'ascii']
for encoding in encodings:
try:
decoded_content = raw_data.decode(encoding)
print(f"Décodage réussi avec {encoding}")
return decoded_content
except UnicodeDecodeError:
continue
# Test de décodage base64
try:
decoded_content = base64.b64decode(raw_data).decode('utf-8')
print("Décodage réussi avec base64")
return decoded_content
except (binascii.Error, UnicodeDecodeError):
pass
# Test de décodage hexadécimal
try:
decoded_content = bytes.fromhex(raw_data.decode('ascii')).decode('utf-8')
print("Décodage réussi avec hexadécimal")
return decoded_content
except (ValueError, UnicodeDecodeError):
pass
print("Le fichier semble être chiffré ou dans un format non supporté.")
return None
# Fonction de décompression sécurisée
def try_decompression(content):
decompressed_content = content.encode() if isinstance(content, str) else
content
try:
# Tentative de décompression zlib
decompressed_content = zlib.decompress(decompressed_content).decode('utf-
8')
print("Décompression réussie avec zlib")
except (zlib.error, UnicodeDecodeError):
decompressed_content = content # Retourne le contenu inchangé si la
décompression échoue
try:
# Tentative de décompression gzip
decompressed_content = gzip.decompress(decompressed_content.encode() if
isinstance(decompressed_content, str) else decompressed_content).decode('utf-8')
print("Décompression réussie avec gzip")
except (gzip.BadGzipFile, UnicodeDecodeError):
pass
# Test avec ZIP
try:
zip_file = BytesIO(decompressed_content.encode() if
isinstance(decompressed_content, str) else decompressed_content)
if zipfile.is_zipfile(zip_file):
with zipfile.ZipFile(zip_file, 'r') as z:
for file_name in z.namelist():
with z.open(file_name) as f:
decompressed_content = f.read().decode('utf-8')
print(f"Fichier {file_name} décompressé avec succès depuis
ZIP")
except (zipfile.BadZipFile, UnicodeDecodeError):
pass
# Test avec TAR
try:
tar_file = BytesIO(decompressed_content.encode() if
isinstance(decompressed_content, str) else decompressed_content)
if tarfile.is_tarfile(tar_file):
with tarfile.open(fileobj=tar_file, mode='r') as t:
for member in t.getmembers():
f = t.extractfile(member)
if f:
decompressed_content = f.read().decode('utf-8')
print(f"Fichier {member.name} décompressé avec succès
depuis TAR")
except (tarfile.ReadError, UnicodeDecodeError):
pass
return decompressed_content
# Fonction pour vérifier des règles dangereuses
def check_dangerous_rules(content):
# Assurer que le contenu est de type texte
if isinstance(content, bytes):
content = content.decode('utf-8', errors='ignore')
# Recherches de règles ou commandes spécifiques
patterns = [
r'forward_to\s*:\s*', # Correspondance pour les redirections
r'delete\s*:\s*true', # Correspondance pour les suppressions
r'move_to_folder\s*:\s*'
]
dangerous = False
for pattern in patterns:
if re.search(pattern, content, re.IGNORECASE):
print(f"Alerte : règle dangereuse détectée ({pattern})")
dangerous = True
if not dangerous:
print("Aucune règle dangereuse détectée.")
return dangerous
# Menu principal
def main():
content = None
while True:
print("\nOptions :")
print("1 : Importer et analyser un fichier")
print("2 : Sauvegarder le fichier décodé")
print("3 : Quitter")
choice = input("Choisissez une option (1-3) : ")
if choice == '1':
file_path = input("Entrez le chemin du fichier à importer et analyser :
")
if os.path.exists(file_path):
encoding, raw_data = detect_encoding(file_path)
decoded_content = try_decodings(raw_data)
if decoded_content:
# Décompression seulement si nécessaire
decompressed_content = try_decompression(decoded_content)
print("Contenu décompressé et décodé :")
print(decompressed_content[:500]) # Affiche les 500 premiers
caractères
check_dangerous_rules(decompressed_content)
else:
print("Erreur : le fichier est peut-être chiffré ou
compressé.")
else:
print("Erreur : Le fichier spécifié n'existe pas.")
elif choice == '2':
if content:
output_path = input("Entrez le chemin pour sauvegarder le fichier
décodé : ")
try:
with open(output_path, 'w', encoding='utf-8') as file:
file.write(content)
print(f"Fichier sauvegardé à : {output_path}")
except Exception as e:
print(f"Erreur lors de la sauvegarde du fichier : {e}")
else:
print("Aucun contenu décodé à sauvegarder. Importez d'abord un
fichier.")
elif choice == '3':
print("Programme terminé.")
break
else:
print("Option non valide. Veuillez choisir une option entre 1 et 3.")
# Exécution du programme principal
if __name__ == "__main__":
main()