VBLocker : Protégez votre application commerciale

https://github.com/PatriceDargenton/VBLocker

Ancien dépôt : https://codes-sources.commentcamarche.net/source/3227

Documentation : VBLocker.html

Codes sources : BigSoft.vbproj.html ActivationBigSoft.vbproj.html

Par Patrice Dargenton : patrice.dargenton@free.fr

http://patrice.dargenton.free.fr/CodesSources/index.html

Version 2.05 du 14/08/2024

 

Supposons que vous soyez le responsable des ventes de la société Bigrosoft.com, vous voulez protéger votre nouveau logiciel BigSoft v1.0 contre la copie illégale :

1. Vous mettez votre logiciel BigSoft v1.0 sur le Web, il est présenté comme une version d'évaluation ;

2. Les internautes téléchargent votre logiciel et l'installent sur leur PC sous Windows ;

3. Le logiciel fonctionne mais le message d'information "Version d'évaluation" s'affiche partout, le client se décide donc à acquérir une licence pour BigSoft v1.0 : pour cela, il clique sur un bouton qui va déclancher la procédure d'activation (débridage) du logiciel : le nom du client et les options souhaitées sont demandés au client, puis la procédure crypte ces infos en les combinant avec le numéro de série (de la partition) du disque dur du client. Enfin, la procédure envoie un courriel contenant ces infos cryptées à ventes@bigrosoft.com ;

4. Le responsable (vous !) reçoit ce courriel, et si le paiement correspondant à la licence avec les options souhaitées est bien reçue également, il lance la procédure d'activation (ActivationBigSoft.exe) du coté du vendeur cette fois : celle-ci à pour but de débrider uniquement le logiciel installé sur le disque dur du client qui vient de payer. La procédure coté vendeur génère un courriel avec ce code de débridage spécifique et crypté également, et ce courriel est retourné au client ;

5. Le client réceptionne ce courriel et saisit dans le logiciel la clé fournie : le logiciel est débridé :-)

 

 

Table des matières

Documentation. 1

Remarques diverses. 1

Gestion de plusieurs licences. 2

Protection contre le désassemblage. 2

Niveau de protection adapté. 3

Les DRM : un fléau ou un mal nécessaire ?. 3

Les versions pirates de Windows XP. 4

Historique des versions. 4

Versions suivantes. 4

Version 2.04 du 02/01/2008. 4

Version 2.03 du 14/10/2007. 4

Version 2.02 du 08/09/2007. 4

Version 2.01 du 17/08/2007. 5

Première version 1.0 du 08/05/2002. 5

Liens. 5

Logiciels similaires à VBLocker 5

Lire un numéro de série. 5

Calcul d'intégrité. 5

Algorithmes de cryptage. 5

Obfuscateurs (brouilleurs de code anti-désassemblage) 6

Désassembleurs. 6

Cryptage absolu. 6

Divers. 6

 

 

Documentation

 

Remarques diverses

- Que se passe-t-il si votre client formate son disque dur tous les matins ? il faudra lui répondre que s'il veut utiliser BigSoft v1.0, il va falloir qu'il se calme un peu, car vous avez fermement l'intention de lui faire payer chaque clé d'activation (ça devrait le calmer un peu). Voir aussi la rubrique DRM, en ce qui concerne le transfert des licences ;

 

- Vous pouvez modifier le codage des informations dans la clé, et vous pouvez aussi faire votre propre la fonction de cryptage de la clé (la publication d'un algorithme de cryptage à clés asymétriques n'est pas gênant, mais pour un algo. à clé symétrique comme VBLocker, cela constitue une information exploitable pour les éventuels pirates, en tout cas jusqu'à preuve du contraire : si vous trouvez un algo. de cryptage symétrique à toute épreuve même après une publication de son code, prévenez-moi S.V.P.). La difficulté pour concevoir une fonction de cryptage est de représenter la clé cryptée sur un codage facilement lisible, mais ce problème n'est pas insurmontable (cf. code source). De toutes façons, les algorithmes de cryptage sont les exercices de programmation favoris des développeurs :-)

 

