GPO de l’éditeur de registre

Dans certains cas, les GPO ne forcent pas un programme à activer / désactiver certaines fonctionnalités, c’est le programme qui choisit (ou non) de suivre la GPO.

Un exemple concret : l’éditeur de registre…
Son utilisation peut être restreinte via les stratégies du domaine, gpo, clé de registre…
Dans tous les cas, cela se résume à une clé sous : HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System, avec la clé (valeur DWORD) DisableRegistryTools :

  • 0 (ou rien) Registry Editor can be started either in interactive mode or in silent mode.
  • 1 Registry Editor can only be started in silent mode (regedit /s). This is the default behavior in Windows 2000 and in Windows NT 4.0 when the Prevent Access to Registry Editing Tools policy is applied.
  • 2 Registry Editor cannot be started at all. This is the default behavior in Windows XP and Windows Server 2003 when the Prevent Access to Registry Editing Tools policy is applied.

Ces vérifications sont faites au lancement du programme :

.text:01009AED                 call    _GetRegEditMode@0
.text:01009AF2                 cmp     eax, 2
.text:01009AF5                 jnz     short loc_1009B01
.text:01009AF7                 call    _DisplayRegEditDisabled@0
.text:01009AFC                 jmp     loc_1009C23

et dans :

.text:01009B01                 push    eax
.text:01009B02                 call    _ParseCommandLine@4

C’est donc le retour de la fonction GetRegEditMode qui va permettre de déterminer le lancement (ou non) de l’application.
Un retour toujours à 0 serait vraiment un plus ;)

Allons faire un tour dans GetRegEditMode :

.text:01009A68                 call    _RegEdit_QueryValueEx@24 ; RegEdit_QueryValueEx(x,x,x,x,x,x)
.text:01009A6D                 test    eax, eax
.text:01009A6F                 jnz     short loc_1009A92
.text:01009A71                 cmp     [ebp+Type], 4
.text:01009A75                 jnz     short loc_1009A92
.text:01009A77                 cmp     [ebp+cbData], 4
.text:01009A7B                 jnz     short loc_1009A92
.text:01009A7D                 mov     eax, dword ptr [ebp+Data]
.text:01009A80                 sub     eax, edi
.text:01009A82                 jz      short loc_1009A92

Ainsi, si la valeur de la clé est de 0 (ou n’a pas pu être correctement lue), alors nous retournerons 0…
Ce code est suivi d’autres tests pour déterminer si la valeur est de 1, 2 ou plus afin de retourner respectivement 1, 2 ou 0

Remplaçons ce malicieux jz par un jmp bien plus arbitraire… ;)
Ici, cela signifie juste de remplacer un 0x74 par un 0xeb
(pour rappel : http://www.intel.com/products/processor/manuals/)

La philosophie de ce test est restée la même au fil des versions de Windows…

Sans plus tarder, le téléchargement :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *