Então, para qualquer um que esteja se perguntando como isso realmente funciona.
Essencialmente você terá que pegar o conteúdo da chave de registro
HKLM\Software\Microsoft\Windows NT\CurrentVersion\DigitalProductId
Este é um chamado REG_BINARY
. Significa que é apenas uma coleção de bytes. Você poderia lançá-los via chntpw
ou copiá-los manualmente.
Vamos ver o que temos a fazer com esses bytes para obter nossa chave de produto com a ajuda de algum pseudo-código .
Depois de ter aqueles em uma Matriz, você precisa extrair o subconjunto de bytes que codificam o ID do produto. Em particular: o intervalo entre 52 e (52 + 14). Isso te dá 15 bytes.
EncodedId = DigitalProductId.Range(52, 52+14)
Este ainda é um monte de bytes, que não se parecem com a chave do produto. Então vamos decodificá-lo.
Para isso, você precisa da coleção de todos os caracteres de uma chave de produto:
Characters = "BCDFGHJKMPQRTVWXY2346789"
Sim, este não é o alfabeto inteiro. Como se constata, uma chave de produto do Windows não usa todos os símbolos alfanuméricos.
Agora vamos fazer a decodificação.
Nós vamos precisar de:
- Uma variável para manter a chave do produto
- Um loop de 0 a 24. Para cada caractere de nossa chave de produto
- Um loop interno entre 0 e 14 (ao contrário) Para cada byte em nosso ID codificado
- Algum pouco fiddeling e arithmatic para o processo de decodificação
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
Finalmente, inserimos o caractere "-" na string nos locais apropriados.
FOR i = 4 TO 1 STEP -1
ProductKey = ProductKey.Insert(i * 5, "-")
LOOP
E terminamos!
... Quase:
PRINT(ProductKey)
Agora!
Recursos do nosso pseudo-código
-
$array.Range($from, $to)
Obter o conteúdo de $array
de $from
para $to
-
$array.Insert($where, $what)
Inserir $what
em $where
-
FOR $var = $start TO $stop [STEP $step]
executa o loop da variável $var
de $start
para $stop
aplicando $step
em cada iteração
-
$a XOR $b
Calcula o exclusivo bit a bit ou os números $a
e $b
-
$a MOD $b
Calcula o restante da divisão de $a
e $b
-
$array[$i]
Pegue apenas o elemento na posição $i
da matriz
-
#bla bla
É um comentário e será ignorado
- As strings são apenas matrizes de caracteres.
Você pode ver duas implementações reais em C # e o PowerShell no Superusuário