Protégez vos applications avec "Clefs Au Pat".

Programmation d'applications complexes
Avatar de l’utilisateur
plabouro472
Messages : 40
Inscription : sam. 23/juil./2022 10:17

Protégez vos applications avec "Clefs Au Pat".

Message par plabouro472 »

Il génère une clef basée sur le matériel ( cartes réseaux même USB pour la portabilité ) dans un fichier "Clefs Au Pat.ini", il ne doit pas être renommé et doit resté dans le dossier de l'application.
Ce même fichier peut contenir les clef de différent programmes s'il sont tous dans le même dossier.

C'est un plaisir pour moi de vous en faire profiter.

3 fichiers :
- "Clefs Au Pat-Principal.pb"
- "Clefs Au Pat-Win.pbf"
- "Module ProtectionLogiciel.pb"

Le programme pricipale
"Clefs Au Pat-Principal.pb"

Code : Tout sélectionner

;
; Clefs Au Pat est utilisé pour mettre en place des clefs de protection.
; *****************
XIncludeFile "Module ProtectionLogiciel.pb"
XIncludeFile "Clefs Au Pat-Win.pbf"

OpenWindow_0()

Global .s Titre   = "Clefs Au Pat V20241013"
Global .s NomDuProg = "Clefs Au Pat"
; *****************
; Les procédures
Procedure RechargeCartesReseaux ( )
 ;Charge la liste des cartes réseaux dans la Combo_CarteReseau
 ClearGadgetItems( Combo_CarteReseau )  ; Vide la Combo de son contenu
 ProtectionLogiciel::ChargeListeReseau()  ; on réccupère les infos
 ForEach ProtectionLogiciel::Reseau_Liste() ; pour chacun ds éléments de la liste
 AddGadgetItem ( Combo_CarteReseau , -1 , ProtectionLogiciel::Reseau_Liste()\Description )
 Next
 SetGadgetState( Combo_CarteReseau , 0 )  ; Selection du 1er élément de la liste
EndProcedure


; *****************
; Les procédures d'événements
Procedure Button_GenereOnClik (EventType)
 Protected .s Mac
 Protected .a Pos
 Protected .l Clef
 Protected .s Prog
 
 ; Recupère l'adresse physique de la carte correspondant à la carte choisie
 Pos = GetGadgetState( Combo_CarteReseau )
 SelectElement( ProtectionLogiciel::Reseau_Liste() , Pos )
 Mac  = ProtectionLogiciel::Reseau_Liste()\Adresse
 ; Recupère le nom du programme choisi de la Combo_Prog
 Prog = GetGadgetText( Combo_Prog )
 ; Génère la clef et l'ajoute au fichier ini
 Clef = ProtectionLogiciel::CalculeCle( Prog + Mac )
 ProtectionLogiciel::AddCleIni ( GetGadgetText( Combo_Prog ) , Clef )
EndProcedure
Procedure Button_RechargeOnClick (EventType)
 RechargeCartesReseaux ( )
EndProcedure
Procedure Button_QuitterOnClick (EventType)
 End
EndProcedure

SetWindowTitle ( Window_0 , Titre ) 



