Получить ключ продукта Windows 8 с материнской платы

Мой новый ноутбук поставлялся с предустановленной Windows 8. Наивно, как и я, я только отформатировал жесткий диск и установил старый добрый Ubuntu. Теперь я хочу снова установить Windows 8 для двойной загрузки, но у меня нет DVD, и для загрузки ISO требуется ключ продукта. Эта клавиша больше не на задней панели ноутбука, а где-то на материнской плате.

Есть ли способ восстановить ключ продукта с материнской платы с помощью Ubuntu?

14
задан 27 December 2012 в 14:18

5 ответов

Обычно OEM-производители предварительно загружают ключ в ПЗУ в электронном виде. Windows определит это и автоматически активирует вашу установку. Так что, как правило, вам не нужно знать этот код. Однако вы можете увидеть некоторые следы этого, используя

sudo dmidecode

, перечисленные как OEM-специфичные типы , закодированные / зашифрованные, которые могут содержать его. Крупные OEM-производители, такие как HP и Dell, используют это. Спросите на веб-сайтах Windows для получения более подробной информации; это не то место. Единственная деталь, которую я помню, это то, что нужна OEM-версия установочного диска Windows (т.е. не входящая в розничную продажу).

17
ответ дан 27 December 2012 в 14:18

Вы все можете использовать этот код, который также работает, если приведенные выше вам не подходят или вы просто хотите увидеть шестнадцатеричный вывод с вашим ключом. Это похоже на благословенный шестнадцатеричный двоичный редактор. Windows будет иметь свой ключ в обычном формате HAN50-0L00M-4D31T-CR4ZY. 5 букв или цифр в 5 группах.

$ 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|

Выполнение следующей команды приведет к дампу ключа продукта в стандартном формате Microsoft.

sudo hexdump -s 56 -e '"MSDM key: " /29 "%s\n"' /sys/firmware/acpi/tables/MSDM
3
ответ дан 27 December 2012 в 14:18
 sudo tail -c+57 /sys/firmware/acpi/tables/MSDM

Это дало мне ключ продукта моей OEM Windows 8 на MSI ноутбуке.

11
ответ дан 27 December 2012 в 14:18

Другой способ, который не требует просмотра тонны вывода:

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

acpidump выгружает таблицу (по умолчанию в формате hexdump), но - Параметры b указывают ему выводить необработанные данные. Поскольку нам нужна только последняя часть таблицы, направьте вывод в dd, но пропустите ненужный мусор. Наконец, добавьте эхо-сигнал в конце, чтобы сделать его дружественным к терминалу. = D

acpidump -t MSDM тоже будет работать, но ключ разбит на несколько строк, что затрудняет копирование.


Обновить спасибо Lekensteyn:

Новые версии acpidump , поставляемые с Ubuntu, работают иначе, чем описано выше. Флаг -b заставляет acpidump записывать в файл при любых обстоятельствах, поэтому альтернативным методом является использование команды

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

. Законный установщик Windows 8 должен автоматически обнаружить ключ в ACPI и продолжить установку с встроенный ключ.

Следует отметить, однако, что я использовал этот метод, чтобы попытаться установить Win8 на виртуальную машину, используя свой собственный ключ продукта, но он автоматически деактивировался, сообщая, что ключ продукта уже используется. Так что во всей реальности от этого мало пользы. Поскольку OEM-ключи Win8 предназначены для привязки к этому конкретному компьютеру, вы попадете в кирпичную стену, если попросите Microsoft отменить регистрацию ключа, чтобы вы могли использовать его на виртуальной машине, не говоря уже о другом компьютере.

Единственный способ вы Этот ключ можно использовать, если вы никогда не загружались в Win8 с самого начала или не были подключены к сети, когда вы это сделали. Даже в этом случае, если вашей виртуальной машине / новому компьютеру когда-либо будет разрешено подключиться к сети, он автоматически зарегистрирует ключ, что сделает вашу фактическую установку непригодной для использования.

24
ответ дан 27 December 2012 в 14:18

, поэтому я видел другие ответы здесь, и мне нужно было вмешаться. found

strings /sys/firmware/acpi/tables/MSDM

отлично работает, если исходный ключ все еще используется. Однако у меня есть некоторые системы, которые поставляются вместе с домашним дополнением, и вам нужно получить текущий ключ из реестра.

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

тогда нам нужно будет запустить его через алгоритм, чтобы получить ключ.

Я нашел код из 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;
    }

Я собираюсь попробовать расшифровать алгоритм и написать его на bash. Выход dmi кажется более старым алгоритмом ( win7).

0
ответ дан 5 January 2021 в 23:30

Другие вопросы по тегам:

Похожие вопросы: