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


13

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

Чи є можливість відновити ключ продукту з материнської плати за допомогою Ubuntu?

Відповіді:


16

Зазвичай виробники OEM виробляють ключ в електронному вигляді на ROM. Windows визначить це і автоматично активує вашу установку. Тому зазвичай не потрібно знати цей код. Однак ви можете побачити деякий слід цього використання

sudo dmidecode

вказані як OEM-specific Types, закодовані / зашифровані, які можуть містити його. Для цього використовують великі виробники оригіналу, такі як HP та Dell. За додатковою інформацією зверніться до веб-сайтів Windows; це неправильне місце. Єдина пам'ятаю мені деталь - це те, що потрібна версія OEM інсталяційного диска Windows (тобто не роздрібної торгівлі).


Я пам’ятаю, як раніше використовував dmidecode на Lenovo Thinkpad, але здається, що на цьому Lenovo Ideapad він ніде не містить ліцензійного ключа. Врешті-решт я знайшов це, /sys/firmware/acpi/tables/MSDMяк згадував Чак Р в іншій відповіді нижче.
Люк

24

Ще один спосіб, який не потребує перегляду тонни продукції, це:

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 у VM за допомогою власного ключа продукту, але він автоматично відключився, сказавши, що використовується ключ продукту. Отже, це мало корисного у всій реальності. Оскільки ключі Win8 OEM розроблені так, щоб вони були прив’язані до конкретного комп'ютера, ви потрапите в цегляну стіну, якщо попросите Microsoft скасувати реєстрацію ключа, щоб ви могли використовувати його в VM, не кажучи вже про інший комп'ютер.

Єдиний спосіб, яким ви могли скористатися ключем, це якщо ви ніколи не завантажувалися в Win8 для початку або не були підключені до мережі до цього часу. Тим не менш, якщо вашому VM / новому комп'ютеру буде дозволено підключатися до мережі, він автоматично зареєструє ключ, що зробить вашу фактичну установку непридатною.


Просто намагався це випробувати, і команда вище відрізала одного з символів. Я використав, sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echoі я дістав повний ключ.
Ендрю С

Ви маєте рацію, вибачте за це. Оновлення моєї відповіді.
Чак Р

1
Цей -bпараметр специфічний для acpidumpінструменту, що входить до дерева ядра. Новіші версії Ubuntu поставляються з іншим acpidumpінструментом (від iasl), який має різні варіанти. Я не міг перевірити цю команду, але вона повинна працювати: sudo acpidump -n HPET | tail -n+2 | xxd -r | head -c+57. Альтернативний метод:sudo tail -c+57 /sys/firmware/acpi/tables/MSDM
Лекенштейн

@Lekensteyn Я це помітив останнім часом, коли я спілкувався по телефону з MS. Якщо ви працюєте з опцією -b, вона з якихось причин за замовчуванням наштовхується на файл. Цікаво, чи є спосіб позначити, що труба буде зруйнована, коли на ній не залишиться більше даних ... Хоча інша тема ще на інший день. Ваша перша команда не працювала для мене, проте друга була просто чудова. Я оновлю свою відповідь, щоб включити її =)
Чак R

1
Використовується оновлена ​​версія для Ubuntu 16.04 LTS: "sudo tail -c + 57 / sys / firmware / acpi / table / MSDM" Можу підтвердити, що я отримав свій ключ Windows від ноутбука Samsung просто нормально =)
Valross.nu

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

Це отримало мені ключ продукту мого OEM Windows 8 на ноутбуці MSI.


3

Ви можете таким чином використовувати цей код, який працює добре, якщо вищезгадані не працюють для вас або ви просто хочете бачити шістнадцятковий вихід з вашим ключем. Це схоже на благословення шістнадцяткового бінарного редактора. У 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

0

тому я побачив інші відповіді тут, і мені потрібно було задзвонити. Знайдено

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 є старшим алгоритмом (<win8) для декодування ключа. Я не знайшов варіанту використання нового алгоритму (> win7).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.