Recuperar chave do produto Windows 8 da placa principal

12

Meu novo laptop veio pré-instalado com o Windows 8. Ingenuamente, como eu sou, eu apenas formatei o disco rígido e instalei o Ubuntu antigo e bem. Agora, quero instalar o Windows 8 para inicialização dupla novamente, mas não tenho DVD e faço o download do ISO necessário de uma chave de produto. Essa chave não está mais na parte de trás do laptop, mas em algum lugar na placa principal.

Existe alguma maneira de recuperar a chave do produto da placa principal usando o Ubuntu?

Gregor Weber
fonte

Respostas:

16

Geralmente, os fabricantes OEM pré-carregam uma chave eletronicamente em uma ROM. O Windows identificará isso e ativará automaticamente sua instalação. Portanto, geralmente, você não precisa conhecer esse código. No entanto, você pode ver alguns traços disso usando

sudo dmidecode

listado como OEM-specific Types, codificado / criptografado, que pode conter. Grandes OEMs como HP e Dell usam isso. Peça nos sites do Windows mais detalhes; este é o lugar errado. O único detalhe que lembro é que é preciso uma versão OEM do disco de instalação do Windows (ou seja, não comercial).

gertvdijk
fonte
Lembro-me de usar o dmidecode em um Lenovo Thinkpad no passado, mas parece que neste Lenovo Ideapad ele não contém a chave de licença em nenhum lugar. Eventualmente, eu o encontrei /sys/firmware/acpi/tables/MSDMcomo mencionado por Chuck R na outra resposta abaixo.
Luc
23

Outra maneira que não exige uma grande quantidade de saída é:

sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echo

O acpidump descarta a tabela (padrão no formato hexdump), mas as opções -b informam para que ele produza os dados brutos. Como precisamos apenas da última parte da tabela, canalize a saída para dd, mas pule o lixo desnecessário. Por fim, adicione um eco no final para torná-lo amigável ao terminal = D

acpidump -t MSDM funcionará também, mas a chave está quebrada em várias linhas, dificultando a cópia.


Atualize graças a Lekensteyn:

Novas versões acpidumpfornecidas com o Ubuntu funcionam de maneira diferente da descrita acima. O sinalizador -b faz acpidumpcom que seja gravado em um arquivo em todas as circunstâncias, portanto, um método alternativo é usar o comando

sudo tail -c+57 /sys/firmware/acpi/tables/MSDM

Um instalador legítimo do Windows 8 deve detectar automaticamente a chave na ACPI e continuar a instalação com a chave interna.

Deve-se notar, no entanto, que eu usei esse método para tentar instalar o Win8 em uma VM usando minha própria chave do produto, mas ele foi desativado automaticamente, dizendo que a chave do produto estava em uso. Então, é de pouca utilidade em toda a realidade. Como as chaves OEM do Win8 foram projetadas para serem vinculadas a esse computador específico, você atingirá uma parede de tijolos se solicitar à Microsoft que cancele o registro da chave para poder usá-la em uma VM e muito menos em outro computador.

A única maneira de usar a chave é se você nunca inicializou no Win8 ou não estava conectado a uma rede quando o fez. Mesmo assim, se sua VM / computador novo tiver permissão para se conectar à rede, ele registrará automaticamente a chave, tornando sua instalação real inutilizável.

Chuck R
fonte
Estava apenas tentando isso, e o comando acima cortou um dos personagens. Eu usei sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echoe peguei a chave completa.
Andrew C
Você está correto, desculpe por isso. Atualizando minha resposta.
Chuck R.
1
A -bopção é específica para a acpidumpferramenta incluída na árvore do kernel. As versões mais recentes do Ubuntu são fornecidas com uma acpidumpferramenta diferente (de iasl) com opções diferentes. Eu não poderia testar este comando, mas deve funcionar: sudo acpidump -n HPET | tail -n+2 | xxd -r | head -c+57. Método alternativo:sudo tail -c+57 /sys/firmware/acpi/tables/MSDM
Lekensteyn 01/07/2014
@Lekensteyn notei isso recentemente também quando estava ao telefone com a MS. Se você usar a opção -b, o padrão será o de passar para um arquivo agora por algum motivo. Gostaria de saber se existe uma maneira de sinalizar que um cano seja destruído quando não houver mais dados nele ... outro tópico para outro dia. Seu primeiro comando não funcionou para mim, no entanto, o segundo foi bom. Eu vou atualizar a minha resposta para incluí-lo =)
Chuck R
1
Usou a versão atualizada do Ubuntu 16.04 LTS: "sudo tail -c + 57 / sys / firmware / acpi / tables / MSDM" Posso confirmar que obtive minha chave do Windows em um laptop Samsung muito bem =)
Valross.nu
9
 sudo tail -c+57 /sys/firmware/acpi/tables/MSDM

Isso me deu a chave do produto do meu OEM Windows 8 no laptop MSI.

ViliusK
fonte
3

Todos vocês podem usar esse código que funciona tão bem se os itens acima não funcionarem para você ou você apenas deseja ver a saída hexadecimal com sua chave. É semelhante a abençoar o editor binário hexadecimal. O Windows terá sua chave no formato usual HAN50-0L00M-4D31T-CR4ZY. 5 letras ou números em 5 grupos.

