Pour ceux qui se demandent comment este fonctionne réellement.
Vous devez essentiellement récupérer le contenu de la clé de registre
HKLM\Software\Microsoft\Windows NT\CurrentVersion\DigitalProductId
Il s'agit d'un soi-disant REG_BINARY
. Il s'agit donc d'une simple collection d'octets. Vous pouvez les vider via chntpw
ou les copier à la main.
Voyons ce que nous devons faire avec ces octets afin d'obtenir notre clé de produit à l'aide de quelques pseudo-code .
Une fois que vous les avez dans un tableau, vous devez extraire le sous-ensemble d'octets qui codent l'identifiant du produit. En particulier : l'intervalle entre 52 et (52 + 14). Cela vous donne 15 octets.
EncodedId = DigitalProductId.Range(52, 52+14)
Il s'agit toujours d'un tas d'octets qui ne ressemblent pas du tout à la clé du produit. Décodons-le.
Pour cela, vous avez besoin de la collection de tous les caractères dont une clé de produit peut être composée :
Characters = "BCDFGHJKMPQRTVWXY2346789"
Oui, ce n'est pas tout l'alphabet. Il s'avère qu'une clé de produit Windows n'utilise pas tous les symboles alphanumériques.
Passons maintenant au décodage. Nous aurons besoin de
- Une variable contenant la clé du produit
- Une boucle de 0 à 24. Pour chaque caractère de notre clé de produit
- Une boucle intérieure sur 0 à 14 (en sens inverse) Pour chaque octet de notre identifiant codé
- Un peu de bricolage et d'arithmétique pour le processus de décodage
ProductKey = ""
FOR i = 0 TO 24
c = 0
FOR j = 14 TO 0 STEP -1
# Shift the current contents of c to the left by 1 byte
# and xor it with the next byte of our id
c = (c * 256) XOR EncodedId[j]
# Put the result of the divison back into the array
EncodedId[j] = FLOOR(c / 24)
# Calculate remainder of c
c = c MOD 24
LOOP
# Take character at position c and prepend it to the ProductKey
ProductKey = Characters[c] + ProductKey
LOOP
Enfin, nous insérons le caractère "-" dans la chaîne aux endroits appropriés.
FOR i = 4 TO 1 STEP -1
ProductKey = ProductKey.Insert(i * 5, "-")
LOOP
Et c'est fini !
... Presque :
PRINT(ProductKey)
Maintenant !
Capacités de notre pseudo-code
-
$array.Range($from, $to)
Obtenir le contenu de $array
de $from
a $to
-
$array.Insert($where, $what)
Insérer $what
à $where
-
FOR $var = $start TO $stop [STEP $step]
boucle la variable $var
de $start
a $stop
appliquant $step
à chaque itération
-
$a XOR $b
Calculer peu judicieux exclusif ou sur les chiffres $a
y $b
-
$a MOD $b
Calculer le reste de la division de $a
y $b
-
$array[$i]
Ne prendre que l'élément situé à la position $i
à partir du tableau
-
#bla bla
Il s'agit d'un commentaire qui sera ignoré
- Les chaînes de caractères sont des tableaux de caractères.
Vous pouvez voir 3 implémentations réelles en C#, PowerShell et Python à l'adresse suivante Super utilisateur