"Clefs Au Pat" amélioré et simplifier.

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

"Clefs Au Pat" amélioré et simplifier.

Message par plabouro472 »

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.

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 


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.

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 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 :

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
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...
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: "Clefs Au Pat" amélioré et simplifier.

Message par Ar-S »

Pas encore essayé mais c'est intéressant comme idée. Un petit dongle maison.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Re: "Clefs Au Pat" amélioré et simplifier.

Message par ZapMan »

Ce coup-là, c'est bien plus clair. Merci d'avoir complété tes explications et merci beaucoup pour le partage.
Je n'ai pas de besoin de ce genre de truc pour le moment, mais je retiens l'idée.
Beau boulot !
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: "Clefs Au Pat" amélioré et simplifier.

Message par plabouro472 »

Merci pour le compliment.

Je tenais juste à préciser que l'outil peut satisfaire le besoins dans le cadre familial ou au bureau.
La protection est simple en soit et peut être contournée par une personne ayant de forte connaissance en informatique.
Même les logiciels professionnels peuvent être cracker...

Reste à chacun d'en apporter les améliorations et adaptations qui lui convient pour améliorer son efficacité.
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Re: "Clefs Au Pat" amélioré et simplifier.

Message par SPH »

Merci d'avance pour ces codes.

Je dis bien "d'avance" car j'ai 2 remarques (constructives je l'espère) :

1 : Il est long de copier coller puis de sauvegarder avec le bon nom de fichier tes codes PB. Pourrais tu mettre tous ces codes dans un ZIP ?
2 : je n'ai ABSOLUMENT pas compris ce que fait ton programme (faut dire que je ne l'ai pas essayer car "voir le point n°1)

Merci Plab :D

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
plabouro472
Messages : 40
Inscription : sam. 23/juil./2022 10:17

Re: "Clefs Au Pat" amélioré et simplifier.

Message par plabouro472 »

SPH a écrit : mer. 16/oct./2024 10:27 Merci d'avance pour ces codes.

Je dis bien "d'avance" car j'ai 2 remarques (constructives je l'espère) :

1 : Il est long de copier coller puis de sauvegarder avec le bon nom de fichier tes codes PB. Pourrais tu mettre tous ces codes dans un ZIP ?
2 : je n'ai ABSOLUMENT pas compris ce que fait ton programme (faut dire que je ne l'ai pas essayer car "voir le point n°1)

Merci Plab :D
C'est une bonne remarque de ta part, je vais voir comment faire et aussi ajouter une documentation détaillée.
Il faudra patienter un peu, le temps pour moi de préparer tout ça. :?
Répondre