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
Protection
contre le désassemblage
Les DRM : un
fléau ou un mal nécessaire ?
Les versions
pirates de Windows XP
Première
version 1.0 du 08/05/2002
Logiciels
similaires à VBLocker
Obfuscateurs
(brouilleurs de code anti-désassemblage)
- 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.
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.
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 ?
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.
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.
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...)
https://github.com/PatriceDargenton/VBLocker/blob/master/Changelog.md
- 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.
- 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("""",
"").
- 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 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).
- 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
- 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
- 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
- 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
- www.codeproject.com/showcase/enemyatgates.asp
(Product Showcase)
- www.9rays.net/Products/Spices.Net
- www.dotnetguru.org/articles/Obfuscator.html
- 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
- 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
- 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)