"Clefs Au Pat" amélioré et simplifier.
Publié : lun. 14/oct./2024 18:40
Des modifications ont été apporté aux codes.
"Clefs Au Pat-Principal.pb"
On peut choisir le dossier ou installer la clef.
On ne teste plus les differentes carte réseaux, c'est le module qui s'en charge.
Le formulaire
"Clefs Au Pat-Win.pbf"
Ajout d'une zone de texte où afficher le dossier par défaut et d'un bouton pour en changer.
Le module
"Module ProtectionLogiciel.pb"
Il a été modifier pour gérer tout seul le test des cartes réseau.
Exemple d'utilisation.
Nous allons créer une nouvelle application appelée "TestoPat".
Mais tout d'abord, on ajoute le nom de l'appli dans la Combo_Prog du source "Clefs Au Pat-Principal.pb" 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
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 dossier ou sera enregistrer la clef. ( le dossier de l'appli à protéger )
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"
On compile le source "TestoPat.pb" et on teste.
On teste ensuite sur une autre machine pour voir...
A propos du programme principal :
On veillera à le protéger lui aussi avec une carte réseau USB de préférence.
Pour ce faire :
Inserrez la carte réseau USB et installez les pilotes si necessaire.
Lancez le programme principale.
selectionnez le programme "Clefs Au Pat"
selectionnez la carte réseaux USB
Dossier par défaut : normalement rien a faire, c'est le dossier de l'aplication
Vous pouvez maintenant générer la clef.
Maitenant que nous avont la clef, il reste à activer la protection dans le fichier principal.
Supprimons les points-virgule des lignes suivantes :
On compile le code pour en faire un executable.
"Clefs Au Pat" est maintenant protégé et ne fonctionnera qu'en présence de la clef USB
Notez qu'il nous faudra recompiler "Clefs Au Pat" aprés chaques ajout de programme à la liste les applications.
Ca peut paraître compliqué mais je pense qu'avec quelques essais ça devrait le faire.
Il faut bien garder à l'esprit que le nom du programme de la "Combo_Prog" du source "Clefs Au Pat-Principal.pb" doit être strictement identique à celuis passé au teste de la clef de votre application :
If Not ProtectionLogiciel::CleOk( "Nom de Mon Pro" )
car on utilise le nom du programme et l'adresse materielle de la carte réseau pour générer la clef nurérique.
Une simple différence quelqu'elle soit : Minuscule, majuscule espace en trop ou en moins peut faire que la clef ne soit pas reconnue.
J'ai essayé d'être le plus claire possible dans mes éxplications.
Profitez bien...
"Clefs Au Pat-Principal.pb"
On peut choisir le dossier ou installer la clef.
On ne teste plus les differentes carte réseaux, c'est le module qui s'en charge.
Code : Tout sélectionner
; Clefs Au Pat est utilisé pour mettre en place des clefs de protection.
; *****************
XIncludeFile "Module ProtectionLogiciel.pb"
; ; *** ICI on protege l' application au demarrage
; ; ATTENTION : Le nom est sensible à la case "Clefs Au Pat" est diffèrent de "clefs au pat"
; If Not ProtectionLogiciel::CleOk( "Clefs Au Pat" ) ; Si l'on a pas de clef, on ne va pas plus loin.
; MessageRequester( "Autorisation refusée." , "L'application va se fermée." , #PB_MessageRequester_Ok | #PB_MessageRequester_Warning )
; End ; C'est FINI
; EndIf
; ; On poursuit
; Ici débute le programme à protéger.
XIncludeFile "Clefs Au Pat-Win.pbf"
OpenWindow_0()
Global .s Titre = "Clefs Au Pat V20241014"
; *****************
; 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_DossierOnClick (EventType)
SetCurrentDirectory( PathRequester( "Choisissez un répertoire.", GetCurrentDirectory( ) ) )
SetGadgetText( String_Dossier , GetCurrentDirectory() )
EndProcedure
Procedure Button_GenereOnClik (EventType)
Protected .s Mac
Protected .l Clef
Protected .s Prog
; Recupère l'adresse physique de la carte correspondant à la carte choisie
SelectElement( ProtectionLogiciel::Reseau_Liste() , GetGadgetState( Combo_CarteReseau ) )
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 )
MessageRequester( "Information." , "Le clef a été ajouter." , #PB_MessageRequester_Ok | #PB_MessageRequester_Info )
EndProcedure
Procedure Button_RechargeOnClick (EventType)
RechargeCartesReseaux ( )
EndProcedure
Procedure Button_QuitterOnClick (EventType)
End
EndProcedure
SetWindowTitle ( Window_0 , Titre )
HideWindow( Window_0, #False )
RechargeCartesReseaux ( )
; Initialise la Combo_Prog avec la liste des applis à protéger
AddGadgetItem ( Combo_Prog , -1 , "Clefs Au Pat" ) ; C'est ICI que l'on ajoute le nom des aplication à protéger
;AddGadgetItem ( Combo_Prog , -1 , "NomDuProg2" ) ; Comme par exemple ceux-ci
;AddGadgetItem ( Combo_Prog , -1 , "NomDuProg3" )
;AddGadgetItem ( Combo_Prog , -1 , "NomDuProg4" )
SetGadgetState ( Combo_Prog , 0 ) ; Présélection du 1er de la liste
; Affichage du dossier par défaut
SetGadgetText( String_Dossier , GetCurrentDirectory() )
; *****************
; La boucle principale
Repeat
Evenement = WaitWindowEvent()
Select EventWindow()
Case Window_0
Window_0_Events(Evenement)
EndSelect
Until Evenement = #PB_Event_CloseWindow
"Clefs Au Pat-Win.pbf"
Ajout d'une zone de texte où afficher le dossier par défaut et d'un bouton pour en changer.
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, String_Dossier, Button_Dossier, Text_Dossier
Declare Button_RechargeOnClick(EventType)
Declare Button_QuitterOnClick(EventType)
Declare Button_DossierOnClick(EventType)
Declare Button_GenereOnClik(EventType)
Procedure OpenWindow_0(x = 0, y = 0, width = 640, height = 150)
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, 60, 250, 20)
Combo_CarteReseau = ComboBoxGadget(#PB_Any, 270, 60, 250, 20)
Button_Genere = ButtonGadget(#PB_Any, 540, 90, 90, 20, "Génère la clef")
Button_Recharge = ButtonGadget(#PB_Any, 540, 60, 90, 20, "Recharge la liste")
Button_Quitter = ButtonGadget(#PB_Any, 540, 120, 90, 20, "Quitter")
String_Dossier = StringGadget(#PB_Any, 10, 30, 510, 20, "", #PB_String_ReadOnly)
Button_Dossier = ButtonGadget(#PB_Any, 540, 30, 90, 20, "Autre Dossier")
Text_Dossier = TextGadget(#PB_Any, 10, 10, 510, 20, "La clef sera intallée dans ce dossier.")
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())
Case Button_Dossier
Button_DossierOnClick(EventType())
EndSelect
EndSelect
ProcedureReturn #True
EndProcedure
Le module
"Module ProtectionLogiciel.pb"
Il a été modifier pour gérer tout seul le test des cartes réseau.
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 ( Appli.s )
Declare AddCleIni ( Appli.s , Cle.l )
EndDeclareModule
Module ProtectionLogiciel
; ******** Constantes et variables privées ***************
Global .s FichierIni = "Clefs Au Pat.ini"
; ******** Procedures Privées ***************
Procedure .a TestCle ( Cle.l ) ; Teste si la cle est presente dans le fichier ini
Protected Ok .a = #False
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
ProcedureReturn Ok
EndProcedure
; ******** 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 ( Appli.s ) ; Teste si la cle est presente dans le fichier ini
Protected Ok .a = #False
Protected Mac .s = ""
Protected Clef .l = 0
; On teste chacunes des carte réseaux avec les clefs enregistrés dans le fichier ini
ChargeListeReseau() ; Recharge la liste des cartes reseau présentes et valide (une carte réseau USB a pu être inserée entre temps)
If OpenPreferences ( GetCurrentDirectory() + FichierIni ) ; Ouvre le fichier "Clefs Au Pat.ini" s'il existe
ForEach Reseau_Liste() ; pour chaque carte réseau trouvée
Mac = Reseau_Liste()\Adresse ; Recupère l'adresse physique de la carte
Clef = CalculeCle( Appli + Mac ) ; La clef est calculée à partie du nom du programme et de l'adresse physique
If TestCle ( Clef ) ; on compare cette clef à celle enregistré dans "Clefs Au Pat.ini"
ClefOk = #True ; si c'est trouvé , c'est OK
EndIf
Next
EndIf
ClosePreferences ( ) ; Ferme le fichier ini
ProcedureReturn ClefOk ; Retourne #True ou #False
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 ( 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
Exemple d'utilisation.
Nous allons créer une nouvelle application appelée "TestoPat".
Mais tout d'abord, on ajoute le nom de l'appli dans la Combo_Prog du source "Clefs Au Pat-Principal.pb" 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
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 dossier ou sera enregistrer la clef. ( le dossier de l'appli à protéger )
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
; Il nous faut le module
XIncludeFile "Module ProtectionLogiciel.pb"
; *** Debut de la protection ***
; Cette section est à placer au début de tous les applis à protéger
; Vérifie si la clef est présente
NomDuProg .s = "TestoPat" ;
; ATTENTION : Le nom est sensible à la case "TestoPat" est diffèrent de "testopat"
; Ici, la procédure est simplifiée, on demande au module "ProtectionLogiciel" de vérifier que la carte réseau associer au prog "testopat" est bien présente
; LE MEME NOM que celui ajouté dans la liste de programmes de la Combo_Prog du source "Clefs Au Pat-Principal.pb"
If Not ProtectionLogiciel::CleOk( "TestoPat") ; Si l'on a pas trouvé la clef, on ne va pas plus loin.
MessageRequester( "Autorisation refusée." , "L'application va se fermée." , #PB_MessageRequester_Ok | #PB_MessageRequester_Warning )
End ; C'est FINI, on quitte.
EndIf
; Dans le cas contraire, on poursuit le déroulement du programme
; Ici débute le programme, 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 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()
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
On teste ensuite sur une autre machine pour voir...
A propos du programme principal :
On veillera à le protéger lui aussi avec une carte réseau USB de préférence.
Pour ce faire :
Inserrez la carte réseau USB et installez les pilotes si necessaire.
Lancez le programme principale.
selectionnez le programme "Clefs Au Pat"
selectionnez la carte réseaux USB
Dossier par défaut : normalement rien a faire, c'est le dossier de l'aplication
Vous pouvez maintenant générer la clef.
Maitenant que nous avont la clef, il reste à activer la protection dans le fichier principal.
Supprimons les points-virgule des lignes suivantes :
Code : Tout sélectionner
; If Not ProtectionLogiciel::CleOk( "Clefs Au Pat" ) ; Si l'on a pas de clef, on ne va pas plus loin.
; MessageRequester( "Autorisation refusée." , "L'application va se fermée." , #PB_MessageRequester_Ok | #PB_MessageRequester_Warning )
; End ; C'est FINI
; EndIf
"Clefs Au Pat" est maintenant protégé et ne fonctionnera qu'en présence de la clef USB
Notez qu'il nous faudra recompiler "Clefs Au Pat" aprés chaques ajout de programme à la liste les applications.
Ca peut paraître compliqué mais je pense qu'avec quelques essais ça devrait le faire.
Il faut bien garder à l'esprit que le nom du programme de la "Combo_Prog" du source "Clefs Au Pat-Principal.pb" doit être strictement identique à celuis passé au teste de la clef de votre application :
If Not ProtectionLogiciel::CleOk( "Nom de Mon Pro" )
car on utilise le nom du programme et l'adresse materielle de la carte réseau pour générer la clef nurérique.
Une simple différence quelqu'elle soit : Minuscule, majuscule espace en trop ou en moins peut faire que la clef ne soit pas reconnue.
J'ai essayé d'être le plus claire possible dans mes éxplications.
Profitez bien...