IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

aide sur un prototype antivirus


Sujet :

C++Builder

  1. #41
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    je suis vraiment bloqué aide moi sat83 stp !c'est tout ce qui reste comme probléme pour enfin finaliser mon ptit projet !

  2. #42
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Ben tu as plusieurs solution :

    - Soit tu utilise la fonction ScanDirectory uniquement pour générer une liste de fichier, et ensuite tu travaille sur cette liste de fichier

    - Soit tu utilise directement la fonction ScanDirectory.

    L'avantage de la première méthode c'est que c'est plus simple, le désavantage c'est que tu va parcourir 2 fois la liste de fichier.

    As-tu deja fais ta fonction qui calcul le MD5 d'un fichier? Montre voir a quoi elle ressemble pour pouvoir l'integrer dans la suite
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  3. #43
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    je t'ecplique d'une autre maniére:

    souviens toi tu m'a donné les fichiers (md5 et md5wrapper) puis tu ma donné le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      md5wrapper *hashMd5 = new md5wrapper() ;
      std::string result = hashMd5->getHashFromFile( "C:\\monrep\\monfichier1.exe" ) ;
      ShowMessage( (AnsiString) result.c_str()  );
      delete hashMd5;
    ce code que tu m'a donné permet de calculer le hash d'un seul fichier seulemnt (dans mon example c'est monfichier1.exe)
    la fonction scanDirectory permet de lister les fichiers .exe de "monrep" c'est a dire que tous les fichiers présents dans "monrep" vont étre affichés.

    au lieu de calculer le hash de 1 seul fichier , je veu calculer tous les fichiers de "monrep" (monfichier1.exe, monfichier2.exe ...)

    je bloque dans la mondification du source !!

  4. #44
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par sat83 Voir le message
    As-tu deja fais ta fonction qui calcul le MD5 d'un fichier? Montre voir a quoi elle ressemble pour pouvoir l'integrer dans la suite
    tu la trouvera dans le mini projet que je t'avé envoyé

  5. #45
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    De mon coté j'ai réaliser un programme qui réalise a peut pret tout ce que tu veux faire, donc je prend les fonctions que j'ai faite chez moi :

    Pour la fonction que je te demande depuis 20 messages on va dire que c'est celle-là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AnsiString MD5HashFile( AnsiString aFileName )
    {
      if ( !FileExists(aFileName) )
        return("") ;
      md5wrapper *hashMd5 = new md5wrapper() ;
      std::string result = hashMd5->getHashFromFile( aFileName.c_str() ) ;
      delete hashMd5;
      return( (AnsiString) result.c_str() ); 
    }
    Donc nulle part ailleurs tu aura besoin d'utiliser md5wrapper dans ton application (d'où l'intérêt de faire des fonctions!)

    Ensuite tu ne m'a toujours pas dis ce que tu souhaitais faire des hash, ni comment tu souhaitais les réaliser, ni dans quoi tu voulais les stocker.

    Donc pour faire très simple on va dire que tu stocke les chemins des fichiers et les MD5 correspondant dans deux TStringList.

    Declare 2 TStringList dans la section private de ton *.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:	// Déclarations utilisateur
         TStringList *exeList, *md5List ;
    Tu instancie (new) les deux TStringList dans le OnCreate de ta Form principale, et tu les detruit (delete) dans le OnDestroy de ta Form.

    Ensuite tu creer une methode du nom que tu veux dans ta classe (ici j'ajoute juste les infos dans la liste, mais tu peux très bien faite autre chose a la place) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AnsiString AddInList( AnsiString aFileName, AnsiString aMD5 )
    {
       exeList->Add( aFileName ) ;
       md5List->Add( aMD5 ) ;
    }
    Et dans ScanDirectory comme je te l'avais expliqué tu as une seule ligne a changé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    void __fastcall ScanDirectory(AnsiString pmRep)
    {
       TSearchRec SearchRec;
       int Attributes = 0;
    
       AnsiString bcRep = "",
                  bcRepTemp = "",
                  bcFile = "",
                  bcExt = "";
    
       Attributes |= faAnyFile;
       bcRep = pmRep;
    
    
       if(bcRep[bcRep.Length()] != '\\')
       {
          bcRep+= "\\";  // ajout du slash final si il n'y est pas
       }
       bcRepTemp = bcRep;
       bcRep+= "*.*";
    
       if(FindFirst(bcRep, Attributes, SearchRec) == 0) // on recherche TOUS les fichiers/dossiers
       {
          do
          {
             bcFile = SearchRec.Name; // on recupere le nom du fichier/dossier trouver
             if(bcFile != "." && bcFile != "..") //on filtre les repertoires '.' et '..'
             {
                bcFile = bcRepTemp + SearchRec.Name;
                bcExt  = ExtractFileExt( bcFile ) ; // on recupere l'exstension du fichier
                if(SearchRec.Attr != faDirectory)
                {
                   if (LowerCase(bcExt) == ".exe") // on test si c'est un executable
                   {
                       AddInList( bcFile, MD5HashFile( bcFile ) ) ;
                   }
                }
                else
                {
                   ScanDirectory(bcFile); // si c'est un repertoire, on "scan" ce repertoire
                }
             }
          }
          while (FindNext(SearchRec) == 0);  // jusqu'a ce qu'il n'y ai plus de fichiers
          FindClose(SearchRec); // on ferme le TSearchRec
       }
    }
    Et donc dans un Button tu as juste a faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      ScanDirectory( "C:\\MonDossier\\" ) ;
    }
    Et tu aura la liste des fichiers dans la première TStringList, et la liste des MD5 correspondant dans la deuxième.

    Je t'ai fait 99% du programme, avec ça si tu ne t'en sort pas je ne pourrait plus rien faire pour toi! Le but était que tu arrive a faire tout ca par étape et par toi même (c'est pour ça que je t'ai demandé d'écrire les fonctions l'une après l'autre en essayant d'y allé doucement).
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  6. #46
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Declare 2 TStringList dans la section private de ton *.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:	// Déclarations utilisateur
         TStringList *exeList, *md5List ;
    Tu instancie (new) les deux TStringList dans le OnCreate de ta Form principale, et tu les detruit (delete) dans le OnDestroy de ta Form.
    j'ai fai comme ça mais lors de la compilation exeList, md5List ne sont pa définis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     
    AddInList = new exeList;
    AddInList = new md5List;
    }
    la mém choz pour le ondestroy, donc je pense que le probléme viens de la ???

  7. #47
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {

    AddInList = new exeList;
    AddInList = new md5List;
    }
    As tu deja manipuler des objets? Je pense que non! AddInList est une methode de classe, et exeList est un objet, autrement dit ce que tu a ecrit est un peu abberant!

    Voilà comme faire pour instancier/liberer un objet:

    1) déclaration :
    2) instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet = new TMaClasse(/*paramètres eventuels*/) ;
    3) libération :
    Ce qui donne dans le cas de TStringList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Déclaration
    TStringList *exeList ;
    //instanciation
    exeList = new TStringList() ;
    //liberation
    delete exeList ;
    A noter que la libération est très importante! Souvent lorsque qu'on débute en programmation, on oublie de libéré les objets que l'on a instancié, c'est une erreur grave! Tout objet instancié (avec new) doit etre absolument libéré (avec delete).
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  8. #48
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    merci sat83 pour toutes tes explications tu es un GRAND

  9. #49
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    si je compren bien l'instanciation se fera dan le OnCreat
    la liberation dans le Ondetroy (sans oublier qu'il faut toujours liberer) !

  10. #50
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    Un GRAND merci a toi sat83, ça marche super bien, mais ( ya toujours un mais)
    pour afficher le tout dans une listbox, un memo ou une valuelisteditor ça ne veut pas s'afficher. Et quand jutilise un Showmessage () ça s'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    void __fastcall ScanDirectory(AnsiString pmRep)
    {
       TSearchRec SearchRec;
       int Attributes = 0;
    
       AnsiString bcRep = "",
                  bcRepTemp = "",
                  bcFile = "",
                  bcExt = "";
    
       Attributes |= faAnyFile;
       bcRep = pmRep;
    
    
       if(bcRep[bcRep.Length()] != '\\')
       {
          bcRep+= "\\";  // ajout du slash final si il n'y est pas
       }
       bcRepTemp = bcRep;
       bcRep+= "*.*";
    
       if(FindFirst(bcRep, Attributes, SearchRec) == 0) // on recherche TOUS les fichiers/dossiers
       {
          do
          {
             bcFile = SearchRec.Name; // on recupere le nom du fichier/dossier trouver
             if(bcFile != "." && bcFile != "..") //on filtre les repertoires '.' et '..'
             {
                bcFile = bcRepTemp + SearchRec.Name;
                bcExt  = ExtractFileExt( bcFile ) ; // on recupere l'exstension du fichier
                if(SearchRec.Attr != faDirectory)
                {
                   if (LowerCase(bcExt) == ".exe") // on test si c'est un executable
                   {
               AddInList( bcFile, MD5HashFile( bcFile ) ) ;
    
                   ShowMessage(bcFile+" = "+MD5HashFile (bcFile )); 
    
                   }
    
                }
                else
                {
                   ScanDirectory(bcFile); // si c'est un repertoire, on "scan" ce repertoire
    
                }
             }
          }
          while (FindNext(SearchRec) == 0);  // jusqu'a ce qu'il n'y ai plus de fichiers
          FindClose(SearchRec); // on ferme le TSearchRec
       }
    }
    Que me propose tu ??
    en tout cas je continue a faire des essai, si je trouve je te previens

  11. #51
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    Jai trouvé où été le probléme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall TForm1::ScanDirectory(AnsiString pmRep)
    il fallait rajouter TForm1::


    maintenant il fo que je créer une petite base de donnée pour stocker les signatures MD5 (ça sera comme tu me l'a dis une reference pour verifier par la suite), bon je suis pas tré fort en Base de Données mais je vais me débrouiller.

    Je voulais te poser une question, je vais essayer d'étre clair :
    ** je voudrais que le checksum reference soit exécuté et enregistré une seule et unique fois lors de la toute premiére utilisation de mon application (je vais créer l'installable avec Installshield), puis les autres checksum se feront a la demande (avec un bouton) est-ce que c'est possible ??

    ** Une autre question qui me viens a l'ésprit comment faire pour défiler les fichier 'scanné' sur un label (si possible) et comment utiliser une progressbar (comme pour un vrai antivirus si tu vois ce que je veu dire) le label affiche tour a tour les fichiers scanné (soit-disons)

  12. #52
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    L'interet du programme que je t'ai fais, c'est que tous est stocké dans des List! Donc as tout moment tu peux accéder a ces listes pour éventuellement les enregistrer où tu veux...

    Si tu veux les afficher pour vérifier éventuellement dans des ListBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      ListBox1->Items->Assign( exeList ) ;
      ListBox2->Items->Assign( md5List ) ;
    Mais encore une fois n'ajoute pas de code dans ScanDirectory! A la limite des appels a des fonctions, c'est beaucoup plus propre!

    Par exmeple tu te creer une fonction :

    void AfficherFichierActif(AnsiString aFileName)
    {
    Label1->Caption = aFileName ;
    Application->ProcessMessage ;
    }

    et tu ajoute juste un appel a cette fonction dans ScanDirectory.

    Pour la progressbar c'est impossible vu que tu n'a pas une taille fixe d'élément a scanner.

    Mais si tu veux avancé commence a apprendre a manipuler les TStringList (tu trouvera des exmeple partour sur Internet) ce qui te permettra de manipuler tes listes d'exe et MD5.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  13. #53
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    Juste un petit souci dans mon application :
    lorsque je scann tout mon disque ("C:\\") mon application se plante
    y a-t-il un moyen de remedier a cela.

    2 - est-il possible de trouver des signatures virales ?? (la signature d'un seul virus et suffisante) et si j'en trouve, est-ce que c'est facile de les ajouter a mon application ?

  14. #54
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    encore une éniéme question est-possible d'arreter le scan avec un bouton ??

  15. #55
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    lorsque je scann tout mon disque ("C:\\") mon application se plante
    Ton application se plante, c'est a dire?
    Scanner un disque dur c'est long, ça peut prendre quelques minutes voir quelques dizaines de minutes, donc c'est peut etre normal... Mais tu peux ajouter un Application->ProcessMessage dans la boucle du ScanDirectory, ca permettra a ton application de ne pas être "figer" pendant l'exécution.

    Pour arreter le Scan avec un bouton "STOP" c'est facile, tu utilise une variable booléene initialisée a false, et tu l'affecte à true dans la procédure de ton bouton Stop. Ensuite tu a juste a ajouter un test dans ScanDirectory et a sortir de la fonction si cette variable est a true.

    Pour infos je ne serais pas là les prochains jours, donc essai d'avancer de ton coté en cherchant par toi même, et si tu a encore des questions ce week-end j'y repondrais...
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  16. #56
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Pour arreter le Scan avec un bouton "STOP" c'est facile, tu utilise une variable booléene initialisée a false, et tu l'affecte à true dans la procédure de ton bouton Stop. Ensuite tu a juste a ajouter un test dans ScanDirectory et a sortir de la fonction si cette variable est a true.
    j'ai pas bien saisi pour le princip, y'a-t-il un example pour illustrer ? si tu n'as pas le temps c'est pas grave, tu en a déja fait beaucoup pour moi

  17. #57
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par sossomj Voir le message
    j'ai pas bien saisi pour le princip, y'a-t-il un example pour illustrer ? si tu n'as pas le temps c'est pas grave, tu en a déja fait beaucoup pour moi
    au fait c'étai simple, j'ai réeussi pour le bouton stop, merci sat83

Discussions similaires

  1. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19
  2. Réponses: 2
    Dernier message: 27/02/2003, 01h33
  3. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54
  4. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo