Probleme avec mon code antivirus

jeanbaptiste fermous - 4 janv. 2017 à 21:05 - Dernière réponse : Duo76 1 Messages postés mercredi 4 janvier 2017Date d'inscription 4 janvier 2017 Dernière intervention
- 4 janv. 2017 à 23:31
Bonjour,
je suis entrain de coder un antivirus mais quand je lance le scan il me donne pas le bon nombre de virus il me met dans la listbox le nom mais plein de fois donc je me retrouve avec 62 ou 80 virus alors qu'il devrai m'en mettre 1 seul .
si vous avez des idée je suis preneur^^ merci
voici le code en question:

using System;
using Microsoft.VisualBasic;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Diagnostics;

namespace jb_antivirus
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}
private int virus = 0;

private void Form1_Load(object sender, EventArgs e)
{
panel1.Visible = false;
}

private void pictureBox2_Click(object sender, EventArgs e)
{
panel1.Visible = true;
}

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
panel1.Visible = false;
}

private void button2_Click(object sender, EventArgs e)
{
folderBrowserDialog1.ShowDialog();
label1.Text = folderBrowserDialog1.SelectedPath;
virus = 0;
label2.Text = "Virus : " + virus.ToString();
progressBar1.Value = 0;
listBox1.Items.Clear();

}

private void button1_Click(object sender, EventArgs e)
{
this.Close();
}

private void button5_Click(object sender, EventArgs e)
{
string[] search = Directory.GetFiles(@folderBrowserDialog1.SelectedPath, "*.*");
progressBar1.Maximum = search.Length;
foreach (string item in search)
{
try
{
StreamReader stream = new StreamReader(item);
string read = stream.ReadToEnd();
string[] viruslist = File.ReadAllLines(@"c:\users\jb\documents\visual studio 2015\Projects\jb antivirus\jb antivirus\Resources\virus.txt");


foreach (string st in viruslist)
{

if (Regex.IsMatch(read, st))

{

virus += 1;
label2.Text = "Virus : " + virus.ToString();
listBox1.Items.Add(item);
}

progressBar1.Increment(1);
}
}
catch
{
string read = item;
string[] viruslist = File.ReadAllLines(@"c:\users\jb\documents\visual studio 2015\Projects\jb antivirus\jb antivirus\Resources\virus.txt");
foreach (string st in viruslist)
{

if (Regex.IsMatch(read, st))

{

virus += 1;
label2.Text = "Virus : " + virus.ToString();
listBox1.Items.Add(item);
}

progressBar1.Increment(1);

}
}
}
}

private void button3_Click(object sender, EventArgs e)
{

}

private void button4_Click(object sender, EventArgs e)
{
if (listBox1.SelectedIndex != -1)
{
string filepath = listBox1.Items[listBox1.SelectedIndex].ToString();
if (File.Exists(filepath))
File.Delete(filepath);
listBox1.Items.RemoveAt(listBox1.SelectedIndex);
}
}

private void TeacherForm_Load(object sender, EventArgs e)
{
DirectoryInfo dinfo = new DirectoryInfo(@"data\\Teachers\\");
FileInfo[] Files = dinfo.GetFiles("*.xml");
foreach (FileInfo file in Files)
{
listBox1.Items.Add(file.FullName); //note FullName, not Name
}
}
}
}
Afficher la suite 

5 réponses

Répondre au sujet
Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - Modifié par Whismeril le 4/01/2017 à 23:01
0
Utile
Bonsoir

ça ne résoudra pas ton problème mais lire ta liste de virus à chaque itération ne sert à rien, à part perdre du temps.


                    string[] viruslist = File.ReadAllLines(@"c:\users\jb\documents\visual studio 2015\Projects\jb antivirus\jb antivirus\Resources\virus.txt");//lecture une fois pour toute
            foreach (string item in search)
            {
                try
                {
                    StreamReader stream = new StreamReader(item);
                    string read = stream.ReadToEnd();

                    foreach (string st in viruslist)
                    {

                        if (Regex.IsMatch(read, st))
                        {

                            virus += 1;
                            label2.Text = "Virus : " + virus.ToString();
                            listBox1.Items.Add(item);
                        }

                        progressBar1.Increment(1);
                    }
                }
                catch
                {
                    string read = item;
                    foreach (string st in viruslist)
                    {

                        if (Regex.IsMatch(read, st))

                        {

                            virus += 1;
                            label2.Text = "Virus : " + virus.ToString();
                            listBox1.Items.Add(item);
                        }

                        progressBar1.Increment(1);

                    }
                }
            }


Ça devrait faire pareil.

D'autre part compter les virus avec un compteur, n'est pas très utile puisque tu les mets dans la listBox, et qu'une listBox sait combien elle contient d'enregistrements dans sa collection Items.