- Pour contourner le bridage sur la date, il suffit de changer la date du système, mais cela est un peu contraignant quand même, surtout en entreprise car elle est souvent synchronisée en réseau. On pourrait envisager de contrôler que chaque jour qui passe, la date ne peut qu'augmenter, elle ne peut pas reculer : si elle a reculée depuis un précédent lancement, alors c'est que l'utilisateur a essayé de prolonger une licence qui a expiré. Le problème, c'est de trouver un endroit sur le poste du client où faire un marquage : on peut écrire quelque chose dans la base de registre pour interdire le logiciel tant qu'une nouvelle licence valide n'aura pas été achetée. Si l'utilisateur fait une restauration de sa base de registre, alors il pourra probablement faire sauter cette contrainte, ce n'est pas évident en somme... On pourrait écrire un fichier anonyme dans le répertoire de Windows : s'il est présent : même sanction : le logiciel est bloqué ;

 

- Il doit y avoir le signe " au début du fichier contrat.txt pour que le contrat s'affiche correctement dans la zone de liste, aussi bien en VB6 qu'en DotNet (je ne sais pas pourquoi !) ;

 

- Il y a d'autres remarques dans le code source.

 

Gestion de plusieurs licences

Dans le cas ou je souhaite X licences de mon prog. qui est protégé par VBLocker, y a-t-il un moyen pour éviter qu'à chaque fois je doive envoyer la clé d'activation ? Par exemple un club désire acheter mon prog pour X adhérents, cela sous entend que je devrais envoyer à chaque demande des X adhérents une clé d'activation. Ne peut-on pas faire une seule clé ou un système qui déverrouille pour X licences ?

