0% ont trouvé ce document utile (0 vote)
36 vues4 pages

Rules

Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
36 vues4 pages

Rules

Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd

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()

Vous aimerez peut-être aussi