Enfin ton try et ton catch ont quasiment le même code et dupliquer du code n'est pas une bonne pratique, en cas de maintenance, ça nécessite une double modification.
Du coup, tu considères que seule la lecture du stream peut faire planter l'application (admettons), dans ce cas seule cette lecture devrait être dans le try, l'option de "repli" dans le catch et le reste du code dans le finaly.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Commenter la réponse de Whismeril
Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 4 janv. 2017 à 23:07
0
Utile
Quand au fait que ce code trouve plus de "virus" qu'en vrai, j'avoue que ton algorithme me laisse dubitatif.

Je n'ai jamais fait d'antivirus, cependant ça me parait peu probable que cela fonctionne.

Tu lis un stream, qui peut contenir n'importe quoi, tu le castes en string, donc tu formates la série d'octet en ASCII (ou UTF quelconque) mais si t'as ouvert un exécutable ou un fichier propriétaire tu vas obtenir des hiéroglyphes.
Et sur tout ça tu fait une Regex, qui est un outil puissant pour du texte, mais pas avec des hiéroglyphes.

Alors cherches tu vraiment à faire un vrai antivirus, ou s'agit-il d'un exercice?

Dans tous les cas j'aimerais bien voir quelques lignes de ton fichier virus.txt, ne serait-ce que pour voir si ça a un lien avec les Regex.
Commenter la réponse de Whismeril
jeanbaptiste fermous - 4 janv. 2017 à 23:16
0
Utile
pas de probleme le fichier virus .txt contien des signature md5
0002d20a7423518b7f371302014076c9
1a8add5b9ec54912a6ba4b06c39b8d21
00034b48dddb5b717481935c292ad2ef
0c02d22721b03f49339e7c89b6dd2cb8
000432d85e14ea16d2ce3f23b9c11d8e
e83a8e192098ef5b19394e0d472904a3
00070feb80aeb037fdeef4fc1ccf6a4a
0d3bddb36398221f290fbdef4f04b87c
0007d7c9debd4fb9ccc2f2fa1e91a4ef
4fcb04ad5344b7948f2330eb7da9ccef
0008501ca611695123adde105429c486
2a90c5a409d5c4c203ed620e3530523a
000a6d40eee7814b8243a0d8c19f94c3
12cb5a1f3036b94e5f35ce34cc2d0863
000aae411d6697e6afb3dffaf194682d
c407aa0bf11bc14626f75aac251e5275
000be57dc7d0013ae5c1cd9cc53c58a8
4b8c91ee467230abab707fd051a2d821
0015760015829eded58ccc8727fe466f
ad20de8b5a5a7f3c692c04bd5e9a942c
0019995eeb88d252c722964e964b4f67
5a188c1d3e994d4d8ed846c170422ed9
0021044245afc23ac7c0c0c1b2d24bcd
7cad5821e3c0fa05036394217e8cde27
0025af1b1d0def1dad571d8af5ffbb15
57b8cc09e0d99e4f3b9726a82d2a8eab
0026d3a78044c36be88974313083345d
53b1c6d43ba53518ae9a1c209b68e7db
002944d64f787743506ac7a2eef81bdb
a449a5ed0d55a5b6b36ccdc165e8f82d
002aa916f832a9f814f416a426b34add
8b46bc41a1b7bda2d67cfae9c86fbaae
002b9733c6cc2f77a88a181bafcb7cef
fce91d87569d681c6a2affd26a8087cd
003119e68c208c7fc16212fa8abee41f
8c2674c3641b9370bfbf8910d6c28f2a
00341d04ca06efa58f64e73e4f29715b
851471722d5ea77c8fa578da03196c4a
00355bd683a7f410fb5754f7f60a7181
caa9d0f1875f27cb23bebd522094cc0a
0038bb289175cb4433b42f9ad2f8e7e5
f4e2f5f20e749040a00934b99472049d
003bd87db0ce10dd769c4fb1c21e8127
f973e86264278be82fd87fd69b9f0105
003c1a018f6b174cefe1e6e4fc169df3
00a582e2644cf06a0c5a9e6b81b46ad9
004015d7e2edd3dacdccd8028190bd28
Commenter la réponse de jeanbaptiste fermous
Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 4 janv. 2017 à 23:29
0
Utile
Et tu penses trouver des signature md5 dans un stream avec une Regex?

Déjà comme il ne s'agit pas de pattern de regex, un simple Contains fera la même chose.

En plus un md5 est le résultat d'un algorithme spécifique sur un tableau de byte ou un stream
http://stackoverflow.com/questions/10520048/calculate-md5-checksum-for-a-file

Ça me paraîtrait d'ailleurs plus plausible comme démarche de comparer le md5 de chaque fichier avec ta liste.
Donc de lire toute ta liste dans un string (et pas ligne par ligne dans un table)
string mesVirus = File.ReadAllTexte(adresse du fichier);


De calculer le md5 de chaque de tes fichiers à vérifier, et de contrôler la présence dans mesVirus
mesVirus.Contains(leMd5);

Commenter la réponse de Whismeril
Duo76 1 Messages postés mercredi 4 janvier 2017Date d'inscription 4 janvier 2017 Dernière intervention - 4 janv. 2017 à 23:31
0
Utile
de plus je vous met deux photo avant le scan et apres pour vous montrer le probleme
Commenter la réponse de Duo76

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.