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 :