Un premier vers la question 'compteur d'utilisations'
Si telle est bien la question posée, voici un squelette intéressant. Juste un point de départ, reprenant un dispositif que j'ai déjà utilisé.
Ici j'ai mis un truc tout simple pour l'encodage / décodage d'une donnée stockée dans un fichier.
A partir de là si le sujet intéresse quelqu'un, on peut faire évoluer ce code sur deux axes :
- travailler l'algorithme d'encodage / décodage pour le rendre plus hermétique
- voir si il est facile et consistant d'intégrer la donnée cryptée non pas dans un fichier externe, mais dans l'exécutable lui-même par exemple.
A vos remarques !
Code : Tout sélectionner
;
; Workaround for a program usage counter
; ----------------------------------------------------
; Essai de cryptage d'un compteur d'utilisation d'un prog
;
; FWeil 20040707
;
;
; Set the size of the program messages array
; ----------------------------------------------------
; Fixe la taille du tableau des messages programme
;
#Max_Messages = 10
;
; Program messages array
; Tableau des messages du programme
;
Dim Messages.s(#Max_Messages)
;
; Procedure GetUserLanguage() : user language detection
; ----------------------------------------------------
; Procedure GetUserLanguage() : détection de la langue utilisateur
;
Procedure.s GetUserLanguage()
Language.s
GetSystemDefaultLangID = GetSystemDefaultLangID_()
Select GetSystemDefaultLangID
Case 1036 ; = French (Standard)
Language = "FR"
Default
Language = "EN"
EndSelect
ProcedureReturn Language
EndProcedure
;
; Procedure Encrypt() : string encryption. The string can be decrypted using Decrypt()
; ----------------------------------------------------
; Procedure Encrypt() : encodage d'une chaine de caractères. La chaine peut être décodée avec Decrypt()
;
Procedure.s Encrypt(String.s)
Result.s
For i = 1 To Len(String)
Cod.b = Asc(Mid(String, i, 1))
Result = Result + Chr(Random(7) << 5 + (Cod & $F0) >> 3) + Chr(Random(3) + (Cod & $0F) << 3)
Next
ProcedureReturn Result
EndProcedure
;
; Procedure Decrypt() : string decryption using symmetrical algorythm in connection with Encrypt()
; ----------------------------------------------------
; Procedure Decrypt() : décodage d'une chaine de caractères en utilisant l'algorithme symétrique de Encrypt()
;
Procedure.s Decrypt(String.s)
Result.s
For i = 1 To Len(String) Step 2
Cod.b = (Asc(Mid(String, i, 1)) << 3) & $F0 + (Asc(Mid(String, i + 1, 1)) >> 3) & $0F
Result + Chr(Cod)
Next
ProcedureReturn Result
EndProcedure
;
; User language detection and data section positioning to load program messages accordingly
; ----------------------------------------------------
; Détection de la langue utilisateur et placement approprié dans la zone data pour lire les messages du programme
;
Select GetUserLanguage()
Case "FR"
Restore FR
Default
Restore EN
EndSelect
CurrentMessage = 0
Repeat
Read Message.s
Messages(CurrentMessage) = Message
CurrentMessage + 1
Until Message = "EndDataSection"
;
; Program launch loading the encrypted 'usage counter' information
; This information is decrypted and parsed, and eventually updated information is encrypted again for saving in the file.
; ----------------------------------------------------
; Lancement du programme avec chargement de l'information 'compteur d'utilisation' encryptée
; Cette information est décryptée et analysée, puis le cas échéant, l'information mise à jour est ré-encryptée et enregistrée dans le fichier.
;
If ReadFile(0, "Usage counter.xyz")
a$ = ReadString()
Usage_Counter = Val(Decrypt(a$))
CloseFile(0)
Usage_Counter + 1
If OpenFile(0, "Usage counter.xyz")
WriteString(Encrypt(Str(Usage_Counter)))
CloseFile(0)
Quit = #FALSE
Else
MessageRequester(Messages(0), Messages(1), #PB_MessageRequester_OK)
Quit = #TRUE
EndIf
If Quit = #FALSE
If Usage_Counter > 2
MessageRequester(Messages(0), Messages(2), #PB_MessageRequester_OK)
Quit = #TRUE
Else
Quit = #FALSE
EndIf
EndIf
Else
If CreateFile(0, "Usage counter.xyz")
WriteString(Encrypt("0"))
Quit = #FALSE
Else
MessageRequester(Messages(0), Messages(1), #PB_MessageRequester_OK)
Quit = #TRUE
EndIf
EndIf
If Quit = #FALSE
MessageRequester("OK", "OK", #PB_MessageRequester_OK)
EndIf
End
;
; Data section contains two data blocks corresponding to accepted languages
; ----------------------------------------------------
; La zone data contient les messages du programme avec un bloc pour chaque langue reconnue
;
DataSection
FR:
Data.s "Alerte"
Data.s "Le programme ne peut être lancé : installation défaillante"
Data.s "Le programme a été utilisé au delà de la licence accordée"
Data.s "EndDataSection"
EN:
Data.s "Warning"
Data.s "Can't run the program : bad installation"
Data.s "Program used more than the license authorized"
Data.s "EndDataSection"
EndDataSection
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.