TUTORIEL SUR LA PROTECTION DES PROGRAMME VIA UN COMPOSANT
NOM AUTEUR-CONCEPTEUR : BIDI Guy Email : paounet@free.fr
La protection des logiciels bien connue chez Microsoft et autres consorts peut s'effectuer par le biais d'écriture de codes dans un fichier,
dans la base de Registre (BDR) ou dans les deux. Loin d'être exhaustives ces méthodes font place désormais à la protection par
serveur interposé (Windows Vista).
Ce tutoriel via le programme Protection.exe (Demo) avec ces codes sources et son composant TGetPassword pour la saisie et TPassword
pour la génération des mots de passe et Codes vous explique comment passer d'une version Démo à une version Complète ou Débridée.
Ce programme Demo (Protection), tout simple et sans prétention vous présente les deux manières de protection par un fichier nommé
Licence.dat et/ou par la Base de Registre (BDR) sous la clef HKEY_LOCAL_MACHINE.
Présentation du programme Principal Demo :
Les Onglets Protection vous explique les protections par Fichier et par BDR. Code quant à lui vous donne un algorithme de compréhension
pour les 2 types de protection. A Propos vous donne accès à l'enregistrement de vos codes dans le fichier Licence.dat ou dans la BDR au choix
- voir le code ci-après -
Le programme fait appel à 4 feuilles dont 3 modales.
FormDemo Ø La feuille principale.
FormSaisie Ø Feuille modale qui permet de saisir les codes d'enregistrement via le composant TgetPassword.
FormF et FormR Ø Feuilles modales qui affich e l'algorithme de la protection par fichier etpar BDR.
Cette image représente la feuille modale FormSaisie qui permet de saisir les différents codes (Login, MDP et Codes) qui, s'ils sont
validés par le composant TgetPassword, seront cryptés dans le fichier Licence.dat ou écrits dans la BDR sous la clef
HKEY_LOCAL_MACHINE.
(Selon votre choix vous choisirez la protection par le fichier et/ou la Base de registre).
En plus de ce programme Demo et de son composant TgetPassword (package TgetPassword.bpl), le composant TPassword qui est le programme générateur de codes vous est fourni (package TPassword.bpl).
Vous aurez ainsi à loisir de tester plusieurs combinaisons de codes.
Générateur : est un nombre aléatoire
Tests des codes selon les 2 méthodes :
| procedure TFormDemo.FormCreate(Sender:TObject); Const Fichier='Licence.dat'; Var F:TextFile;Code:String;Res:Array[0..2] Of String;i,j:Integer; begin Flag:=False;For i:=0 to 2 Do Res[i]:=''; //------------------------------------------ // Récupération des Codes par la protection Fichier {If FileExists(Fichier)=False Then Exit Else Begin AssignFile(F,Fichier);Reset(F);Read(F,Code);CloseFile(F); Code:=Crypte(Code);End;i:=0;For j:=1 to Length(Code) Do If Code[j]<>#13 then Res[i]:=Res[i]+Code[j] Else Inc(i); //------------------------------------------ // Récupération des Codes par la Base de Registre With TRegistry.Create Do Begin RootKey:=2147483650; // Valeur pour HKEY_LOCAL_MACHINE If OPenKey('SOFTWARE\GB Softs',False) Then Begin Res[0]:=ReadString('Mot De Passe');Res[1]:=ReadString('Login'); Res[2]:=ReadString('Code');CloseKey;End;End; //----------------------------------------- If FormSaisie.Test(Res[0],Res[1],Res[2]) Then Begin Flag:=True; Enregistre.visible:=False;Enregistrement.Visible:=False; Version.Caption:='Version Complète'; Codes.Enabled:=True;End; end; | Flag est une variable qui représente si l'utilisateur est enregistré ou non. ---------------------------------------- Ici c'est le code de protection par fichier Licence.dat Si l'existence du fichier est fausse alors flag est faux s inon on récupère la valeur Code. On passe Code au Décrypteur-Encrypteur qui nous fournit 3 chaînes Res[0], Res[1] et Res[2]. ---------------------------------------- Ici c'est le code de protection par la BDR On se place sur la clef HKEY_LOCAL_MACHINE (Code 2147483650 sous Delphi 2007) dans le registre de Windows. La sous-clef GB Softs est un exemple. Si la sous-clef GB Softs existe alors on récupère les valeurs des chaînes Mot de Passe, Login et Code Associées aux variables Res[0], Res[1] et Res[2]. ---------------------------------------- Si la fonction Test(Res[0], Res[1] ,Res[2]) est vraie alors flag devient vrai et on rend invisibles les boutons Enregistre et Enregistrement devenus inutiles et on rend opérationnel les Codes du Menu. Ce sont des exemples.. Libre à vous de.. |
CODES DE LA FEUILLE PRINCIPALE FORMDEMO - UNIT DEMO
unit Demo; // Logiciel pour tester la protection ® Guy Bidi
interface
uses Forms,ImgList,Controls,Menus,Classes,StdCtrls,Buttons,SysUtils,Dialogs,Registry;
type
TFormDemo = class(TForm)
Menu:TMainMenu;Liste:TImageList;Protection,APropos:TMenuItem;
Registre,Enregistrement,Contact,CodeF,CodeR,Sortie:TMenuItem;
Memo:TBitBtn;Version,Codes:TMenuItem;Enregistre:TBitBtn;
procedure SortieClick(Sender:TObject);
procedure AideClick(Sender:TObject);
procedure MemoClick(Sender:TObject);
procedure ContactClick(Sender:TObject);
procedure FichierClick(Sender:TObject);
procedure EnregistrementClick(Sender:TObject);
procedure RegistreClick(Sender:TObject);
procedure CodeFClick(Sender:TObject);
procedure CodeRClick(Sender:TObject);
procedure EnregistreClick(Sender:TObject);
procedure FormCreate(Sender:TObject);
end;
var FormDemo:TFormDemo;Flag:Boolean;
implementation
Uses ProtectF,ProtectR,Saisie;
{$R *.dfm}
// Crypte et Décrypte les données du fichier Licence.dat
Function Crypte(Code:String):String; La fonction Crypte qui est aussi une
Var i:Integer;Temp:String; fonction Decrypte se fait à l'aide de
Begin
Temp:='';For i:=1 To Length(Code) Do
Temp:=Temp+Chr(Ord(Code[i]) Xor 200);Crypte:=Temp; l'opérateur Xor 200. Libre à vous de
End; compliquer le cryptage.
// Test d'existence du fichier Licence.dat et prise des Codes
procedure TFormDemo.FormCreate(Sender:TObject);
Const Fichier='Licence.dat';
Var F:TextFile;Code:String;Res:Array[0..2] Of String;i,j:Integer;
begin
Flag:=False;For i:=0 to 2 Do Res[i]:=''; Mise à vide des variables Res[ ].
//---------------------------------------------------------
// Récupération des Codes par la protection Fichier Protection par fichier Licence.dat on
{If FileExists(Fichier)=False Then Exit Else récupère la variable Code que l'on decrypte
Begin AssignFile(F,Fichier);Reset(F);Read(F,Code);CloseFile(F); et on extrait le MDP, Le Login, Le Code
Code:=Crypte(Code);End;i:=0;For j:=1 to Length(Code) Do qui seront associées aux variables Res[0],
If Code[j]<>#13 then Res[i]:=Res[i]+Code[j] Else Inc(i);} Res[1] et Res[3].
//----------------------------------------------------------
// Récupération des Codes par la Base de Registre
With TRegistry.Create Do Begin
RootKey:=2147483650; // Valeur pour HKEY_LOCAL_MACHINE
If OPenKey('SOFTWARE\GB Softs',False) Then Begin
Res[0]:=ReadString('Mot De Passe');Res[1]:=ReadString('Login');
Res[2]:=ReadString('Code');CloseKey;End;End;
If FormSaisie.Test(Res[0],Res[1],Res[2]) Then Begin Flag:=True;
Enregistre.visible:=False;Enregistrement.Visible:=False;
Version.Caption:='Version Complète';Codes.Enabled:=True;End;
end;
Procedure Affiche(Mess:String;Haut,Larg:Integer); Procedure permettant de centrer
Begin juste en dessous de la fenêtre
With FormDemo.Memo Do Begin Height:=Haut;Width:=Larg; principale FormDemo les feuilles
Left:=(FormDemo.ClientWidth-Larg) Div 2; modales.
Top:=(FormDemo.ClientHeight-Haut) Div 2-20;
Caption:=Mess;Visible:=True;End;
End;
procedure TFormDemo.AideClick(Sender:TObject);
Const Mess=' Ce freeware a pour but de présenter'+#13+
' 2 manières de protection des logiciels'+#13+
' que sont la protection par fichier et'+#13+
' la protection par la Base de Registre.'+#13+
' Quelque soit la protection adoptée si'+#13+
' le test de votre code d''Activation est'+#13+
' valide le Menu «Version Démo» passe'+#13+
' en «Version Complète» et opérationnel';
begin
Affiche(Mess,120,260);
end;
Procedure NonVisible;
Begin
MessageDlg('Non Visible dans la Version Démo',mtInformation,[mbOK],0);
End;
procedure TFormDemo.CodeFClick(Sender:TObject);
begin
If Flag then FormF.ShowModal Else NonVisible;
end;
procedure TFormDemo.CodeRClick(Sender:TObject);
begin
If Flag Then FormR.ShowModal Else NonVisible;
end;
procedure TFormDemo.ContactClick(Sender:TObject);
Const Mess=' Pour contacter l''auteur'+#13+' de ce logiciel postez un'+#13+' Email à paounet@free.fr';
begin
Affiche(Mess,70,200);
end;
procedure TFormDemo.EnregistrementClick(Sender:TObject);
Const Mess=' La procédure d''enregistrement consiste à'+#13+' fournir le plus souvent un Nom ou Login un'+#13+
' Mot de Passe pour débloquer l''installation'+#13+' et un Code d''Activation pour passer d''une'+#13+
' version Démo bridée à la version complète';
begin
Affiche(Mess,80,300);Enregistre.Visible:=True;
end;
// Protection par l'écriture du fichier Licence.dat
Procedure Sauve(Codes:String); // Enregistre le fichier Licence.dat
Var F:TextFile;
Begin
AssignFile(F,'Licence.dat');Rewrite(F); Ici on écrit dans le fichier Licence.dat
Write(F,Crypte(Codes));CloseFile(F); Codes qui est crypté.
End;
// Protection par l'écriture dans la Base de Registre
Procedure EcritBDR(MDP,Login,Code:String);
Var Registre:TRegistry;
Begin
With TRegistry.Create Do Begin // Création dans le Registre Ici on écrit dans la Base de Registre BDR
RootKey:=2147483650; // Valeur pour HKEY_LOCAL_MACHINE dans les sous-clefs Mot de Passe, Login et Code
OPenKey('SOFTWARE\GB Softs',True); dansHKEY_LOCAL_MACHINE/GB Softs
WriteString('Mot de Passe',MDP);
WriteString('Login',Login);
WriteString('Code',Code);CloseKey;End;
End;
procedure TFormDemo.EnregistreClick(Sender:TObject); // Saisies
Var Codes:String;
begin
FormSaisie.ShowModal;
With FormSaisie.GetPW Do Begin
With Activation Do If Version='Complète' Then Begin
Codes:=MDP+#13+Login+#13+Code;Flag:=True;End
Else Begin Codes:=MDP+#13+Login+#13;Flag:=False;End;
FormDemo.Version.Caption:='Version '+Activation.Version;
With Enregistre Do If Flag Then Begin Visible:=False;
{ Au choix soit Sauve(Codes) ou EcritBDR(MDP,Login,Code) } Soit on exécute Sauve(Codes) pour la
//Sauve(Codes); // dans le fichier Licence.dat protection dans le fichier Licence.dat
With Activation Do EcritBDR(MDP,Login,Code); // dans la BDR Soit on écrit dans la BDR par EcritBDR(..)
End Else Visible:=True;End;
end;
procedure TFormDemo.FichierClick(Sender:TObject);
Const Mess=' La protection par fichier d''un logiciel fait'+#13+
' souvent appel à un fichier type ini ou texte'+#13+
' dans lequel sont écrits des codes,caractères'+#13+
' representant le Code d''Activation , les mots'+#13+
' de Passe et de Login le tout bien sûr crypté'+#13+
' à l''aide clefs plus ou moins sophistiquées ou'+#13+
' de nombre aléatoire sur 16, 32, 64, 128 bits.';
begin
Affiche(Mess,110,300);
end;
procedure TFormDemo.RegistreClick(Sender:TObject);
Const Mess=' La protection par l''intermédiaire de la base de'+#13+
' de Registre de Windows consiste à ecrire dans'+#13+
' les clefs HKCU et/ou HKLM le Login , le Mot de'+#13+
' Passe, le logiciel, son auteur, la version etc..'+#13+
' Si le code d''Activation saisi est validé par le'+#13+
' logiciel , celui-ci inscrit tous ces paramètres'+#13+
' dans la Base de Registre. A chaque lancement'+#13+
' le logiciel teste la concordance ou non entre'+#13+
' les variables inscrits dans la BDR et calculés.';
begin
Affiche(Mess,130,310);
end;
procedure TFormDemo.MemoClick(Sender:TObject);
begin
Memo.Visible:=False;If Enregistre.Visible Then Enregistre.Visible:=False;
end;
procedure TFormDemo.SortieClick(Sender:TObject);
begin
Application.Terminate;
end;
end.
CODES DE LA FEUILLE MODALE FORMSAISIE - UNIT SAISIE
unit Saisie;
interface
uses Forms,GetPassword,StdCtrls,Buttons,Classes,Controls,ExtCtrls,Dialogs,SysUtils,Math;
type
TFormSaisie = class(TForm)
Retour:TBitBtn;
GetPW:TGetPassword; Le composant TgetPassword qui permet la saisie
procedure RetourClick(Sender:TObject);
Function Test(MDP,Login,Codes:String):Boolean; La fonction qui teste si on est un utilisateur
end; enregistré ou non.
var FormSaisie:TFormSaisie;Flag:Boolean;
implementation
Uses Demo;
{$R *.dfm}
Function Hexa(Chaine:String):Real; Fonction qui convertit une chaine Hexadécimale en
Var i,j:Integer;T:Char;Nb:Real; un nombre réel.
Begin
Nb:=0;For i:=Length(Chaine) DownTo 1 Do Begin
T:=Chaine[i];If Ord(T)>64 Then j:=Ord(T)-55 Else
j:=Ord(T)-48;Nb:=Nb+j*Power(16,Length(Chaine)-i);
End;Hexa:=Nb;
End;
// Fonction qui teste les valeurs saisies avec l'algorithme de calcul La fonction Test
Function TFormSaisie.Test(MDP,Login,Codes:String):Boolean;
Var Chaine:String;i,Valeur,Nbre,Nb:Integer;
Begin
Valeur:=0;
// On récupère le Nombre Nb de Passe.Text:=MotPasse(IntToHex(Nbre,1))
Nbre:=Round(Hexa(MDP)); Nbre est un entier représentant la
// Calcul de la Somme Ascii du Nom = Valeur valeur hexadécimale arrondi de MDP.
For i:=1 To Length(Login) Do Inc(Valeur,Ord(Login[i])); Valeur est un entier représentant la
// Calcul du Nombre générateur de Random Nb:=Valeur*Nbre somme des lettres ASCII du Login
Nb:=Valeur*Nbre; On retrouve ainsi le nombre générateur NB
// Calcul du Code Activation Valide
Chaine:=Copy(IntToStr(Valeur)+IntToHex(Valeur,1)+
IntToHex(Nb,1)+IntToHex(Nbre,1),1,20);
If Chaine=Codes then Test:=True Else Test:=False; On teste la chaîne calculée avec celle
End; qui est fournie.
procedure TFormSaisie.RetourClick(Sender:TObject);
begin
ModalResult:=mrOk; On quitte la feuille FormSaisie.
end;
end.
INSTALLATION DES COMPOSANTS TPASSWORD & TGETPASSWORD
| Les 2 répertoires [GetPassword] [Password] |
| Répertoire contenant GetPassword Aidef.bmp Aider.bmp.lnk Code.pas [Composant] Contact.bmp Demo.dcu Demo.dfm Demo.pas Enregistre.bmp Fichier.bmp Licence.dat ProtectF.dcu ProtectF.dfm ProtectF.ico ProtectF.pas Protection.dpr Protection.dproj Protection.dproj.local Protection.exe Protection.ico Protection.identcache Protection.jpg Protection.res Protection2.jpg ProtectR.dcu ProtectR.dfm ProtectR.ico ProtectR.pas Retour.bmp Saisie.dcu Saisie.dfm Saisie.pas | Répertoire contenant TPassword Aide.ico Aide.jpg Composant] Efface.bmp Generateur.dpr Generateur.dproj Generateur.dproj.local Generateur.exe Generateur.identcache Generateur.res Help.bmp ey.bmp Mdp.bmp Mdp.dcu Mdp.dfm Mdp.ico Mdp.pas d.jpg Sortie.bmp |
| Répertoire contenant le composant GetPassword MyResource.res GetPassword.bpl GetPassword.dcp GetPassword.dcu GetPassword.pas GetPassword.dcr | Répertoire contenant le composant Password MyResource.res Password.bpl Password.dcp Password.dcr Password.dcu Password.pas |
Depuis delphi cliquez sur « Composants et Installer des packages ». Sélectionnez dans les répertoires les fichiers GetPassword.bpl puis puis Password.bpl. Ceux-ci sont s'ajouter à vos composants de la VCL de delphi.
Installez le programme Protection.Dproj puis Generateur.drop et éxécutez les..
Ces programmes ont été faits avec DELPHI 2007 mais il ne devrait y avoir aucun soucis avec les versions antérieurs D7.. Etc.