[Tuto] Cacher une clé de registre

Espace contenant des tutoriels divers concernant AutoIt.
Règles du forum
.

Tutoriel "La programmation avec Autoit" : https://openclassrooms.com/fr/courses/1 ... vec-autoit
Répondre
Avatar du membre
zeshrek
Modérateur
Modérateur
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

[Tuto] Cacher une clé de registre

#1

Message par zeshrek » lun. 17 janv. 2011 17:09

Quant on développe une application, il est une question récurrente qui est celle de l'enregistrement de données qui doivent rester invisible a l'utilisateur.
Ce peut etre un marqueur qui compte le nombre d'éxécutions d'un script (par exemple comme récement dans ce sujet) une protection de licence (même si autoit n'est aps le langage idéal pour développer du code qui doit etre protégé... etc etc.

Le problème se résume a un axiome assez simple (il est a la base des doctrines militaires, c'est dire si c'est pas dur a comprendre) : Si on peut le voir, on peut l'atteindre, et si on peut l'atteindre, on peut le détruire.
Et la parade est un bon vieux dicton bien de chez nous : Pour vivre heureux, vivons cachés.

Oui mais voilà comment faire pour cacher une information que mon programme devra pouvoir lire et écrire, mais dont personne ne soupçonnera l'existence ?
Mais tout simplement en utilisant une des fonctionnalités de regedit bien sur ! (Certains diront que c'est un bug, mais ce sont des mauvaises langues).

Il faut savoir que l'immense majorité des utilisateurs qui vont chercher quelquechose dans la registry vont utiliser regedit. Or pour ce programme, quand le nom d'une valeur fait plus de 255 caracteres, il considère qu'on est a la fin de la clé, et passe a la clé suivante.

Il suffit donc de créer une clé de registre, dans laquelle on met 2-3 valeurs utiles ou bidon, peu importe, le but etant juse d'avoir une clé de registre qui ne soit pas vide. Puis il suffit juste d'ajouter une valeur dont le nom fasse 255 caracteres, et toutes les valeurs crées ensuite dans la clé seront invisibles. Elles seront pourtant tout a fait lisible par le script.

Petit exemple :

Code : Tout sélectionner

$chaine = "1"; on crée une chaine de 1 caractere
For $i = 1 To 255
    $chaine = $chaine & "1" ; et on en rajoute 255 ce qui fait un total de 256 caracteres.
Next

RegWrite("HKLM\SOFTWARE\test", "Nom Appli", "REG_SZ", "mon appli a moi que j'ai faite") ; on crée une valeur 'utile'
RegWrite("HKLM\SOFTWARE\test", "Version", "REG_SZ", "1.2") ; et meme 2
RegWrite("HKLM\SOFTWARE\test", "Release", "REG_SZ", "2 Final") ; allez soyons fous, faisons en une 3eme
RegWrite("HKLM\SOFTWARE\test", "LicenceCode", "REG_SZ", "{BF58665A-TS988-7669eAF-pQ}") ; et là on crée une pseudo clé de licence
RegWrite("HKLM\SOFTWARE\test", $chaine, "REG_SZ", "Là je suis caché") ; a partir de là les valeurs crées dansla clé seront cachées
RegWrite("HKLM\SOFTWARE\test", "Valeur cachée 2", "REG_SZ", "là aussi")
RegWrite("HKLM\SOFTWARE\test", "Valeur cachée 3", "REG_SZ", "et là encore")

MsgBox(0, "Vérification", "explorez la base de registre et allez voir le contenu de HKLM\SOFTWARE\Test") ; pour vérifier
Run(@WindowsDir & "\regedit.exe") ; on regarde avec regedit

Sleep(5000)

$msg = "et pourtant dans HKLM\SOFTWARE\test, il y a aussi les valeurs suivantes :" & @CRLF _ ; et on compare avec ce que le programme est capable d'aller chercher
         & "[La chaine de  256 caracteres] = " & RegRead("HKLM\SOFTWARE\test", $chaine) & @CRLF _
         & "Valeur cachée 2                = " & RegRead("HKLM\SOFTWARE\test", "Valeur cachée 2") & @CRLF _
         & "Valeur cachée 3                = " & RegRead("HKLM\SOFTWARE\test", "Valeur cachée 3") & @CRLF

MsgBox(0, "clé cachée", $msg) ; étonnant non ?
Le hic c'est qu'un utilisateur un peu malin qui ouvre une ligne de commande et qui fait un "reg query HKLM\software\test" vera tout de suite la liste des clés cachées, et leur contenu.

il faudrait donc faire en sorte que les clés soient dissimulées, même là.
Et bien ma foi on va en plus exploiter une fonctionalité de la commande reg.
Puisqu'elle présente le contenu des clés selon un format précis ([4 espaces][tab][le nom de la valeur][tab][type de valeur][tab][contenu de la valeur]) on va ruser et lui faire afficher ce qu'il afficherait si on avait des clés qui existent :

Code : Tout sélectionner

$chaine = "ValeurPipo1  REG_SZ  Une valeur bidon."&@CRLF; on crée une chaine de 256 caractere qui resemble a ce qu'afficherait la commande reg sous dos
$chaine = $chaine & "    ValeurPipo2    REG_SZ  valeur bidon2."&@CRLF
$chaine = $chaine & "    ValeurPipo3    REG_SZ  Encore une 'tite valeur bidon"&@CRLF
$chaine = $chaine & "    ValeurPipo4    REG_SZ  Et encore une valeur bidon"&@CRLF
$chaine = $chaine & "    ValeurPipo5    REG_SZ  On rajoute encore une valeur bidon"&@CRLF
$chaine = $chaine & "    ValeurPipo6"

$chaine2 = "ValeurPipu1 REG_SZ  Une valeur bidon."&@CRLF; on crée une 2eme chaine de 256 caractere qui resemble a ce qu'afficherait la commande reg sous dos
$chaine2 = $chaine2 & "    ValeurPipu2  REG_SZ  valeur bidon2."&@CRLF
$chaine2 = $chaine2 & "    ValeurPipu3  REG_SZ  Encore une 'tite valeur bidon"&@CRLF
$chaine2 = $chaine2 & "    ValeurPipu4  REG_SZ  Et encore une valeur bidon"&@CRLF
$chaine2 = $chaine2 & "    ValeurPipu5  REG_SZ  On rajoute encore une valeur bidon"&@CRLF
$chaine2 = $chaine2 & "    ValeurPipu6"

RegWrite("HKLM\SOFTWARE\test", "Nom Appli", "REG_SZ", "mon appli a moi que j'ai faite") ; on crée une valeur 'utile'
RegWrite("HKLM\SOFTWARE\test", "Version", "REG_SZ", "1.2") ; et meme 2
RegWrite("HKLM\SOFTWARE\test", "Release", "REG_SZ", "2 Final") ; allez soyons fous, faisons en une 3eme
RegWrite("HKLM\SOFTWARE\test", "LicenceCode", "REG_SZ", "{BF58665A-TS988-7669eAF-pQ}") ; et là on crée une pseudo clé de licence
RegWrite("HKLM\SOFTWARE\test", $chaine, "REG_SZ", "La je suis cache") ; a partir de là les valeurs crées dans la clé seront cachées
RegWrite("HKLM\SOFTWARE\test", $chaine2, "REG_SZ", "La aussi je suis cache") ; une 2eme valeur cachée

MsgBox(0, "Vérification", "explorez la base de registre et allez voir le contenu de HKLM\SOFTWARE\Test") ; pour vérifier
Run(@WindowsDir & "\regedit.exe") ; on regarde avec regedit
$file=FileOpen(@TempDir&"\reg.bat",1)
FileWrite($file,@SystemDir & "\reg.exe query HKLM\SOFTWARE\test >"&@TempDir&"\reg.log"&@CRLF) ; on regarde avec reg query
FileWrite($file,"type "&@TempDir&"\reg.log"&@CRLF)
FileWrite($file,"pause"&@CRLF)
FileClose($file)
RunWait(@TempDir&"\reg.bat")
FileDelete(@TempDir&"\reg.bat")

$msg = "et pourtant dans HKLM\SOFTWARE\test, il y a aussi les valeurs suivantes :" & @CRLF _ ; et on compare avec ce que le programme est capable d'aller chercher
         & "[La 1° chaine de  256 caracteres] = " & RegRead("HKLM\SOFTWARE\test", $chaine) & @CRLF _
         & "[La 2° chaine de  256 caracteres] = " & RegRead("HKLM\SOFTWARE\test", $chaine2)
MsgBox(0, "clé cachée", $msg) ; étonnant non ?
Du coup un 'reg query' renvoie une liste de valeurs qui n'existent pas. Les infos peuvent etre codées dedans (en utilisant les noms ou les contenus des pseudo valeurs). Le gros avantage c'est que même si l'utilisateur éssaye de modifier ce qui lui semble etre des valeurs, il ne tombera sur rien puisque il s'agit tout le long du nom des 2 valeurs 'cachées'
Si vis pacem para bellum

Ron
Niveau 1
Niveau 1
Messages : 3
Enregistré le : lun. 08 oct. 2007 14:15
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#2

Message par Ron » lun. 17 janv. 2011 17:39

Il est toujours possible d'afficher la liste des valeurs d'une clé de registre avec la fonction RegEnumVal ( "keyname", instance ) d'AutoIt !

Avatar du membre
zeshrek
Modérateur
Modérateur
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#3

Message par zeshrek » lun. 17 janv. 2011 19:26

Tout a fait, mais n'oublions pas que là on se place dans le cas du développeur qui veut diffuser son script compilé en exe, parceque personellement je connais assez peu de gens qui vont faire un script pour lire la base de registres... ;)
Si vis pacem para bellum

Alex74
Niveau 4
Niveau 4
Messages : 73
Enregistré le : ven. 15 avr. 2011 14:24
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#4

Message par Alex74 » jeu. 21 avr. 2011 20:42

Je relance juste le sujet car j'ai une petite question. Est-il envisageable niveau sécurité d'y cacher un mot de passe, par exemple celui d'accès au soft ou une clé de chiffrement, jouant sur le fait de l'ignorance de l'endroit ou sont inscrites ces données ?

Merci.

Avatar du membre
zeshrek
Modérateur
Modérateur
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#5

Message par zeshrek » jeu. 21 avr. 2011 21:44

On peut tout faire.
Le seul probleme c'est que si on peut le faire, on peut aussi le défaire...
Si vis pacem para bellum

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2097
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#6

Message par jchd » jeu. 21 avr. 2011 21:44

La sécurité par l'obscurité ? C'est comme se cacher derrière son petit doigt.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
zeshrek
Modérateur
Modérateur
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#7

Message par zeshrek » jeu. 21 avr. 2011 21:55

Et pourtant, c'est exactement ce que veut dire 'cryptographie' ;)
Mais tu as raison, si on fait suffisamment de lumière on arrive a percer les ténèbres les plus profondes.
Si vis pacem para bellum

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2097
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#8

Message par jchd » jeu. 21 avr. 2011 22:09

Crypto ... digitale !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Alex74
Niveau 4
Niveau 4
Messages : 73
Enregistré le : ven. 15 avr. 2011 14:24
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#9

Message par Alex74 » jeu. 21 avr. 2011 22:57

Merci pour vos réponses.

En fait, je cherche plus à protéger contre un éventuel fouineur plutôt qu'un programmeur. Mais je suis d'accord que ce n'est pas l'idéal. En même temps, on peut aussi se dire que tout système à une faille, il faut donc trouver celui qui aura la moins évidente.

Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 09:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [Tuto] Cacher une clé de registre

#10

Message par ZDS » ven. 22 avr. 2011 15:01

zeshrek a écrit :Et pourtant, c'est exactement ce que veut dire 'cryptographie' ;)
Mais tu as raison, si on fait suffisamment de lumière on arrive a percer les ténèbres les plus profondes.
Je veux juste rebondir sur ta réponse à jchd, je pense que tu t'es planté, c'est de la stégano, pas de la crypto ^^

Mais c'est une très bonne idée de noyer l'information. Néanmoins tu utilises une "fonctionnalité" de l'OS (que les esprits chagrins appellent un bug ^^), ou plus exactement une fonctionnalité de Regedit. Car des logiciels comme RegCleaner voient très bien ton "111111111111...1111" et sa suite.
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !

Répondre