Page 1 sur 1

[Tuto] Cacher une clé de registre

Posté : lun. 17 janv. 2011 17:09
par zeshrek
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'

Re: [Tuto] Cacher une clé de registre

Posté : lun. 17 janv. 2011 17:39
par Ron
Il est toujours possible d'afficher la liste des valeurs d'une clé de registre avec la fonction RegEnumVal ( "keyname", instance ) d'AutoIt !

Re: [Tuto] Cacher une clé de registre

Posté : lun. 17 janv. 2011 19:26
par zeshrek
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... ;)

Re: [Tuto] Cacher une clé de registre

Posté : jeu. 21 avr. 2011 21:42
par Alex74
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.

Re: [Tuto] Cacher une clé de registre

Posté : jeu. 21 avr. 2011 22:44
par zeshrek
On peut tout faire.
Le seul probleme c'est que si on peut le faire, on peut aussi le défaire...

Re: [Tuto] Cacher une clé de registre

Posté : jeu. 21 avr. 2011 22:44
par jchd
La sécurité par l'obscurité ? C'est comme se cacher derrière son petit doigt.

Re: [Tuto] Cacher une clé de registre

Posté : jeu. 21 avr. 2011 22:55
par zeshrek
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.

Re: [Tuto] Cacher une clé de registre

Posté : jeu. 21 avr. 2011 23:09
par jchd
Crypto ... digitale !

Re: [Tuto] Cacher une clé de registre

Posté : jeu. 21 avr. 2011 23:57
par Alex74
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.

Re: [Tuto] Cacher une clé de registre

Posté : ven. 22 avr. 2011 16:01
par ZDS
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.