$ ls /sys/firmware/acpi/tables
$ sudo hd /sys/firmware/acpi/tables/MSDM

00000000  ha ns oo lo oe at es ap  pl le sa uc ef or li fe  |Key in area|
00000010  cu si ca nb ro ha ms am  cu si ca nb ro ha ms am  |In key area|
00000020  it sj us ho wz ir ol lz  it sj us ho wz ir ol lz  |Area in key|
00000000  ha ns oo lo oe at es ap  pl le sa uc ef or li fe  |It is 5 x 5|
00000010  cu si ca nb ro ha ms am  cu si ca nb ro ha ms am  |Key in area|
00000020  it sj us ho wz ir ol lz  it sj us ho wz ir ol lz  |In key area|
00000050  ha ns oo lo ow az he re                           |Area in key|
00000055                                                    |It is 5 x 5|

A execução do comando a seguir fará o dump da chave do produto em seu formato padrão da Microsoft.

sudo hexdump -s 56 -e '"MSDM key: " /29 "%s\n"' /sys/firmware/acpi/tables/MSDM
hansooloo
fonte
0

então eu vi as outras respostas aqui e precisava entrar.

strings /sys/firmware/acpi/tables/MSDM

funciona muito bem se a chave original é o que ainda está sendo usado. No entanto, eu tenho alguns sistemas que acompanham a adição doméstica e você precisa obter a chave atual do registro.

winmount=/mnt
echo "hex \\Microsoft\\Windows NT\\CurrentVersion\\DigitalProductId\nq\nq" | chntpw -e ${winmount}/Windows/System32/config/SOFTWARE

então precisaremos executá-lo através de um algoritmo para obter a chave.

Encontrei algum código em https://github.com/mrpeardotnet/WinProdKeyFinder/blob/master/WinProdKeyFind/KeyDecoder.cs

    /// <summary>
    /// Decodes Windows Product Key from the DigitalProductId. 
    /// This method applies to DigitalProductId from Windows 7 or lower versions of Windows.
    /// </summary>
    /// <param name="digitalProductId">DigitalProductId to decode</param>
    /// <returns>Decoded Windows Product Key as a string</returns>
    private static string DecodeProductKey(byte[] digitalProductId)
    {
        const int keyStartIndex = 52;
        const int keyEndIndex = keyStartIndex + 15;
        var digits = new[]
        {
            'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R',
            'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
        };
        const int decodeLength = 29;
        const int decodeStringLength = 15;
        var decodedChars = new char[decodeLength];
        var hexPid = new ArrayList();
        for (var i = keyStartIndex; i <= keyEndIndex; i++)
        {
            hexPid.Add(digitalProductId[i]);
        }
        for (var i = decodeLength - 1; i >= 0; i--)
        {
            // Every sixth char is a separator.
            if ((i + 1) % 6 == 0)
            {
                decodedChars[i] = '-';
            }
            else
            {
                // Do the actual decoding.
                var digitMapIndex = 0;
                for (var j = decodeStringLength - 1; j >= 0; j--)
                {
                    var byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
                    hexPid[j] = (byte)(byteValue / 24);
                    digitMapIndex = byteValue % 24;
                    decodedChars[i] = digits[digitMapIndex];
                }
            }
        }
        return new string(decodedChars);
    }

    /// <summary>
    /// Decodes Windows Product Key from the DigitalProductId. 
    /// This method applies to DigitalProductId from Windows 8 or newer versions of Windows.
    /// </summary>
    /// <param name="digitalProductId">DigitalProductId to decode</param>
    /// <returns>Decoded Windows Product Key as a string</returns>
    public static string DecodeProductKeyWin8AndUp(byte[] digitalProductId)
    {
        var key = String.Empty;
        const int keyOffset = 52;
        var isWin8 = (byte)((digitalProductId[66] / 6) & 1);
        digitalProductId[66] = (byte)((digitalProductId[66] & 0xf7) | (isWin8 & 2) * 4);

        const string digits = "BCDFGHJKMPQRTVWXY2346789";
        var last = 0;
        for (var i = 24; i >= 0; i--)
        {
            var current = 0;
            for (var j = 14; j >= 0; j--)
            {
                current = current*256;
                current = digitalProductId[j + keyOffset] + current;
                digitalProductId[j + keyOffset] = (byte)(current/24);
                current = current%24;
                last = current;
            }
            key = digits[current] + key;
        }

        var keypart1 = key.Substring(1, last);
        var keypart2 = key.Substring(last + 1, key.Length - (last + 1));
        key = keypart1 + "N" + keypart2;

        for (var i = 5; i < key.Length; i += 6)
        {
            key = key.Insert(i, "-");
        }

        return key;
    }

Vou tentar decodificar o algoritmo e escrevê-lo no bash. A saída dmi parece ser o algoritmo mais antigo (<win8) para decodificar a chave. Não encontrei uma opção para usar o novo algoritmo (> win7).

penguinjeff
fonte