cheikhdeme commited on
Commit
aab74b3
·
verified ·
1 Parent(s): a4aafcb

Upload 4 files

Browse files
Files changed (4) hide show
  1. DatasetmalwareExtrait.csv +0 -0
  2. Dockerfile +19 -0
  3. app.py +134 -0
  4. requirements.txt +6 -0
DatasetmalwareExtrait.csv ADDED
The diff for this file is too large to render. See raw diff
 
Dockerfile ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Utiliser une image officielle Python comme base
2
+ FROM python:3.9-slim
3
+
4
+ # Définir le répertoire de travail dans le conteneur
5
+ WORKDIR /app
6
+
7
+ # Copier les fichiers nécessaires dans le conteneur
8
+ COPY . /app
9
+
10
+ # Installer les dépendances
11
+ RUN pip install --upgrade pip \
12
+ && pip install -r requirements.txt
13
+
14
+ # Exposer le port par défaut de Streamlit
15
+ EXPOSE 8501
16
+
17
+ # Définir la commande pour lancer l'application Streamlit
18
+ CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
19
+
app.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import joblib
3
+ import pefile
4
+ import numpy as np
5
+ import pandas as pd
6
+ import streamlit as st
7
+ import hashlib
8
+ import traceback
9
+ from sklearn.ensemble import RandomForestClassifier
10
+ from sklearn.model_selection import train_test_split
11
+ from sklearn.metrics import accuracy_score, recall_score
12
+
13
+ # Chemin vers le modèle sauvegardé
14
+ MODEL_PATH = 'random_forest_model.pkl'
15
+
16
+ # Fonction pour entraîner et sauvegarder le modèle
17
+ def train_and_save_model():
18
+ """Entraîner et sauvegarder le modèle si nécessaire."""
19
+ st.write("Aucun modèle trouvé. Entraînement en cours...")
20
+ # Chargement des données
21
+ data = pd.read_csv("DatasetmalwareExtrait.csv")
22
+
23
+ # Traitement des données
24
+ X = data.drop(['legitimate'], axis=1)
25
+ y = data['legitimate']
26
+
27
+ # Entraînement du modèle
28
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
29
+ model = RandomForestClassifier(
30
+ n_estimators=196,
31
+ random_state=42,
32
+ criterion="gini",
33
+ max_depth=25,
34
+ min_samples_split=4,
35
+ min_samples_leaf=1
36
+ )
37
+ model.fit(X_train, y_train)
38
+
39
+ # Évaluation du modèle
40
+ y_pred = model.predict(X_test)
41
+ accuracy = accuracy_score(y_test, y_pred)
42
+ recall = recall_score(y_test, y_pred, average='weighted')
43
+
44
+ st.write(f"Précision du modèle supervisé : {accuracy:.3f}")
45
+ st.write(f"Rappel du modèle supervisé : {recall:.3f}")
46
+
47
+ # Sauvegarde du modèle
48
+ joblib.dump(model, MODEL_PATH)
49
+ st.write(f"Modèle sauvegardé sous : {MODEL_PATH}")
50
+ return model
51
+
52
+ # Chargement ou entraînement du modèle
53
+ if os.path.exists(MODEL_PATH):
54
+ st.write("Chargement du modèle existant...")
55
+ model = joblib.load(MODEL_PATH)
56
+ else:
57
+ model = train_and_save_model()
58
+
59
+ # Fonction pour calculer le hash d'un fichier
60
+ def calculate_file_hash(file_path):
61
+ """Calculer le hash SHA-256 du fichier."""
62
+ sha256_hash = hashlib.sha256()
63
+ with open(file_path, "rb") as f:
64
+ for byte_block in iter(lambda: f.read(4096), b""):
65
+ sha256_hash.update(byte_block)
66
+ return sha256_hash.hexdigest()
67
+
68
+ # Fonction pour extraire les attributs PE
69
+ def extract_pe_attributes(file_path):
70
+ """Extraction avancée des attributs du fichier PE."""
71
+ try:
72
+ pe = pefile.PE(file_path)
73
+ attributes = {
74
+ 'AddressOfEntryPoint': pe.OPTIONAL_HEADER.AddressOfEntryPoint,
75
+ 'MajorLinkerVersion': pe.OPTIONAL_HEADER.MajorLinkerVersion,
76
+ 'MajorImageVersion': pe.OPTIONAL_HEADER.MajorImageVersion,
77
+ 'MajorOperatingSystemVersion': pe.OPTIONAL_HEADER.MajorOperatingSystemVersion,
78
+ 'DllCharacteristics': pe.OPTIONAL_HEADER.DllCharacteristics,
79
+ 'SizeOfStackReserve': pe.OPTIONAL_HEADER.SizeOfStackReserve,
80
+ 'NumberOfSections': pe.FILE_HEADER.NumberOfSections,
81
+ 'ResourceSize': pe.OPTIONAL_HEADER.DATA_DIRECTORY[2].Size
82
+ }
83
+ return attributes
84
+ except Exception as e:
85
+ st.error(f"Erreur de traitement du fichier {file_path}: {str(e)}")
86
+ return {"Erreur": str(e)}
87
+
88
+ # Fonction de prédiction
89
+ def predict_malware(file):
90
+ """Prédiction de malware avec gestion d'erreurs."""
91
+ if model is None:
92
+ return "Erreur : Modèle non chargé"
93
+
94
+ try:
95
+ # Sauvegarde temporaire du fichier
96
+ temp_file = f"temp_{file.name}"
97
+ with open(temp_file, "wb") as f:
98
+ f.write(file.read())
99
+
100
+ # Extraire les attributs du fichier
101
+ attributes = extract_pe_attributes(temp_file)
102
+ if "Erreur" in attributes:
103
+ return attributes["Erreur"]
104
+
105
+ # Convertir en DataFrame
106
+ df = pd.DataFrame([attributes])
107
+
108
+ # Prédiction
109
+ prediction = model.predict(df)
110
+ proba = model.predict_proba(df)[0]
111
+
112
+ # Résultat avec probabilité
113
+ if prediction[0] == 1:
114
+ result = f"🚨 MALWARE (Probabilité: {proba[1] * 100:.2f}%)"
115
+ else:
116
+ result = f"✅ Fichier Légitime (Probabilité: {proba[0] * 100:.2f}%)"
117
+
118
+ # Suppression du fichier temporaire
119
+ os.remove(temp_file)
120
+
121
+ return result
122
+ except Exception as e:
123
+ return f"Erreur d'analyse : {str(e)}"
124
+
125
+ # Interface Streamlit
126
+ st.title("🛡️ Détecteur de Malwares")
127
+ st.write("Téléchargez un fichier exécutable pour analyser s'il est légitime ou un malware.")
128
+
129
+ uploaded_file = st.file_uploader("Télécharger un fichier exécutable (.exe, .dll, .sys)", type=["exe", "dll", "sys"])
130
+
131
+ if uploaded_file is not None:
132
+ st.write("Analyse en cours...")
133
+ result = predict_malware(uploaded_file)
134
+ st.success(result)
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ joblib==1.3.2
2
+ pefile==2023.2.7
3
+ numpy==1.24.3
4
+ pandas==2.0.3
5
+ streamlit==1.26.0
6
+ scikit-learn==1.3.1