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# Discussion :

[C#] Comment créer une clé d'enregistrement [FAQ]


Sujet :

C#

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut [C#] Comment créer une clé d'enregistrement
    Comment faire pour protéger l'application, avec une clé d'enregistrement ?

    L'utilisateur utilise pour la première fois le logiciel et il doit entrer un clé d'utilisation.

  2. #2
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Faut le coder.

  3. #3
    Membre éclairé Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Par défaut
    Citation Envoyé par Mose
    Faut le coder.
    +1

    Pour ma part je fais référence au numéro de série du disque dur, par le biais d'une API, puis je fais ma cuisine avec un algo de codage/décodage pour avoir la clé de controle.

  4. #4
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Citation Envoyé par joefou
    Pour ma part je fais référence au numéro de série du disque dur, par le biais d'une API
    Ah ouais ? Marrant C'est quelle API ?

  5. #5
    Membre éclairé Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Par défaut
    Bon c'est en VB.NET, je la déclare comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Private Declare Function GetVolumeInformation Lib "kernel32" _
            Alias "GetVolumeInformationA" ( _
            ByVal lpRootPathName As String, _
            ByVal lpVolumeNameBuffer As String, _
            ByVal nVolumeNameSize As Integer, _
            ByRef lpVolumeSerialNumber As Integer, _
            ByRef lpMaximumComponentLength As Integer, _
            ByRef lpFileSystemFlags As Integer, _
            ByVal lpFileSystemNameBuffer As String, _
            ByVal nFileSystemNameSize As Integer) As Integer
    Et j'utilise dans la méthode suivante:

    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
     
     
        Private Function ObtenirNumeroSerieDisquePoste() As String
            Dim root As String
            Dim volume_name As String
            Dim serial_number As Integer
            Dim max_component_length As Integer
            Dim file_system_flags As Integer
            Dim file_system_name As String
            Dim pos As Integer
            Dim Retour As String
            Try
                root = "c:\"
                volume_name = Space(1024)
                file_system_name = Space(1024)
     
                If GetVolumeInformation(root, volume_name, Len(volume_name), serial_number, max_component_length, file_system_flags, file_system_name, Len(file_system_name)) = 0 Then
                    Throw New Exception("")
                Else
                    Retour = serial_number.ToString()
                End If
            Catch ex As Exception
                m_Erreur += vbCrLf & "Problème de récupération d'information du volume" & vbCrLf & ex.Message
                Retour = ""
            End Try
            Return Retour
        End Function
    Il y a surement d'autres façons de procéder, j'ai hérité ça d'un projet VB5. Peut-être qu'avec le Framework 2.0 on a ça tout de suite dans une classe qui va bien.

  6. #6
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Intéressant ! La même en C# pour les amateurs

    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
    // on importe le fonction GetVolumeInformation du moyau
    [DllImport("kernel32.dll")]
    private static extern long GetVolumeInformation(string PathName, StringBuilder VolumeNameBuffer, UInt32 VolumeNameSize, out uint VolumeSerialNumber, out uint MaximumComponentLength, out uint FileSystemFlags, StringBuilder FileSystemNameBuffer, UInt32 FileSystemNameSize);
    /// <summary>
    /// Récupère le numéro de série du volumne
    /// </summary>
    /// <param name="driveletter">la lettre d'un volume : 'c', 'd', ...</param>
    /// <returns>le numéro de série du volume donné</returns>
    public static string GetHddSerial(char driveletter)
    {
    	// le serial
    	uint serial = 0;
    	// nb max de fichiers sur ce volume
    	uint nbfilemax = 0;
    	// label du volume
    	StringBuilder volumelabel = new StringBuilder(256);
    	// volume flags. voir http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/getvolumeinformation.asp
    	uint volumeflags = 0;
    	// nom du file system
    	StringBuilder filesystemname = new StringBuilder(256);
    	// chemin du lecteur
    	string drivepath = driveletter + ":\\";
    	// on appelle l'api
    	long res = GetVolumeInformation(drivepath, volumelabel, (UInt32)volumelabel.Capacity, out serial, out nbfilemax, out volumeflags, filesystemname, (UInt32)filesystemname.Capacity);
    	// on retourne le sérial
    	return serial.ToString();
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Par défaut
    Citation Envoyé par joefou
    +1

    Pour ma part je fais référence au numéro de série du disque dur, par le biais d'une API, puis je fais ma cuisine avec un algo de codage/décodage pour avoir la clé de controle.
    Intéressant ! Et tu aurais quelques conseils sur le choix de l'algo de codage/décodage ??

    Merci

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Voila un truc intéressant à mettre dans la FAQ

  9. #9
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Au passage je rappel que le framework embarque sa propre API pour gérer les licences

    http://msdn2.microsoft.com/fr-fr/lib...er(VS.80).aspx

    A la base c'est utilisé pour les compos redistribuable mais bon

  10. #10
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par joefou
    +1

    Pour ma part je fais référence au numéro de série du disque dur, par le biais d'une API, puis je fais ma cuisine avec un algo de codage/décodage pour avoir la clé de controle.
    Oui mais si le gars veux changer son disque ensuite ? Il se passe quoi ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Par défaut
    Citation Envoyé par SaumonAgile
    Oui mais si le gars veux changer son disque ensuite ? Il se passe quoi ?
    Probablement qu'il faut regénérer une clé

    D'ailleurs la clé, ça se stocke où, dans le registre ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Par défaut
    Citation Envoyé par joefou
    +1

    Pour ma part je fais référence au numéro de série du disque dur, par le biais d'une API, puis je fais ma cuisine avec un algo de codage/décodage pour avoir la clé de controle.
    Question d'un novice en cryptographie :

    J'imagine que ta clé de controle est forcément dans ton programme donc "facilement" lisible par un petit futé qui peut alors recréer l'algorithme de création des codes d'activation ?

  13. #13
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par vladvad
    J'imagine que ta clé de controle est forcément dans ton programme donc "facilement" lisible par un petit futé qui peut alors recréer l'algorithme de création des codes d'activation ?
    Peut être qu'il faudrait que l'application en C# s'articule autour d'un module en C++ chargé de générer/vérifier les clefs ... vu qu'il est beaucoup plus difficile de décompiler du C++ ou de jouer dans l'asm que d'utiliser Reflector sur le C# ...

  14. #14
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Dans tous les cas, un programme en MSIL qui ne serait pas obfusqué et qui serait sujet à license, ça fait rire, puisqu'il suffirait, même dans le cas où le programme s'articulerait autour d'un module en C/C++ gérant la license, de modifier le code MSIL, tout bêtement, du style...

    avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(licence.isValid()){....}
    après :

  15. #15
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    a moins ( mais c'est limite comme solution ) de coder l'interface en C# et les fonctions du programme en C++ natif ... avec des passerelles en C++/CLI. Celà me semble sur car le code exécutant réelement quelque chose est protégé par le C++ natif et en même temps on peut bénéficier de l'interface en .NET.
    Cependant il serai fastidieux de faire une telle architecture

  16. #16
    Membre éclairé Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Par défaut
    Houla, j'ai du retard sur la discussion moi, désolé !

    Pour répondre à un peu toutes les questions:

    Ma clé de contrôle se trouve effectivement dans le code, donc un petit malin qui sait jouer avec le code assembleur peut retrouver ça (d'ailleurs un pote l'a fait).

    Ma clé, elle, se trouve consignée dans un fichier ini. Je recompare à chaque lancement de l'appli.

    Si on change de disque dur, forcément le numéro de série change, et là il faut redonner une nouvelle clé.

    C'est sûr c'est pas la panacée, mais comme je le disais, c'est du code qui date, tout fait à la main au burin

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Par défaut
    Ce sujet est très intéressant et mériterait vraiment un petit tuto comme suggéré précédemment ...

    Personne n'en a vu sur un autre site ?

  18. #18
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    à mon avis, un moyen un peu plus sur serait d'avoir une DLL en C++ classique non managé qui t'offre un truc du genre :

    bool isKeyValid(string keyAEncoder);

    Bon evidemment, on peut toujours "regénérer" une dll pour by passer le problème, mais rien n'empeche de vérifier dans le code de la dll sa signature ou un checksum de controle... ca en rebutera déja plus d'un

    Apres, suffit un "bon" algorithme de cryptage dans la dll


    EDIT : Autre solution envisageable ... on ne lance pas l'exe managé mais un EXe classique non managé, qui vérifie les données et ensuite, autorise l'execution du vrai exe par exemple...

    Et cet exe pourrait etre "resident" pendant toute l'application ou vérifier le checksum de l'appli managé et si l'appli managé a été modifiée, que ca plante ou un truc du genre


    Cela dit, aucune protection n'est "incassable".. surtout en managé ou il est facile d'aller modifier le code et de "recompiler" l'application

    The Monz, Toulouse

  19. #19
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Vous parliez de modifier à la main le code MSIL, mais MS n'a t il prévu des protection pour que le code ne puisse pas être lu ?
    Parce que sinon facile de pomper l'algo de son concurrent !!!!

    Pour récupérer le numéro de série d'un disque dur, je ne suis pas sur que tu sois obligé de passé par la dll Kernel32.dll, WMI peux le faire je crois, non ?

    Pour la gestion de licence, d'installation unique, il existe plein de solution, une des meilleurs restent cela :
    Ton prog génére une clé unique primaire, le client va sur un site web (ou le programme contact un serveur) et fournis la clé primaire, alors une clé secondaire est généré sur le serveur (et il peut vérifier si le soft en question a déjà été installé) et elle est renvoyé au programme qui la compare avec la clé secondaire qu'il a généré lui même.

  20. #20
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Vous parliez de modifier à la main le code MSIL, mais MS n'a t il prévu des protection pour que le code ne puisse pas être lu ?
    Parce que sinon facile de pomper l'algo de son concurrent !!!!
    Aucune méthode n'est présente nativement dans le .NET Framework pour contourner ce problème ou protéger le code : on peut seulement signer l'assembly pour ne pas que l'on puisse aisaiment changer les dlls d'une application donnée pour qu'elle fonctionne ( genre cracker l'appel à IsValid et recompiler la dll, car il faudrait le fichier utilisé pour signer l'assembly ) mais là encore on peut modifier en hexa la dll pour retirer la signature ...

    Les seuls moyens purement .NET sont ceux utilisés par les obfuscateurs qui offrent un peut plus de protection, mais en général il s'agit juste de changer le nom des fonctions et des variabes ...

Discussions similaires

  1. Réponses: 30
    Dernier message: 30/05/2009, 18h49
  2. comment créer une macro d'enregistrements
    Par zalino dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2008, 08h44
  3. comment créer une image sous forme d'eclipse(ronde)
    Par unix27 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/05/2005, 22h16
  4. [débutant] Comment créer une base ?
    Par laffreuxthomas dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 14/12/2004, 22h12
  5. Comment créer une Table dans 1 Bdd ACCESS avec Builder??
    Par makandja dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/03/2004, 20h21

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