Hélas je ne voie aucune solution à ce problème via VBLocker, car le principe de base est la reconnaissance du n° de série du disque dur du poste où l'on installe le logiciel à protéger : dans ces conditions, une clé pour chaque poste semble inévitable. Sinon, il faut changer complètement de principe, par exemple programmer un service web qui compte le nombre de licence en cours d'usage pour une entreprise utilisatrice, ce qui offre plus de liberté de facturation, mais il faut par contre une liaison internet (au moins pour l'activation de chaque logiciel), et il faut héberger le service web.

 

Protection contre le désassemblage

Pour la version VB6, pensez à compiler en code natif (Edition VB Professionnelle) car le P-Code se désassemble très bien... (à partir d'un .exe en P-Code, un hacker peut récupérer votre code source, hormis les noms des variables) cela concerne votre logiciel ainsi que VBLocker, mais pas VBUnlocker ni le logiciel d'activation, qui ne sont pas distribués aux clients.

Pour la version VB .Net, le désassemblage est hélas beaucoup plus simple ! Pour luter contre cela, les obfuscateurs sont des options de compilation (logiciels complémentaires payants, à ma connaissance) qui brouillent le code de façon à compliquer le désassemblage (mais peut être alors un peu au détriment des performances). Cependant cela ne fait que compliquer la tâche, et non l'empêcher.

Aussi, vous devez savoir exactement ce que vous voulez protéger : est-ce que vous voulez empêcher les autres de récupérer votre code source lorsqu'ils utilisent vôtre logiciel ? Il n'existe qu'une seule protection absolue pour cela : hébergez un service web sur vôtre machine et sécurisez le ! Toutes les autres façon de procéder laisseront toujours la possibilité à l'utilisateur de récupérer votre code source (au moins en partie), avec cependant un niveau de difficulté variable. Ou bien est-ce que vous voulez seulement contrôler la diffusion de votre logiciel ?

 

Niveau de protection adapté

Sachez que le niveau de protection de VBLocker ne résisterait pas longtemps à un pirate confirmé, mais résistera à 95% de vos clients qui préférerons payer la licence plutôt que de perdre du temps à cracker votre logiciel (tout dépend du prix que vous fixez pour votre logiciel). Le seul vrai risque est qu'un pirate distribue une version crackée de votre logiciel... ça vous apprendra à receler également ce genre de logiciel ! mais d'ici là, vous serez déjà riche (pensez à un ptit cadeau pour moi :-) et vous trouverez alors une autre solution de protection de votre logiciel, peut être payante cette fois, par exemple un clé physique (dongle).

D'une manière générale, il faut peser le pour et le contre de chaque technique, mettre en balance les contraintes pour l'utilisateur et les bénéfices pour le vendeur, il faut adapter la technique de protection à la valeur du logiciel, il serait par exemple absurde de mettre en place un "malware" pour protéger un simple CD audio (cas du RootKit de Sony : résultat : le tollé général, et la reculade de Sony !).

Pour renforcer la sécurité vous pouvez toujours vérifier l'intégrité de votre logiciel par un checksum (une somme de contrôle, voir un exemple ici), mais rien n'empêchera un pirate confirmé de shunter (court-circuiter) aussi ce contrôle d'intégrité. Une autre solution pourrait être un service web dédié au contrôle d'accès, mais là aussi, il sera possible de dériver une version sans la vérification.

Cependant, il est possible de créer un environnement relativement fiable d'exécution d'application via la signature numérique : cet environnement peut garantir l'authenticité et l'intégrité des applications téléchargées au sein d'un cercle de confiance contractuel comprenant les auteurs de logiciel, les autorités de certification et l'environnement d'exécution. C'est un peu compliqué à mettre en oeuvre, mais sans doute moins qu'herberger soi-même l'application, ce qui peut donc constituer une étape intermédiaire pour des professionnels de la vente de logiciel. Consultez les articles suivants dans MSDN (MicroSoft Developer Network) :

- Introduction to Code Signing : http://msdn2.microsoft.com/en-us/library/ms537361.aspx

- Signing Code with Microsoft Authenticode Technology :

  http://msdn2.microsoft.com/en-us/library/ms537364.aspx

 

Remarque : La signature de code et les fonctions de hachage sont plus simples à utiliser avec VB .Net.

Voir comment ce problème est traité dans les logiciels similaires à VBLocker.

Liens sur les Obfuscateurs et Désassembleurs.

 

Les DRM : un fléau ou un mal nécessaire ?

Si les DRM n'existait pas, il serait extrêmement tentant de copier la discothèque complète d'un ami en quelques secondes... Pour vous éviter un tel dilemme, des gents bienfaisants ont inventé pour vous les DRM ! L'inconvénient, c'est que du coup les fichiers ainsi protégés contre la copie illimitée ne sont plus lisibles sur tous les lecteurs, ce qui est carrément rédhibitoire : toute ma collection de CD est "rippée" (copiée) sur mon disque dur sans DRM, ce qui m'évite d'avoir à me souvenir combien de temps tel ou tel fichier va être encore lisible et sur quel matériel. J'ai juste à me souvenir que les artistes sont des vrais gents qui ont besoins de vivre avant de faire n'importe quoi avec ces fichiers (mais cela j'arrive à le faire correctement, malgré diverses tentations). Notez que vous ne pouvez distribuer de tels fichiers qu'au sein "du cercle familiale", ce qui signifie par exemple frères et soeurs, mais pas cousin germain au 38ème degré ! On arrive à respecter ainsi le droit d'auteur, mais cependant, c'est devenu très facile de copier la disco. complète d'un artiste sur une clé usb de 1 Go..., pas très fair-play en fait. Aussi, il est intéressant de constater que les majors commencent à céder leurs albums sans DRM sur les plates formes de téléchargement légales, mais on ne peut être que dubitatif devant un tel choix : est-ce que cela ne va pas créer un problème psychologique chez tous les jeunes qui n'ont jamais entendu parlé du droit d'auteur ? il sera difficile à expliquer le concept de piratage musical, qu'ils ne doivent pas distribuer "leur" musique de manière industrielle, alors quelle est la solution ?

A mon avis, la solution réside dans Internet et le fait que tout lecteur soit connecté sur le net (au moins de façon régulière), car après tout, c'est depuis Internet que le phénomène s'avère problématique. A l'instar de licence pour certains logiciels, que l'on peut activer sur quelques machines, cela s'avère une solution idéale, en particulier pour les films, voici le principe : j'ai un logiciel AntiSpam payant que j'utilise aussi bien au bureau que chez moi (j'ai le droit à 2 installations), et j'ai eu plusieurs fois l'occasion de changer de machine depuis cet achat : à chaque réinstallation du logiciel, j'ai seulement besoin de transférer ma licence sur le dernier poste en activité (en fait les deux derniers postes en activité), c'est tout !

Ainsi, si j'achetai mes films en téléchargement, je pourrai les voir sur quelques matériels définis à l'avance, et il me suffirait de transférer la licence en fonction des besoins, comme si je déplaçais physiquement un DVD. La seule difficulté est de gérer l'accès à Internet de type occasionnel : une fois la licence transférée sur un baladeur, je dois pouvoir voir le film autant de fois que je le souhaite, alors que mon baladeur n'est plus connecté à Internet pour un moment. Et si je perds le fichier, je dois pouvoir le re-télécharger, ou bien même récupérer les mises à jour éventuelles (par ex. les traductions). Voilà, cela représente quand même un sacré boulot pour les distributeurs de contenu, car il faut gérer en ligne de gigantesque base de données des licences des utilisateurs, avec la signature de leurs matériels autorisés, ce qui n'est pas complément trivial.

 

Les versions pirates de Windows XP

Il existe des versions pirates de Windows XP, dont le principe est le suivant : un pirate a trouvé la technique pour fabriquer un logiciel capable de générer des clés d'activation de XP qui sont tout à fait valides, tout simplement parce que ce sont les mêmes clés qui sont peut être déjà commercialisées quelque part dans le monde. Les utilisateurs de ces versions pirates peuvent donc faire les mises à jour normalement, puisque leur version est en tout point semblable à des versions "authentiques" (le contrôle ActiveX utilisé par Microsoft pour vérifier l'authenticité de ces versions ne verra que du feu). De toute façon, Microsoft a pris la décision d'autoriser la mise à jour même des versions pirates "non-authentiques", considérant que cela serait contraire à ses intérêts de laisser trop de PC zombie sur la planète (PC non protégés contre les failles de sécurité, car non mis à jour).

Est-ce vraiment prudent d'utiliser ces versions pirates ? est-ce qu'il y a une faille à cette technique ? Oui, il y a une faille ! au moment de faire vos mises à jour, Microsoft peut conserver l'adresse IP de votre machine, et se rendre compte d'une anomalie : votre clé d'activation est utilisée à deux endroits en même temps dans le monde : il suffit que Microsoft téléphone à l'un des deux utilisateurs pour demander à vérifier l'hologramme imprimé avec le CD d'installation pour savoir lequel des deux est le pirate. Certes, cette vérification physique est fastidieuse, mais le fait que vous êtes un suspect, ça n'est pas fastidieux du tout, c'est automatique... (et si Microsoft est capable d'assurer le traçage des licences imprimées depuis ses entrepôts jusqu'aux client finaux...)

 

 

Historique des versions

 

Versions suivantes

https://github.com/PatriceDargenton/VBLocker/blob/master/Changelog.md

 

Version 2.04 du 02/01/2008

- Compilation avec VB6.Compatibility retiré (tableau chkOptions enlevé) ;

- Correction du bug sur le test de la date avec une fonction oubliée de VB6 :

            VB6.Format(.dDateExpiration, "dd/mm/yyyy") -> .dDateExpiration.ToString("dd/MM/yyyy")

- Correction du bug de boucle infinie (dans la version .Net seulement) lors de l'expiration de la licence.

 

Version 2.03 du 14/10/2007

- Correction du bug apparaissant dans Outlook lors de l'envoi d'un message : "L'argument de la ligne de commande n'est pas valide. Vérifiez le commutateur que vous utilisez." : les guillemets (") ne passent pas avec OutLook, il faut donc les enlever (les guillemets ne marchent qu'avec Outlook Express, à moins de trouver le bon codage ?) : fonction bEnvoyerCourriel : If sContenu.Length > 0 Then sCmd &= "&Body=" & sContenu.Replace(vbCrLf, sSautLigneMailTo).Replace("""", "").

 

Version 2.02 du 08/09/2007

- Correction d'une faille critique existant depuis le 08/05/2002 : bTesterCleActivation : le n° de licence ne peut être égal à 0, et au moins une option doit être activée : If iNumeroLicence = 0 Or iOptions = 0 Then sMsgErr = "Clé invalide" : Exit Function.

 

Version 2.01 du 17/08/2007

- Version 2.01 en DotNet 2 / VB8 (compilation en mode Strict On), et version 1.10 en VB6 ;

- Gestion d'erreur améliorée pour la saisie d'un n° de licence ;

- Envoi de courriel via mailto : fonctionne dans le cas le plus général (avec de nombreux logiciels de messagerie), mais ne gère pas les pièces jointes (sous OutLook Express) : il suffit d'inclure le contenu de la licence dans le corps du message, il y a une nouvelle fonction pour importer la licence via le presse-papier (ce qui fait moins de manip. qu'un fichier en pièce jointe) ; le précédent composant MAPI fonctionnait bien, sauf sous Windows 9.x et Me ; on ne peut pas utiliser un composant SMTP, car on ne connait pas le serveur SMTP du client (et il n'est pas envisageable de lui demander ; par ailleurs le SMTP relayé via le compte SMTP du vendeur n'est plus autorisé nul part, à cause des spams) ;

- Simplification des modules : abandon des dll, il suffit d'intégrer le code source et de compiler (il ne reste plus aucune dll ni ocx, sauf le contrôle onglet en VB6).

 

Première version 1.0 du 08/05/2002

 

 

Liens

 

Logiciels similaires à VBLocker

Using VB to create & check license keys

  www.codeproject.com/useritems/VB_KeyCode.asp

- A simple but robust software protection and activation

  www.codeproject.com/csharp/swactivation.asp

- A Code Protection Framework For .Net

  www.codeproject.com/useritems/code_protect_frmwrk.asp

- A simple software key useful to protect software components (C++)

 www.codeproject.com/cpp/softwarekey.asp

- Transformer votre application en shareware grâce à ActiveLock

  www.vbfrance.com/article.aspx?ID=6841

 

Lire un numéro de série

Determine Hard Drive Serial Numbers (WMI en VB .Net)

  http://addressof.com/blog/posts/386.aspx

- How to retrieve REAL Hard Drive Serial Number

  www.codeproject.com/csharp/hard_disk_serialNo.asp

Get Physical HDD serial number without WMI

  www.codeproject.com/useritems/DriveInfoEx.asp

- Activation Windows XP : Quelles sont les 10 caractéristiques matérielles utilisées pour déterminer la valeur de hachage du matériel ?

  http://support.microsoft.com/default.aspx?scid=kb%3Bfr%3B302878#5h

 

Calcul d'intégrité

- Vérifiez l'intégrité de vos exe (VB6) : www.vbfrance.com/code.aspx?ID=5369

- Calculer une somme de contrôle MD5 pour un exe (en VB .Net)

  www.vbfrance.com/code.aspx?ID=33422

www.csharpfr.com/codes/HASH-MD5-SHA_43035.aspx

www.codeproject.com/csharp/csRedundancyChckAlgorithm.asp

 

Algorithmes de cryptage

- Cryptage combiné RSA – AES (Rijndael) pour transmission de fichier par email

  www.csharpfr.com/code.aspx?ID=42588

Tiny Encryption Algorithm

  www.codeproject.com/useritems/XTEA_encryption_algorithm.asp

- An introduction to key cryptographic concepts supported by the .NET Framework

  www.codeproject.com/useritems/Crypto.asp

 

Obfuscateurs (brouilleurs de code anti-désassemblage)

www.codeproject.com/showcase/enemyatgates.asp (Product Showcase)

www.9rays.net/Products/Spices.Net

www.dotnetguru.org/articles/Obfuscator.html

 

Désassembleurs

- Désassembleur DotNet : www.aisto.com/roeder/dotnet

  www.aisto.com/roeder/dotnet/Download.aspx?File=Reflector

- Debugger+Disassembler! (VB5 et VB6)

  www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=42422&lngWId=1

- Analyseur d'exécutables VB6 (Beta Release)

  www.vbfrance.com/code.aspx?ID=8258

- Désassembleur de fichier PE, LE (VXD), Coff, Lib et MZ

  www.vbfrance.com/code.aspx?ID=38977

Dessassembleur et patcher :

  NetDasm - A tool for disassemble and patch .Net assemblies

  Disassemble and patch using Mono.Cecil library

  www.codeproject.com/useritems/NetDasm.asp

 

Cryptage absolu

http://fr.wikipedia.org/wiki/Masque_jetable

- Cryptographie fractale (voir les commentaires)

  www.cppfrance.com/code.aspx?ID=17898

- Générer des bis aléatoires via la carte son

  www.cppfrance.com/code.aspx?ID=43126

 

Divers

- Crypter du texte dans... du texte !!! :

  www.codeproject.com/vb/net/Text_2Text_Steganography2.asp

 

 

Par Patrice Dargenton (je ne suis pas parti de zéro pour cette contribution VBLocker)