malware / app.py
cheikhdeme's picture
Upload app.py
399f819 verified
raw
history blame
3.28 kB
import os
import joblib
import pefile
import numpy as np
import pandas as pd
import gradio as gr
import hashlib
# Charger le modèle pré-entraîné
try:
model = joblib.load('random_forest_model.pkl')
except Exception as e:
print(f"Erreur de chargement du modèle : {e}")
model = None
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 = {
# Attributs PE standard
'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
}
"""## Ressources
data_directory_entries = pe.OPTIONAL_HEADER.DATA_DIRECTORY
# Parcourir la liste pour trouver l'entrée du répertoire des ressources
for entry in data_directory_entries:
if entry.name == "IMAGE_DIRECTORY_ENTRY_RESOURCE":
resource_size = entry.Size
attributes['ResourceSize'] = resource_size
break
else:
attributes['ResourceSize'] = 0"""
return attributes
except Exception as e:
print(f"Erreur de traitement du fichier {file_path}: {str(e)}")
return f"Erreur de traitement du fichier {file_path}: {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
# 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) # Rend l'interface accessible publiquement