Spaces:
Sleeping
Sleeping
import os | |
import joblib | |
import pefile | |
import numpy as np | |
import pandas as pd | |
import gradio as gr | |
import hashlib | |
import traceback | |
from sklearn.ensemble import RandomForestClassifier | |
from sklearn.model_selection import train_test_split | |
from sklearn.metrics import accuracy_score, recall_score | |
# Chemin vers le modèle sauvegardé | |
MODEL_PATH = 'random_forest_model.pkl' | |
def train_and_save_model(): | |
"""Entraîner et sauvegarder le modèle si nécessaire.""" | |
print("Aucun modèle trouvé. Entraînement en cours...") | |
# Chargement des données | |
data = pd.read_csv("DatasetmalwareExtrait.csv") | |
# Traitement des données | |
X = data.drop(['legitimate'], axis=1) | |
y = data['legitimate'] | |
# Entraînement du modèle | |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) | |
model = RandomForestClassifier( | |
n_estimators=196, | |
random_state=42, | |
criterion="gini", | |
max_depth=25, | |
min_samples_split=4, | |
min_samples_leaf=1 | |
) | |
model.fit(X_train, y_train) | |
# Évaluation du modèle | |
y_pred = model.predict(X_test) | |
accuracy = accuracy_score(y_test, y_pred) | |
recall = recall_score(y_test, y_pred, average='weighted') | |
print(f"Précision du modèle supervisé : {accuracy:.3f}") | |
print(f"Rappel du modèle supervisé : {recall:.3f}") | |
# Sauvegarde du modèle | |
joblib.dump(model, MODEL_PATH) | |
print(f"Modèle sauvegardé sous : {MODEL_PATH}") | |
return model | |
# Chargement ou entraînement du modèle | |
if os.path.exists(MODEL_PATH): | |
print("Chargement du modèle existant...") | |
model = joblib.load(MODEL_PATH) | |
else: | |
model = train_and_save_model() | |
# Fonctions utilitaires | |
def calculate_file_hash(file_path): | |
"""Calculer le hash SHA-256 du fichier.""" | |
sha256_hash = hashlib.sha256() | |
with open(file_path, "rb") as f: | |
for byte_block in iter(lambda: f.read(4096), b""): | |
sha256_hash.update(byte_block) | |
return sha256_hash.hexdigest() | |
def extract_pe_attributes(file_path): | |
"""Extraction avancée des attributs du fichier PE.""" | |
try: | |
pe = pefile.PE(file_path) | |
attributes = { | |
'AddressOfEntryPoint': pe.OPTIONAL_HEADER.AddressOfEntryPoint, | |
'MajorLinkerVersion': pe.OPTIONAL_HEADER.MajorLinkerVersion, | |
'MajorImageVersion': pe.OPTIONAL_HEADER.MajorImageVersion, | |
'MajorOperatingSystemVersion': pe.OPTIONAL_HEADER.MajorOperatingSystemVersion, | |
'DllCharacteristics': pe.OPTIONAL_HEADER.DllCharacteristics, | |
'SizeOfStackReserve': pe.OPTIONAL_HEADER.SizeOfStackReserve, | |
'NumberOfSections': pe.FILE_HEADER.NumberOfSections, | |
'ResourceSize': pe.OPTIONAL_HEADER.DATA_DIRECTORY[2].Size | |
} | |
return attributes | |
except Exception as e: | |
print(f"Erreur de traitement du fichier {file_path}: {str(e)}") | |
return {"Erreur": str(e)} | |
def predict_malware(file): | |
"""Prédiction de malware avec gestion d'erreurs.""" | |
if model is None: | |
return "Erreur : Modèle non chargé" | |
try: | |
# Extraire les attributs du fichier | |
attributes = extract_pe_attributes(file.name) | |
if "Erreur" in attributes: | |
return attributes["Erreur"] | |
# Convertir en DataFrame | |
df = pd.DataFrame([attributes]) | |
# Prédiction | |
prediction = model.predict(df) | |
proba = model.predict_proba(df)[0] | |
# Résultat avec probabilité | |
if prediction[0] == 1: | |
return f"🚨 MALWARE (Probabilité: {proba[1] * 100:.2f}%)" | |
else: | |
return f"✅ Fichier Légitime (Probabilité: {proba[0] * 100:.2f}%)" | |
except Exception as e: | |
return f"Erreur d'analyse : {str(e)}" | |
# Interface Gradio | |
demo = gr.Interface( | |
fn=predict_malware, | |
inputs=gr.File(file_types=['.exe', '.dll', '.sys'], label="Télécharger un fichier exécutable"), | |
outputs="text", | |
title="🛡️ Détecteur de Malwares", | |
theme='huggingface' # Thème moderne | |
) | |
if __name__ == "__main__": | |
demo.launch(share=True) | |