Pobierz klucz produktu Windows 8 z płyty głównej

13

Mój nowy laptop został fabrycznie zainstalowany z systemem Windows 8. Naiwnie, tak jak ja, właśnie sformatowałem dysk twardy i zainstalowałem dobrze stary Ubuntu. Teraz chcę ponownie zainstalować system Windows 8 dla podwójnego rozruchu, ale nie mam DVD i pobieram ISO, jeden potrzebuje klucza produktu. Ten klucz nie znajduje się już z tyłu laptopa, ale gdzieś na płycie głównej.

Czy jest jakiś sposób na odzyskanie klucza produktu z płyty głównej za pomocą Ubuntu?

Gregor Weber
źródło

Odpowiedzi:

16

Zazwyczaj producenci OEM wstępnie załadowali klucz elektronicznie na ROM. System Windows rozpozna to i automatycznie aktywuje instalację. Zwykle więc nie musisz znać tego kodu. Jednak może zobaczyć jakiś ślad to za pomocą

sudo dmidecode

wymienione jako OEM-specific Types, zakodowane / zaszyfrowane, które mogą je przechowywać. Korzystają z tego główni producenci OEM, tacy jak HP i Dell. Zapytaj w witrynach Windows o więcej szczegółów; to jest złe miejsce Jedyny szczegół, jaki pamiętam, to to, że potrzebna jest wersja OEM dysku instalacyjnego Windows (tzn. Nie sprzedawana detalicznie).

gertvdijk
źródło
Pamiętam, jak w przeszłości używałem dmidecode na Lenovo Thinkpad, ale wydaje się, że na tym Lenovo Ideapad nigdzie nie zawiera klucza licencyjnego. W końcu znalazłem to, /sys/firmware/acpi/tables/MSDMjak wspomniał Chuck R w innej odpowiedzi poniżej.
Luc
24

Innym sposobem, który nie wymaga przeglądania ton wyjściowych, jest:

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

acpidump zrzuca tabelę (domyślnie w formacie hexdump), ale opcje -b nakazują jej wyprowadzenie surowych danych. Ponieważ potrzebujemy tylko ostatniej części tabeli, potokuj dane wyjściowe do dd, ale pomiń niepotrzebne śmieci. Na koniec dodaj echo na końcu, aby było przyjazne terminalowi = D

acpidump -t MSDM będzie również działać, ale klucz jest podzielony na wiele wierszy, co utrudnia kopiowanie.


Aktualizacja dzięki Lekensteyn:

Nowe wersje acpidumpdostarczane z Ubuntu działają inaczej niż opisano powyżej. Flaga -b powoduje acpidumpzapis do pliku w każdych okolicznościach, więc alternatywną metodą jest użycie polecenia

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

Legalny instalator systemu Windows 8 powinien automatycznie wykryć klucz w interfejsie ACPI i kontynuować instalację za pomocą wbudowanego klucza.

Należy jednak zauważyć, że użyłem tej metody, aby spróbować zainstalować Win8 na maszynie wirtualnej przy użyciu własnego klucza produktu, ale automatycznie się dezaktywował, mówiąc, że klucz produktu był używany. Jest więc mało użyteczny w całej rzeczywistości. Ponieważ klucze OEM Win8 są zaprojektowane tak, aby były powiązane z tym konkretnym komputerem, uderzysz w mur, jeśli poprosisz Microsoft o wyrejestrowanie klucza, abyś mógł używać go na maszynie wirtualnej, a co dopiero na innym komputerze.

Jedynym sposobem na użycie klucza jest to, że nigdy nie uruchamiałeś systemu Win8 na początku lub nie byłeś podłączony do sieci. Mimo to, jeśli twoja maszyna wirtualna / nowy komputer może kiedykolwiek połączyć się z siecią, automatycznie zarejestruje klucz, uniemożliwiając korzystanie z twojej instalacji.

Chuck R.
źródło
Właśnie próbowałem tego, a powyższe polecenie odcięło jedną z postaci. Użyłem sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echoi wyjąłem pełny klucz.
Andrew C
Masz rację, przepraszam za to. Aktualizacja mojej odpowiedzi.
Chuck R
1
-bOpcja jest specyficzna dla acpidumpnarzędzia dołączonego do drzewa jądra. Nowsze wersje Ubuntu są dostarczane z innym acpidumpnarzędziem (od iasl), które mają różne opcje. Nie mogłem przetestować to polecenie, ale to powinno działać: sudo acpidump -n HPET | tail -n+2 | xxd -r | head -c+57. Alternatywna metoda:sudo tail -c+57 /sys/firmware/acpi/tables/MSDM
Lekensteyn
@ Lekensteyn Zauważyłem to też ostatnio, kiedy rozmawiałem przez telefon ze stwardnieniem rozsianym. Jeśli użyjesz opcji -b, z jakiegoś powodu domyślnie nastąpi wpadnięcie do pliku. Zastanawiam się, czy istnieje sposób na oznaczenie, że potok zostanie zniszczony, gdy nie będzie już na nim więcej danych ... to kolejny temat na kolejny dzień. Twoje pierwsze polecenie nie działało dla mnie, ale drugie było w porządku. Zaktualizuję moją odpowiedź, aby ją uwzględnić =)
Chuck R
1
Używane zaktualizowaną wersję Ubuntu 16.04 LTS dla "ogon: sudo -C + 57 / sys / firmware / acpi / Stoły / MSDM" może potwierdzić dostałem klucz Windows z Samsung laptop dobrze =)
Valross.nu
10
 sudo tail -c+57 /sys/firmware/acpi/tables/MSDM

To dało mi klucz produktu mojego OEM Windows 8 na laptopie MSI.

ViliusK
źródło
3

Możesz więc wszyscy użyć tego kodu, który działa również, jeśli powyższe nie działają dla ciebie lub po prostu chcesz zobaczyć wyjście szesnastkowe z kluczem. Jest podobny do błogosławionego edytora binarnego hex. Windows będzie miał swój klucz w zwykłym formacie HAN50-0L00M-4D31T-CR4ZY. 5 liter lub cyfr w 5 grupach.

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

Uruchomienie następującego polecenia spowoduje zrzucenie klucza produktu w standardowym formacie Microsoft.

sudo hexdump -s 56 -e '"MSDM key: " /29 "%s\n"' /sys/firmware/acpi/tables/MSDM
hansooloo
źródło
0

więc widziałem inne odpowiedzi tutaj i musiałem wejść

strings /sys/firmware/acpi/tables/MSDM

działa świetnie, jeśli nadal używany jest oryginalny klucz. Mam jednak kilka systemów, które zostały dostarczone z dodatkiem domowym i musisz uzyskać aktualny klucz z rejestru.

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

następnie będziemy musieli uruchomić go przez algorytm, aby uzyskać klucz.

Znalazłem trochę kodu z 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;
    }

Spróbuję zdekodować algorytm i napisać go bash. Wyjście dmi wydaje się być starszym algorytmem (<win8) do dekodowania klucza. Nie znalazłem opcji użycia nowego algorytmu (> win7).

pingwin
źródło