我现在在使用 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 个实际实现:超级用户