メインボードからWindows 8プロダクトキーを取得する


12

私の新しいラップトップにはWindows 8がプリインストールされていました。単純に、ハードドライブをフォーマットし、古いUbuntuをインストールしました。デュアルブート用にWindows 8を再度インストールしたいのですが、DVDがなく、プロダクトキーが必要なISOをダウンロードします。そのキーはラップトップの背面ではなく、メインボードのどこかにあります。

Ubuntuを使用してメインボードからプロダクトキーを回復する方法はありますか?

回答:


16

通常、OEMメーカーは、ROMにキーを電子的にプリロードしています。Windowsはこれを識別し、インストールを自動的にアクティブ化します。そのため、通常、このコードを知る必要はありません。ただし、次のコマンドを使用すると、このトレース表示される場合があります

sudo dmidecode

OEM-specific Types としてリストされ、エンコード/暗号化され、保持される場合があります。HPやDellなどの主要なOEMはこれを使用しています。詳細については、Windows Webサイトで確認してください。これは間違った場所です。私が覚えている唯一の詳細は、WindowsインストールディスクのOEMバージョン(非小売)が必要であることです。


過去にLenovo Thinkpadでdmidecodeを使用したことを覚えていますが、このLenovo Ideapadではライセンスキーがどこにも含まれていないようです。最終的には/sys/firmware/acpi/tables/MSDM、Chuck Rが以下の他の回答で言及したようにそれを見つけました。
リュック

23

大量の出力を調べる必要のない別の方法は次のとおりです。

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

acpidumpはテーブルをダンプします(デフォルトはhexdump形式)が、-bオプションは生データを出力するように指示します。テーブルの最後の部分だけが必要なので、出力をddにパイプしますが、不要なジャンクはスキップします。最後に、端末に優しい= Dにするために最後にエコーを追加します

acpidump -t MSDM 同様に機能しますが、キーは複数行に分割されているため、コピーが困難です。


Lekensteynのおかげで更新:

acpidumpUbuntu に同梱されている新しいバージョンの動作は、上記とは異なります。-bフラグacpidumpを使用すると、すべての状況下でファイルに書き込みが行われるため、代替方法はコマンドを使用することです

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

正規のWindows 8インストーラーはACPIのキーを自動的に検出し、組み込みのキーでインストールを続行する必要があります。

ただし、この方法を使用して、自分のプロダクトキーを使用してVMにWin8をインストールしようとしましたが、プロダクトキーが使用中であると言って自動的に非アクティブ化されたことに注意してください。したがって、すべての現実にはほとんど役に立ちません。Win8 OEMキーはその特定のコンピューターに関連付けられるように設計されているため、Microsoftにキーの登録を解除してVMで使用できるようにすると、別のコンピューターでは使用できなくなります。

キーを使用できる唯一の方法は、Win8で起動したことがないか、最初にネットワークに接続したことがない場合です。それでも、VM /新しいコンピューターがネットワークへの接続を許可されると、キーが自動的に登録され、実際のインストールが使用できなくなります。


これを試してみたところ、上記のコマンドはいずれかのキャラクターをカットしました。私は使用sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echoし、完全なキーを取り出しました。
アンドリューC

あなたは正しい、それについてすみません。私の答えを更新します。
チャックR

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 14

@Lekensteyn最近、私もMSと電話をしていたときに気づきました。-bオプションを使用すると、何らかの理由でデフォルトでファイルにバンプするようになります。パイプにデータが残っていないときにパイプを破棄するというフラグを立てる方法があるのだろうか?最初のコマンドは機能しませんでしたが、2番目のコマンドは問題ありませんでした。回答を更新して、それを含めます=)
チャックR 14

1
Ubuntu 16.04 LTSの更新バージョンを使用しました: "sudo tail -c + 57 / sys / firmware / acpi / tables / MSDM" Samsungキーを使用してWindowsキーを取得できたことを確認できます=)
Valross.nu

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

これにより、MSIラップトップ上のOEM Windows 8のプロダクトキーが取得されました。


3

上記のコードが機能しない場合や、キーを使用して16進出力を表示するだけの場合にも、このコードを使用できます。bless hex binary editorに似ています。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)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.