web-dev-qa-db-ja.com

UbuntuからWindowsプロダクトキーを復元できますか?

現在、ubuntuの使用に苦労していますが、何か助けが必要です。

だから今、Windows 7が何らかの形で去った後、USBフラッシュドライブからubuntuを実行しています。

Ubuntu内からラップトップのハードドライブのどこかにあるWindowsプロダクトキーを取得するにはどうすればよいですか?

33
frugge

最初に recovery mode に移動してUbuntuを回復します

Sudo apt install --reinstall ubuntu-desktop

この答えは私によって書かれたものではなく、 Thomas on Superuser によって書かれています。

Linuxにはchntpwと呼ばれる素晴らしいツールがあります。 Debian/Ubuntuで簡単に入手できます:

Sudo apt install chntpw

関連するレジストリファイルを調べるには、Windowsディスクをマウントして次のように開きます。

chntpw -e /path/to/windisk/Windows/System32/config/software

デコードされたDigitalProductIdを取得するには、次のコマンドを入力します。

dpi \Microsoft\Windows NT\CurrentVersion\DigitalProductId

下からのコメントは言う

関連するレジストリファイルへのパスは/ path/to/windisk/Windows/System32/config/RegBack/SOFTWAREです

38
Mark Kirby

this が実際にどのように機能するのか疑問に思う人には。

基本的に、レジストリキーの内容を取得する必要があります。

HKLM\Software\Microsoft\Windows NT\CurrentVersion\DigitalProductId

これはいわゆるREG_BINARYです。意味は単なるバイトのコレクションです。 chntpw経由でダンプするか、手動でコピーできます。

いくつかの擬似コードを使用してプロダクトキーを取得するために、これらのバイトをどうするかを見てみましょう。

それらを配列に入れたら、製品IDをエンコードするバイトのサブセットを抽出する必要があります。特に、52〜(52 + 14)の範囲。それはあなたに15バイトを与えます。

EncodedId = DigitalProductId.Range(52, 52+14)

これは依然として大量のバイトであり、プロダクトキーとはまったく異なります。それをデコードしましょう。

そのためには、プロダクトキーを作成できるすべての文字のコレクションが必要です。

Characters = "BCDFGHJKMPQRTVWXY2346789"

はい、これはアルファベット全体ではありません。結局のところ、Windowsプロダクトキーは英数字記号のすべてを使用するわけではありません。

それでは、デコードを行いましょう。必要なもの:

  • プロダクトキーを保持する変数
  • 0〜24のループ。プロダクトキーの各文字について
  • 0〜14の内部ループ(逆方向)エンコードされたIDの各バイト
  • デコード処理のための多少の手直しと算術

ProductKey = ""
FOR i = 0 TO 24
    c = 0

    FOR j = 14 TO 0 STEP -1
        # Shift the current contents of c to the left by 1 byte 
        #  and xor it with the next byte of our id
        c = (c * 256) XOR EncodedId[j]

        # Put the result of the divison back into the array
        EncodedId[j] = FLOOR(c / 24)

        # Calculate remainder of c
        c = c MOD 24
    LOOP
    # Take character at position c and prepend it to the ProductKey
    ProductKey = Characters[c] + ProductKey
LOOP

最後に、文字列の適切な場所に「-」文字を挿入します。

FOR i = 4 TO 1 STEP -1
    ProductKey = ProductKey.Insert(i * 5, "-")
LOOP

これで完了です!

...ほぼ:

PRINT(ProductKey)

今!


擬似コードの機能

  • $array.Range($from, $to)$arrayの内容を$fromから$toに取得します
  • $array.Insert($where, $what)$what$whereを挿入
  • FOR $var = $start TO $stop [STEP $step]変数を$varから$startから$stopにループし、各反復で$stepを適用します
  • $a XOR $b計算ビット単位排他的または数値$aおよび$b
  • $a MOD $b$a$bの除算の剰余を計算します
  • $array[$i]配列から$iの位置にある要素のみを取得します
  • #bla blaはコメントであり、無視されます
  • 文字列は単なるchar配列です。

スーパーユーザー で、C#、PowerShell、およびPythonの3つの実際の実装を確認できます。

5
MrPaulch