Windows 8 Ürün Anahtarını anakarttan alma


13

Yeni dizüstü bilgisayarım Windows 8 ile önceden yüklenmiş olarak geldi. Saf bir şekilde, sabit sürücüyü biçimlendirdim ve eski Ubuntu'yu kurdum. Şimdi çift önyükleme için Windows 8'i tekrar yüklemek istiyorum, ancak DVD'im yok ve ISO ürününü indirmek için bir ürün anahtarına ihtiyaç duyuyorum. Bu anahtar artık dizüstü bilgisayarın arkasında değil, anakartta bir yerde.

Ubuntu kullanarak ürün anahtarını anakarttan kurtarmanın bir yolu var mı?

Yanıtlar:


16

OEM üreticileri genellikle bir anahtarı bir ROM'a elektronik olarak önceden yüklediler. Windows bunu belirler ve yüklemenizi otomatik olarak etkinleştirir. Yani, genellikle, bu kodu bilmenize gerek yoktur. Ancak, olabilir kullanarak bu bazı iz bakınız

sudo dmidecode

OEM-specific Types olarak kodlanmış, şifrelenmiş / şifrelenmiş olarak, HP ve Dell gibi büyük OEM'ler bunu kullanır. Daha fazla ayrıntı için Windows web sitelerinden isteyin; burası yanlış yer. Hatırladığım tek ayrıntı, Windows yükleme diskinin OEM sürümüne (yani perakende olmayan) ihtiyaç duyması.


Geçmişte bir Lenovo Thinkpad'de dmidecode kullandığımı hatırlıyorum, ancak bu Lenovo Ideapad'de lisans anahtarını hiçbir yerde içermediği anlaşılıyor. Sonunda /sys/firmware/acpi/tables/MSDMaşağıdaki diğer cevapta Chuck R tarafından belirtildiği gibi buldum .
Luc

24

Bir ton çıkışa bakmayı gerektirmeyen başka bir yol:

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

acpidump tabloyu döker (hexdump biçiminde varsayılan), ancak -b seçenekleri ham veri çıktısını vermesini söyler. Tablonun sadece son kısmına ihtiyacımız olduğundan, çıktıyı dd'ye borulayın, ancak gereksiz önemsizliği atlayın. Son olarak, terminal dostu = D yapmak için sonuna bir yankı ekleyin

acpidump -t MSDM çalışacak, ancak anahtar birden fazla satırda kırılmış ve kopyalamayı zorlaştırıyor.


Lekensteyn sayesinde güncelleme:

acpidumpUbuntu ile birlikte gönderilen yeni sürümler, yukarıda açıklanandan farklı çalışır. -B bayrağı acpidumpher durumda bir dosyaya yazılmasına neden olur , bu nedenle alternatif bir yöntem komutu kullanmaktır.

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

Meşru bir Windows 8 yükleyicisi ACPI'deki anahtarı otomatik olarak algılamalı ve yerleşik anahtarla yüklemeye devam etmelidir.

Bununla birlikte, Win8'i kendi ürün anahtarımı kullanarak bir VM'ye yüklemeye çalışmak için kullandığım belirtilmelidir, ancak ürün anahtarının kullanımda olduğunu söyleyerek otomatik olarak devre dışı bırakıldı. Yani, tüm gerçeklikte çok az faydası var. Win8 OEM anahtarları belirli bir bilgisayara bağlı olacak şekilde tasarlandığından, Microsoft'un anahtarı başka bir bilgisayarda bırakmadan bir sanal makinede kullanabilmeniz için anahtarın kaydını silmesini isterseniz bir tuğla duvara çarpacaksınız.

Anahtarı kullanabilmenin tek yolu, Win8'e daha önce hiç başlamadıysanız veya bir ağa bağlanmadıysanız. Yine de, VM / yeni bilgisayarınızın ağa bağlanmasına izin verilirse, gerçek kurulumunuzu kullanılamaz hale getiren anahtarı otomatik olarak kaydeder.


Sadece bunu deniyordum ve yukarıdaki komut karakterlerden birini kesti. Kullandım sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echove tam anahtarı aldım.
Andrew C

Haklısın, bunun için üzgünüm. Cevabım güncelleniyor.
Chuck R

1
-bSeçenek özgüdür acpidumpçekirdek ağacının dahil aracı. Yeni Ubuntu sürümleri , farklı seçeneklere sahip farklı bir acpidumparaçla (içinden iasl) gönderilir. Ben bu komutu sınamak edemedi ancak çalışması gerekir: sudo acpidump -n HPET | tail -n+2 | xxd -r | head -c+57. Alternatif yöntem:sudo tail -c+57 /sys/firmware/acpi/tables/MSDM
Lekensteyn

@Lekensteyn Son zamanlarda da MS ile telefonda olduğumu fark ettim. -B seçeneğini kullanırsanız, bir nedenden ötürü varsayılan olarak bir dosyaya çarpmayı varsayılan olarak kullanır. Daha fazla veri kalmadığında bir borunun yok edileceğini işaret etmenin bir yolu olup olmadığını merak ediyorum ... yine de başka bir gün için başka bir konu. İlk komutun benim için işe yaramadı, ancak ikincisi iyiydi. Cevabımı eklemek için güncelleyeceğim =)
Chuck R

1
Ubuntu 16.04 LTS için güncellenmiş sürümü kullanıldı: "sudo tail -c + 57 / sys / firmware / acpi / tables / MSDM" Windows anahtarımı Samsung dizüstü bilgisayarından gayet iyi
aldığımı onaylayabilirim

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

Bu bana MSI dizüstü bilgisayarındaki OEM Windows 8'imin Ürün Anahtarını aldı.


3

Bu yüzden, yukarıdaki kodlar sizin için işe yaramazsa veya yalnızca anahtarınızla onaltılık çıktıyı görmek istiyorsanız, bu kodu da kullanabilirsiniz. Bless hex hex editor'e benzer. Windows'un anahtarları her zamanki HAN50-0L00M-4D31T-CR4ZY biçiminde olacaktır. 5 grupta 5 harf veya rakam.

$ 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şağıdaki komutu çalıştırmak, ürün anahtarını standart Microsoft biçiminde döker.

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

0

burada diğer cevapları gördüm ve içeri girmem gerekiyordu.

strings /sys/firmware/acpi/tables/MSDM

orijinal anahtar hala kullanılıyorsa harika çalışıyor. Ancak ev ek ile gelen bazı sistemler var ve kayıt defterinden geçerli anahtarı almanız gerekir.

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

anahtarı almak için bir algoritma ile çalıştırmamız gerekecek.

Https://github.com/mrpeardotnet/WinProdKeyFinder/blob/master/WinProdKeyFind/KeyDecoder.cs adresinden bazı kodlar buldum

    /// <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;
    }

Ben algoritmayı çözmek ve bash yazacağım. Dmi çıkışı, anahtarın kodunun çözülmesi için eski bir algoritma (<win8) gibi görünüyor. Yeni algoritmayı (> win7) kullanma seçeneği bulamadım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.