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

 Delphi Discussion :

"Fichier dangereux" à la compilation.


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut "Fichier dangereux" à la compilation.
    Bonjour,

    J'ai repris un projet ancien et je m'aperçois que je ne peux plus le compiler : Mon nouveau anti-virus bloque la création de l'exe avec message : "suppression d'un fichier dangereux".
    J'ai localisé la partie du code qui pose problème : Lorsque je supprime cette fonction et neutralise ce qui lui fait appel, la compilation redevient possible.

    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
     
    function processExists(exeFileName: string): Boolean;
    var
      ContinueLoop: BOOL;
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
      Result := False;
      while Integer(ContinueLoop) <> 0 do
      begin
        if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
          UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
          UpperCase(ExeFileName))) then
        begin
          Result := True;
        end;
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
      end;
      CloseHandle(FSnapshotHandle);
    end;
    Cette fonction était utilisée pour savoir si une autre application (différente de celle-ci) est lancée ou pas.

    Existe-t-il une méthode différente pour faire la même chose ? (si oui, ce serait à essayer pour voir si l'anti-virus l'accepte)

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Toujours le problème des applications non signées.

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Si tu donnais seulement la première lettre de ton AV... un K ?

    Car moi l'autre fois, simplement en uploadant un simple fichier txt destiné à la gestion de MàJ ; hé bien après des heures de recherches j'ai trouvé que le mot "version" bloquait tout. Fallait le voir pour le croire

    Bref pour tenter de te répondre :

    1. Si tu neutralises temporairement le strict moment de compil tu pourras compiler. Pas pratique mais au moins ça dépanne.
    2. tente de changer le mot "process" de cette fonction.

    @+

  4. #4
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    Remplacer le nom "process" de la fonction ne change rien. C'est probablement dans le code de la fonction que ça coince.
    Bon, neutraliser temporairement l'anti-virus c'est faisable. Mais j'aime pas trop.
    Merci quand même à ceux qui ont répondu.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    Après recherche, c'est cette ligne là et uniquement celle là qui est en cause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Simplement pour en avoir le coeur net et savoir sur quel mot exact ça coince :

    change simplement le mot Next contre First.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    voir aussi en utilisant un repeat until si cela ne change la "forme" de la boucle et berne l'AV
    Dans un projet, ce fut l'AutoUpdate qui posait ce genre de problème et mettait l'exe compilé en Quarantaine, en changeant l'ordre des unités et en faisant un Construire et non Compiler, cela passait !
    Et cela l'AV, c'était "Kassepied" comme l'a surnommé mon collègue !

    Au passage, si tu as D7 ou plus, StrUtils.SameText en plus lisible que le Upper=Upper

    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
     
    function processExists(exeFileName: string): Boolean;
    var
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      Result := False;
     
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
     
      if Process32First(FSnapshotHandle, FProcessEntry32) then
        repeat
          if SameText(ExtractFileName(FProcessEntry32.szExeFile), UpperCase(ExeFileName)) or 
             SameText(FProcessEntry32.szExeFile, ExeFileName) then
          begin
            Result := True;
            // Exit/*(True)*/;
          end;
        until (not Process32Next(FSnapshotHandle, FProcessEntry32)) or Result;
     
      CloseHandle(FSnapshotHandle);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    @ ShaiLeTroll : L'AV ne s'est pas laissé berner.
    @Droïde Système7 : Avec Process32First ça compile. Ceci dit, je ne voit pas comment se passer de Process32Next.

  9. #9
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Moi j'utilise WTSEnumerateProcesses (dans Wtsapi32.dll), qui permet aussi d’énumérer tous les process en cours à partir d'une session TSE, et il me semble que ca fonctionne aussi sur un poste "standard"

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Mince, je voulais tenter d'utiliser un LoadLibrary/GetProcAddress et en fait c'est déjà le cas dans Winapi.TlHelp32 de Delphi XE2
    A Vérifier si tu utilises un Delphi plus ancien
    Si c'est lié via un external dans un ancien Delphi, passe en LoadLibrary/GetProcAddress
    Si c'est déjà LoadLibrary/GetProcAddress, une piste de moins !

    As tu vérifier si Thread32Next, Module32Next sont aussi bloqués par l'AV ?

    Tu n'as pas précisé :
    - Version de Delphi ( peut-être qu'utiliser une version Ansi dans une Exe Unicode ou alors l'inverse pourra être une astuce de contournement)
    - Avec ou Sans Manifest ( moins ambitieux qu'un application signée avec un certificat comme on doit le faire avec un COM+ ou vivement recommandé un ActiveX devant être lancé par Internet Explorer )
    - Version de l'OS
    - Nom de l'AntiVirus

    A part en cherchant le nom de l'exe, tu ne pourrais pas détecter via FindWindows la présence d'une fenêtre de cet autre programme ?
    C'est nettement moins bien mais c'est une piste


    utilisation Module32First issu de Traversing the Module List
    Est-ce que ça bloque aussi, cela ne touche QUE ton propre processus et pas les autres processus ! Pas de raison de bloquer !
    Si ça bloque, quel m***e ton AV !
    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
    var
      me32: MODULEENTRY32;
      hModuleSnap: THANDLE;
     
    begin
      hModuleSnap := CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, 0 );
      if hModuleSnap = INVALID_HANDLE_VALUE then
        Exit;
     
     
      me32.dwSize := sizeof( MODULEENTRY32 );
      if Module32First( hModuleSnap, &me32 ) then
      repeat
        Memo1.Lines.Add(
          Format('MODULE NAME:     %s',     [        me32.szModule] ) + #9 +
          Format('executable     = %s',     [        me32.szExePath] ) + #9 +
          Format('process ID     = 0x%.8x', [        me32.th32ProcessID] ) + #9 +
          Format('ref count (g)  = 0x%.4x', [        me32.GlblcntUsage] ) + #9 +
          Format('ref count (p)  = 0x%.4x', [        me32.ProccntUsage] ) + #9 +
          Format('base address   = 0x%.8x', [  DWORD(me32.modBaseAddr)] ) + #9 +
          Format('base size      = %d',     [        me32.modBaseSize] )
        );
      until not Module32Next( hModuleSnap, me32 ) ;
     
      CloseHandle( hModuleSnap );
     
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    Je ne m’attendais pas à des réponses aussi approfondies. Cela me donne des scrupules à mobiliser des personnes qui ont sans doute mieux à faire sur des problèmes plus utiles que le mien.
    En fait, je dois faire le ménage dans une machine rarement utilisée, avant qu’elle soit définitivement mise au rebut. Bien sûr, tout est archivé. Mais je passe en revue les applications anciennes (celles qui ont encore leur code source) en utilisant la version 4 de Delphi qui y est présent, afin de trier ce qui reste utile et profiter de l'occasion pour apporter quelques modifications mineures à certaines applications encore utiles par ailleurs.
    Le système est Windows 7. J’ai mis un AV à jour de F-Secure (d’où le problème rencontré).
    Je vais devoir interrompre ce travail car je pars en déplacement un peu long. J’espère reprendre cette question intrigante à mon retour. En particulier les pistes suggérées par ShaiLeTroll que je remercie vivement, ainsi que les autres intervenants.

  12. #12
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    A mon humble avis le plus simple serait de "cloner" (= autre nom) la fonction Process32Next() et l'AV serait content.

  13. #13
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Droïde Système7 Voir le message
    A mon humble avis le plus simple serait de "cloner" (= autre nom) la fonction Process32Next() et l'AV serait content.
    J'ai un peu de mal à comprendre comment le nom d'une fonction peut bloquer un antivirus, une fois compilée, le nom n'existe plus (sauf en debug eventuellement ?).
    Bon dans ce cas c'est une fonction de dll, donc le nom est présent dedans, mais même si il renomme la fonction dans son programme du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure P_r_o_c_e_s_s_32Next(); stdcall; external 'LaLib.dll' name 'Process32Next';
    , le nom de la fonction exportée sera toujours le même !

  14. #14
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Guillemouze

    En effet mais comment expliquer ce que JJJJJ répondait dito :

    @Droïde Système7 : Avec Process32First ça compile. Ceci dit, je ne voit pas comment se passer de Process32Next.
    Et es-tu certain qu'un moteur heuristique ne puisse "voir/lire" certains mots même passé à la moulinette de la compil ?

    Un moteur heuristique des années 2000 n'est plus exactement architecturé comme présentement.

  15. #15
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Voir ici
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  16. #16
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Salut à tous,

    j'ai été confronté à un problème similaire il y quelques temps déjà ...
    et le simple fait d'utiliser la version "WideChar" de l'API avait réglé le souci.

    Ex:
    à la place de Process32Next
    utiliser Process32NextW

    @++

  17. #17
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Droïde Système7 Voir le message
    En effet mais comment expliquer ce que JJJJJ répondait dito :
    @Droïde Système7 : Avec Process32First ça compile. Ceci dit, je ne voit pas comment se passer de Process32Next.
    Là n'est pas le problème, l'appel de Process32First passait déjà avant, effectivement en enlevant l'appel qui pose problème, il n'y a plus de problème ... mais ca nous avance a rien, on enfonce une porte ouverte la
    Citation Envoyé par Droïde Système7 Voir le message
    Et es-tu certain qu'un moteur heuristique ne puisse "voir/lire" certains mots même passé à la moulinette de la compil ?
    Un moteur heuristique des années 2000 n'est plus exactement architecturé comme présentement.
    Oui, lorsque tu compiles, le compilateur convertit tes "mots" en langage machine, et un appel de Form1.ShowModal() sera remplacé par un simple CALL $140A62E8 par exemple (pour simplifier).
    Par contre, les appels des fonctions de dll par nom (et non par index) eux se font bien grâce à la chaîne et pas par adresse (c'est un peu moins simple que ca, mais en gros c'est le fonctionnement)

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Par contre, les appels des fonctions de dll par nom (et non par index) eux se font bien grâce à la chaîne et pas par adresse (c'est un peu moins simple que ca, mais en gros c'est le fonctionnement)
    Juste pour pinailler , on récupère l’adresse mémoire d'une fonction/ procédure à l'intérieur grâce à son nom GetProcAddress (donc chaîne de caractères, la bibliothèque doit être chargée en mémoire LoadLibrary).
    Ensuite, c'est juste une adresse

  19. #19
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Suis-je le seul à penser que laisser l'antivirus scanner les répertoires dans lesquelles on compile SES propres applications est une aberration

  20. #20
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    De retour et ne disposant que de peu de temps avant une nouvelle absence, j'ai paré au plus pressé en désactivant l'anti-virus pendant la compilation, ce qui m'a permis de terminer le travail.
    Ne pouvant pas consacrer plus de temps pour approfondir, je vais marquer comme résolue cette question posée par curiosité, bien que je n'en soit pas totalement satisfait.
    Merci à tous les intervenants.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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