; ; *** ICI on protege l'application au démarrage
; ; Supprimez les commentaires pour protéger "Clefs Au Pat"
; Clef .l = 0
; ClefOk .a = #False
; Mac  .s = ""
; ; Vérifie si la clef est présente
; ; On teste chacunes des carte réseaux avec la clef enregistrer dans le fichier ini
; ProtectionLogiciel::ChargeListeReseau()
; ForEach ProtectionLogiciel::Reseau_Liste()
; Mac = ProtectionLogiciel::Reseau_Liste()\Adresse
; Clef = ProtectionLogiciel::CalculeCle( NomDuProg + Mac )
; If ProtectionLogiciel::CleOk ( Clef )
;  ClefOk = #True
; EndIf
; Next
; ; Si l'on a pas de clef, on ne va pas plus loin. 
; If Not ClefOk
; MessageRequester( "Autorisation refusée." , "L'application vat se fermée." , #PB_MessageRequester_Ok | #PB_MessageRequester_Warning )
; End ; C'est FINI
; EndIf



; On poursuit
HideWindow( Window_0, #False )
RechargeCartesReseaux ( )

; Initialise la Combo_Prog avec la liste des applis à protéger
AddGadgetItem ( Combo_Prog , -1 , "Clefs Au Pat" )
; AddGadgetItem ( Combo_Prog , -1 , NomDuProg2 )
; AddGadgetItem ( Combo_Prog , -1 , NomDuProg3 )
; AddGadgetItem ( Combo_Prog , -1 , NomDuProg4 )
SetGadgetState ( Combo_Prog , 0 ) ; Présélection du 1er de la liste


; *****************
; La boucle principale
Repeat
 Evenement = WaitWindowEvent()
 Select EventWindow()
 Case Window_0
  Window_0_Events(Evenement)
  
 EndSelect
Until Evenement = #PB_Event_CloseWindow

Le formulaire
"Clefs Au Pat-Win.pbf"

Code : Tout sélectionner

;
; This code is automatically generated by the Form Designer.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures need to be put in another source file.
;

Global Window_0

Global Combo_Prog, Combo_CarteReseau, Button_Genere, Button_Recharge, Button_Quitter

Declare Button_RechargeOnClick(EventType)
Declare Button_QuitterOnClick(EventType)
Declare Button_GenereOnClik(EventType)

Procedure OpenWindow_0(x = 0, y = 0, width = 610, height = 130)
 Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 HideWindow(Window_0, 1)
 Combo_Prog = ComboBoxGadget(#PB_Any, 10, 20, 250, 20)
 Combo_CarteReseau = ComboBoxGadget(#PB_Any, 270, 20, 250, 20)
 Button_Genere = ButtonGadget(#PB_Any, 540, 50, 60, 20, "Génère")
 Button_Recharge = ButtonGadget(#PB_Any, 540, 20, 60, 20, "Recharge")
 Button_Quitter = ButtonGadget(#PB_Any, 540, 100, 60, 20, "Quitter")
EndProcedure

Procedure Window_0_Events(event)
 Select event
  Case #PB_Event_CloseWindow
   ProcedureReturn #False

  Case #PB_Event_Menu
   Select EventMenu()
   EndSelect

  Case #PB_Event_Gadget
   Select EventGadget()
    Case Button_Genere
     Button_GenereOnClik(EventType())     
    Case Button_Recharge
     Button_RechargeOnClick(EventType())     
    Case Button_Quitter
     Button_QuitterOnClick(EventType())     
   EndSelect
 EndSelect
 ProcedureReturn #True
EndProcedure




Le module
"Module ProtectionLogiciel.pb"

Code : Tout sélectionner



DeclareModule ProtectionLogiciel
 ; ******** Constantes et variables Publiques ***************
 Structure Reseau
 Description .s
 Adresse  .s 
 EndStructure
 Global NewList Reseau_Liste.Reseau()
 
 ; ******** Declaration des procedures Publiques ***************
 Declare  ChargeListeReseau  ( )
 Declare .l CalculeCle    ( Txt.s )
 Declare .a CleOk     ( Cle.l )
 Declare  AddCleIni    ( Appli.s , Cle.l )
EndDeclareModule


Module  ProtectionLogiciel
 ; ******** Constantes et variables privées ***************
 Global .s FichierIni = "Clefs Au Pat.ini"
 
 ; ******** Procedures Privées ***************
 
 
 
 ; ******** Procedures Publiques ************
 Procedure  ChargeListeReseau  (     ) ; Charge la liste des cartes reseau valide
 ClearList( Reseau_Liste() )
 MonProg = RunProgram( "ipconfig", "/all", "", #PB_Program_Open | #PB_Program_Read) ; Pour Windows XP-VISTA-7-8-10-11
 If MonProg 
  While ProgramRunning( MonProg )
  If AvailableProgramOutput( MonProg )
   TmpTxt$ = ""
   While( TmpTxt$ = "" )
   TmpTxt$ = ReadProgramString( MonProg )      ; Lecture d une ligne non vide
   Wend
   If FindString( TmpTxt$ , "Description" )      ; Recherche le mot "Description"
   Index.i = FindString( TmpTxt$ , ":" ) + 2
   Txt1$ = Mid( TmpTxt$, Index )        ; Recupère le nom de la carte réseau
   TmpTxt$ = ""
   While( TmpTxt$ = "" )
    TmpTxt$ = ReadProgramString( MonProg )     ; Lecture d une ligne non vide suivante
   Wend
   Index.i = FindString( TmpTxt$ , ":" ) + 2
   Txt2$ = Mid( TmpTxt$, Index )        ; Recupère l'adresse physique de la carte
   Lg.i = Len( Txt2$ )
   If( Lg > 11 And Lg < 18 )         ; Si l' adressse est conforme
    AddElement( Reseau_Liste( ) )        ; on enregistre les infos dans la liste
    Reseau_Liste( )\Description = Txt1$
    Reseau_Liste( )\Adresse  = Txt2$
   EndIf
   EndIf
  EndIf
  Wend
  CloseProgram( MonProg )           ; Ferme la connexion vers le programme
 EndIf
 EndProcedure
 Procedure .l CalculeCle    ( Txt.s   ) ; Retourne la cle calcule depuis Txt
 Protected Cle .l = 0
 Protected x  .i
 ; Algo de calcule de clefs ( mais vous pouvez changer )
 For x = 1 To Len( Txt )
  Cle + Asc( Mid( Txt , x , 1 ) ) * x
 Next
 
 ProcedureReturn Cle
 EndProcedure
 Procedure .a CleOk     ( Cle.l )    ; Teste si la cle est presente dans le fichier ini
 Protected Ok .a = #False
 If OpenPreferences   ( GetCurrentDirectory() + FichierIni )
  ExaminePreferenceGroups  ( )          ; Recherche des groupes dans le fichier préférence
  While NextPreferenceGroup ( )          ; Tant qu'il existe un groupe à afficher
  ExaminePreferenceKeys  ( )          ; Recherche les cles du groupe
  While NextPreferenceKey ( )          ; Tant qu'il existe une clé à afficher
   If Cle = ReadPreferenceLong( PreferenceKeyName( ) , 0 )  ; Si egale alors on a trouve
   Ok = #True
   EndIf
  Wend
  Wend
  ClosePreferences()  ; Fermer le fichier préférence
 EndIf
 ProcedureReturn Ok
 EndProcedure
 Procedure  AddCleIni    ( Appli.s , Cle.l ) ; Ajoute une cle au fichier ini si elle n'existe pas deja
 Protected N    .i = 1
 Protected Ok   .a = #False
 Protected KeyNameExiste .a = #False
 Protected KeyNameDispo .i = 0
 
 If OpenPreferences ( GetCurrentDirectory() + FichierIni )      ; Ouvre le fichier ini s'il existe
  
  ExaminePreferenceGroups  ( )             ; Recherche des groupes dans le fichier préférence
  While NextPreferenceGroup ( )             ; Tant qu'il existe un groupe à afficher
  ExaminePreferenceKeys  ( )             ; Recherche les cles du groupe
  While NextPreferenceKey ( )             ; Tant qu'il existe une clé à afficher
   If Cle = ReadPreferenceLong( PreferenceKeyName( ) , 0 )     ; Si egale alors on a trouve
   Ok = #True
   EndIf
  Wend
  Wend
  
  If Not Ok
  PreferenceGroup   ( Appli )            ; Selectionne le groupe Appli ou le cree s'il n'existe pas
  While Not KeyNameDispo
   ExaminePreferenceKeys  ( )
   While NextPreferenceKey ( )            ; Tant qu'il existe une clé à afficher dans le groupe Appli
   If PreferenceKeyName ( ) = Str( N ) : KeyNameExiste = #True : EndIf ; Le nom de la cle existe ?
   Wend
   If KeyNameExiste : N + 1 : KeyNameExiste = #False       ; Nom de la cle suivante
   Else      : KeyNameDispo = N        ; Le nom de la cle est dispo
   EndIf
  Wend
  If KeyNameDispo : WritePreferenceLong ( Str( KeyNameDispo ) , Cle ) : EndIf ; Enregistre nom de la cle avec la cle
  EndIf
  
 Else                    ; Le fichier n'existe pas
  CreatePreferences  ( GetCurrentDirectory() + FichierIni )     ; Creation du fichier ini
  PreferenceGroup  ( Appli )             ; Creation du groupe
  WritePreferenceLong ( "1" , Cle )            ; Enregistre nom de la cle avec la cle
 EndIf
 ClosePreferences  ( )               ; Enregistre et ferme le fichier ini
 
 EndProcedure
 
 ; ******* Initialisation *******
 
 
EndModule


Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Re: Protégez vos applications avec "Clefs Au Pat".

Message par ZapMan »

Merci pour le partage, Plabouro :)

Tu pourrais expliquer la façon dont tu utilises ça ? Fournir un petit fichier de démo ?
Je vois bien à quoi une clé peux servir, mais ton organisation de procédures semble montrer que tu as une façon bien précise de gérer l'affaire, et c'est assez obscure pour moi, pour le moment.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
plabouro472
Messages : 40
Inscription : sam. 23/juil./2022 10:17

Re: Protégez vos applications avec "Clefs Au Pat".

Message par plabouro472 »

Voici plus de précision avec un exemple :

Nous allons créer une nouvelle application appelée TestoPat.

Mais tout d'abord, on ajoute le nom de la nouvelle appli dans la Combo_Prog du source "Clefs Au Pat" pour créer une liste d'applications
Attention : Le nom est sensible à la case "TestoPat" est diffèrent de "testopat"
Le nom doit être identique dans les 2 programmes.

Dans le fichier "Clefs Au Pat-Principal"
on complète la liste de la Combo_Prog

Code : Tout sélectionner

; Initialise la Combo_Prog avec la liste des applis à protéger
AddGadgetItem  ( Combo_Prog , -1 , "Clefs Au Pat" )
AddGadgetItem  ( Combo_Prog , -1 , "TestoPat" ) ; La nouvelle ligne à ajouter
; et ainsi de suite pour tout programme à protéger 

SetGadgetState ( Combo_Prog , 0 ) ; Présélection du 1er de la liste par défaut

on compile "Clefs Au Pat" et on le lance pour générer la clef du nouveau programme.

le programme démarre.
on sélectionne le programme à protéger ( à gauche. ) : "TestoPat"
on sélectionne la carte réseau qui servira de clefs ( à droite )

Le bouton "Recharge" sert à recharger la liste des cartes réseaux.
Le bouton "Génère" ajoutera la clef du programme au fichier "Clefs Au Pat.ini"

on "Génère" puis on quitte le programme.

on répètera l'opération sur chaque machine sur laquelle on souhaite faire tourner l'appli.


Maintenant, on développe son appli.
par exemple :

"TestoPat.pb"

Code : Tout sélectionner

; *** Debut de la protection ***
; Cette section est à placer au début de tous les applis à protéger
; Il nous faut le module
XIncludeFile	"Module ProtectionLogiciel.pb"

 Clef   .l = 0
 ClefOk .a = #False
 Mac    .s =  ""

 NomDuProg .s	= "TestoPat" ; LE MEME NOM que celui ajouté dans la Combo_Prog du source "Clefs Au Pat" Attention à la case
 
 ; Vérifie si la clef est présente
 ; On teste chacunes des carte réseaux avec la clef enregistrer dans le fichier ini
 ProtectionLogiciel::ChargeListeReseau()
 ForEach ProtectionLogiciel::Reseau_Liste() ; pour chaque carte réseau trouvée
  Mac = ProtectionLogiciel::Reseau_Liste()\Adresse ; Recupère l'adresse physique de la carte
  ; La clef est calculée à partie du nom du programme et de l'adresse physique
  Clef = ProtectionLogiciel::CalculeCle( NomDuProg + Mac	) ; On calcule la clef 
  If ProtectionLogiciel::CleOk	( Clef	) ; on compare cette clef à celle enregistré dans "Clefs Au Pat.ini"
   ClefOk = #True ; si c'est trouvé, c'est OK
   EndIf
 Next
 ; Si l'on a pas de clef, on ne va pas plus loin. 
 If Not ClefOk
   MessageRequester( "Autorisation refusée." , "L'application vat se fermée." , #PB_MessageRequester_Ok | #PB_MessageRequester_Warning )
   End ; C'est FINI
 EndIf
 ; *** Fin de la protection ***



 ; Puis, débute le programme à protéger. ici, un exemple piocher dans l'aide de PB
If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")

  If CreateImage(0, 255, 255)

    StartDrawing(ImageOutput(0))
    
    For k=0 To 255
      FrontColor(RGB(k,0, k))  ; a rainbow, from black to pink
      Line(0, k, 255, 1)
    Next

    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(255,255,255)) ; print the text to white !
    DrawText(40, 50, "An image easily created !")

    StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
    
  EndIf
  
  CopyImage(0, 1)
  ResizeImage(1, 100, 100)
  
  GrabImage(0, 2, 100, 60, 150, 40)
  
  ImageGadget(0,  20,  10, 255, 255, ImageID(0))
  ImageGadget(1, 320,  80, 100, 100, ImageID(1))
  ImageGadget(2, 320, 200, 150,  40, ImageID(2))
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
  
EndIf

End   ; All the opened windows are closed automatically by PureBasic
On compile le source "TestoPat.pb" et on teste.

On teste ensuite sur une autre machine pour voir...
Répondre