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.
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.
+1Envoyé par Mose
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.
Ah ouais ? MarrantEnvoyé par joefou
C'est quelle API ?
Bon c'est en VB.NET, je la déclare comme ceci:
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 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
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.
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![]()
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(); }
Intéressant ! Et tu aurais quelques conseils sur le choix de l'algo de codage/décodage ??Envoyé par joefou
Merci
Voila un truc intéressant à mettre dans la FAQ![]()
Thomas LEBRUN: MCAD.NET, MCTS (Win et Web), MCPD(Win et Web) & Microsoft MVP Client Application Development
WPF par la pratique, mon livre sur WPF ! (également disponible ici ou là)
A la découverte de .NET
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![]()
Oui mais si le gars veux changer son disque ensuite ? Il se passe quoi ?Envoyé par joefou
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
Probablement qu'il faut regénérer une cléEnvoyé par SaumonAgile
![]()
D'ailleurs la clé, ça se stocke où, dans le registre ?
Question d'un novice en cryptographie :Envoyé par joefou
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# ...Envoyé par vladvad
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 :
après :
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(licence.isValid()){....}
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(true){...}
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![]()
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![]()
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 ?![]()
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
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.
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 ...
Partager