File size: 3,275 Bytes
399f819
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

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