我可以从 Ubuntu 恢复我的 Windows 产品密钥吗?

我可以从 Ubuntu 恢复我的 Windows 产品密钥吗?

我现在在使用 ubuntu 时遇到困难,需要一些帮助。

因此现在,在 Windows 7 不知何故退出后,我正在从 USB 闪存驱动器运行 ubuntu。

如何在 Ubuntu 中获取位于笔记本电脑硬盘上的 Windows 产品密钥?

答案1

首先恢复你的 Ubuntu,转到恢复模式并运行

sudo apt install --reinstall ubuntu-desktop

这个答案不是我写的,而是托马斯超级用户,请在那里投票,如果你在这里投票,谢谢

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

答案2

因此,如果有人想知道如何确实有效。

本质上你必须获取注册表项的内容

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。对于产品密钥的每个字符
  • 针对我们编码的 ID 中的每个字节进行 0 到 14 的内部循环(反向)
  • 解码过程中的一些位操作和算术

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是评论,将被忽略
  • 字符串只是字符数组。

您可以在以下位置看到使用 C#、PowerShell 和 Python 的 3 个实际实现:超级用户

相关内容