Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LA PROTECTION DES LOGICIELS VIA UN COMPOSANT TPASSWORD, TGETPASSWORD


Information sur le tutorial

Catégorie :Composants Date de création : 20/08/2007 20:55:09 Vu : 8 863 fois

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Protection des logiciels via un composant TGetPasword
par un fichier et/ou la Base de Registre.
Générateur de mot de passe par le composant TPassword.

Tutorial

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 :

 

Protection2.jpg

 

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.

 

Protection.jpg

 

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).

 

Generateur.jpg

   

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.   

 

signaler à un administrateur
Commentaire de Albedo039 le 09/10/2007 11:41:46

Salut,

je n'ai rien contre la protection de logiciel ... mais j'aimerais faire les remarques suivantes:

1) aucune protection n'est efficace à 100% (comme chacun sait) donc il ne faut pas perdre trop (!) de temps à essayer de protéger "encore plus" efficacement son logiciel: il vaut mieux utiliser ce temps à améliorer le logiciel ;) Beaucoup de personnes intéressées par un logiciel vraiment bon seront prêtes à en payer le prix sans rechinier... les autres: elles font au moins de la pub...

2) la meilleure manière de distribuer un logiciel est de produire:
-> une version d'essai ne contenant aucune des fonctions de la version complète
-> une version complète indépendante de la démo et intégrant la licence à 100% c.a.d. il faut produire pour chaque client un compilat correspondant (ce qui, il est vrai est très lourd à gérer et ce qui devient problématique lors d'une actualisation).

3) Quoiqu'il arrive: il vaut mieux masquer les appels aux fonctions de (de-)cryptage au maximum:
-> éviter "Function Crypte(Code:String):String;" !!!
utiliser plutôt qqc comme "Function xh971(var _p10045h: PChar);"
-> un Test de la forme "If Chaine=Codes then Test:=True Else Test:=False;" est maladroit.
il suffit d'éditer le code binaire (jump if equal) et de remplacer un byte pour contourner le test et donc la protection...

Voilà: je pense que ce tuto est bien (structuré, détaillé...) mais ne va pas assez loin (explication des limites et des dangers...) : une note de 6, donc.

signaler à un administrateur
Commentaire de Albedo039 le 09/10/2007 11:46:25

précision: "jump if equal" peut être remplacé par "jump if NOT equal" et alors tous les codes (sauf le vrai) sont reconnus comme bon.

(et j'espère que la note va être enregistrée, cette fois :) )

signaler à un administrateur
Commentaire de tunisian_hak le 02/11/2007 11:52:37

think ou est le programme Mr

signaler à un administrateur
Commentaire de zinoartiste le 14/12/2007 15:14:52

pkoi tu n est pas mets le source

signaler à un administrateur
Commentaire de frsof le 26/02/2008 14:29:58

Ou est la source?

signaler à un administrateur
Commentaire de econs le 26/02/2008 17:20:28 administrateur CS

Vous êtes sur la page des tutoriaux. On ne peut pas y déposer de source.

signaler à un administrateur
Commentaire de nabilll93 le 14/05/2008 11:22:54

salu merci bien et tu fais un plaisir envoye moi le zip de cette application
nabilll93@hotmail.com

signaler à un administrateur
Commentaire de toufikmerah le 30/10/2008 20:48:42

vous souhaitons beaucoup de succés.

signaler à un administrateur
Commentaire de Paounet le 31/10/2008 13:22:46

A tous, les codes de GetPassword et Password sont dans les codes...
Les 2 composants sont dans un même Zip......
Recherchez dans Codes GetPassword....

signaler à un administrateur
Commentaire de x1rt4m le 07/01/2009 14:42:25

@Albedo039 je suis de ton avis; que c'est bidon comme protection, même un newbie peut le cracker facilement, ont a qu'a changer la valuer de Flag 0 ou 1 ( je parle pas de la variabl Flag de programme mais celle test  le JE ou le JNE(P,C,S,T): so as you see we don't need to change the  74 by 75 at all ;).

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,187 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.