Recuperar / descriptografar a chave de produto do Windows 7 do Linux

10

Eu acidentalmente desconectei meu disco rígido enquanto ele ainda estava em execução e corrompi minha instalação do Windows 7; Agora estou completamente incapaz de inicializar no Windows. Eu tentei de tudo para tentar reparar a instalação: reparo de inicialização do Windows, chkdsk / r, SFC / scannow, bootrec / rebuildbcd, etc. e sem sorte. Eu quero apenas executar uma nova instalação, mas meu problema é que eu não tenho minha chave de produto do Windows escrita em qualquer lugar, e não consigo usar nenhum script ou utilitário para recuperá-lo do registro porque não consigo inicializar no Windows. / p>

As chaves de produto do Windows 7 são armazenadas, criptografadas, no valor "DigitalProductId" da chave de registro NT \ CurrentVersion de HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows. Eu era capaz de montar a partição corrompida do Windows somente leitura de um live CD do Ubuntu e copiar a seção de registro Windows \ System32 \ config \ SOFTWARE, que contém a chave & valor em questão, para uma unidade flash, mas carregar essa seção no regedit em uma instalação do Windows em funcionamento e tentar usar scripts ou utilitários para descriptografar o valor "DigitalProductId" carregado só retorna a chave do produto da instalação do Windows host, não importa o quão muito mexendo eu tento. Eu tentei entrar em contato com o suporte da Microsoft e eles foram um pouco inúteis. Alguém poderia me guiar ainda mais? Talvez se houver uma maneira diferente de recuperar a chave do produto do Linux?

Se alguém mais familiarizado com scripts / criptografia estivesse disposto a tentar seguir o script de descriptografia para descriptografar a chave do produto manualmente, eu poderia enviar por e-mail o valor exportado "DigitalProductId", a seção de registro SOFTWARE e o script de descriptografia.

    
por sundiata 04.04.2015 / 07:10

3 respostas

19

Existe uma ótima ferramenta disponível para o Linux chamada chntpw . Você pode obtê-lo facilmente no Debian / Ubuntu via:

sudo apt install chntpw

Para examinar o arquivo de registro relevante, monte o disco do Windows e abra-o da seguinte maneira:

chntpw -e /path/to/windisk/Windows/System32/config/software

Agora, para obter o DigitalProductId decodificado, digite este comando:

dpi \Microsoft\Windows NT\CurrentVersion\DigitalProductId
    
por 20.04.2017 / 20:15
3

Para aqueles que não são tímidos para fazer um pouco de codificação.

Encontrei um algoritmo há cerca de 10 anos e o implementei em C # (veja abaixo)

Se você quer apenas executá-lo no Windows

Tomei a liberdade de convertê-lo em um script PowerShell:

$dpid = Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "DigitalProductId"

# Get the range we are interested in
$id = $dpid.DigitalProductId[52..(52+14)]

# Character table
$chars = "BCDFGHJKMPQRTVWXY2346789"

# Variable for the final product key
$pkey = ""

# Calculate the product key
for ($i=0; $i -le 24; $i++) {
    $c = 0

    for($j=14; $j -ge 0; $j--) {
        $c = ($c -shl 8) -bxor $id[$j]

        $id[$j] = [Math]::Floor($c / 24) -band 255

        $c = $c % 24
    }
    $pkey = $chars[$c] + $pkey
}
# Insert some dashes
for($i = 4; $i -gt 0; $i--) {
    $pkey = $pkey.Insert($i * 5, "-")
}
$pkey

Execute isso e você receberá sua chave de produto. (Então não codifique para você depois de tudo)

postagem original

Então este é o código C # real que eu desenterrei e comentei.

public static string ConvertDigitalProductID(string regPath, string searchKey = "DigitalProductID") {
    // Open the sub key i.E.: "Software\Microsoft\Windows NT\CurrentVersion"
    var regkey = Registry.LocalMachine.OpenSubKey(regPath, false);
    // Retreive the value of "DigitalProductId"
    var dpid = (byte[])regkey.GetValue(searchKey);
    // Prepare an array for the relevant parts
    var idpart = new byte[15];

    // Copy the relevant parts of the array
    Array.Copy(dpid, 52, idpart, 0, 15);

    // Prepare the chars that will make up the key
    var charStore = "BCDFGHJKMPQRTVWXY2346789";

    // Prepare a string for the result
    string productkey = "";

    // We need 24 iterations (one for each character)
    for(int i = 0; i < 25; i++) {

        int c = 0;
        // Go through each of the 15 bytes of our dpid
        for(int j = 14; j >= 0; j--) {
            // Shift the current byte to the left and xor in the next byte
            c = (c << 8) ^ idpart[j];

            // Leave the result of the division in the current position
            idpart[j] = (byte)(c / 24);

            // Take the rest of the division forward to the next round
            c %= 24;
        }
        // After each round, add a character from the charStore to our key
        productkey = charStore[c] + productkey;
    }

    // Insert the dashes
    for(int i = 4; i > 0; i--) {
        productkey = productkey.Insert(i * 5, "-");
    }

    return productkey;
}

Você terá que passar Software\Microsoft\Windows NT\CurrentVersion como uma chave, onde encontrará o DigitalProductId

Naquela época, o MS Office Products usava o mesmo algoritmo, portanto, ao fornecer a função com a chave de registro relevante, ele também poderia calcular essas chaves de produto.

Você pode, é claro, refatorar a função para que ela receba uma matriz de bytes como entrada.

Quanto a hoje. Eu apenas testei no meu Windows 10 Machine, e ainda funciona.

    
por 06.09.2017 / 13:30
1

Aqui está uma porta Python da outra resposta (adaptada para o Windows 8.1). A vantagem disso em relação a chntpw é que ele funcionará mesmo com unidades em estado somente leitura.

Requisitos:

pip install python-registry

Código:

#!/usr/bin/env python
import sys
from Registry import Registry
reg = Registry.Registry("/path/to/drive/Windows/System32/config/RegBack/SOFTWARE")
# Uncomment for registry location for Windows 7 and below:
#reg = Registry.Registry("/path/to/drive/Windows/system32/config/software")
key = reg.open("Microsoft\Windows NT\CurrentVersion")
did = bytearray([v.value() for v in key.values() if v.name() == "DigitalProductId"][0])
idpart = did[52:52+15]
charStore = "BCDFGHJKMPQRTVWXY2346789";
productkey = "";
for i in range(25):
  c = 0
  for j in range(14, -1, -1):
    c = (c << 8) ^ idpart[j]
    idpart[j] = c // 24
    c %= 24
  productkey = charStore[c] + productkey
print('-'.join([productkey[i * 5:i * 5 + 5] for i in range(5)]))
    
por 24.09.2018 / 19:40