不久前,我扔掉了一台 Windows XP 机器(主板坏了)。我保留了硬盘和 XP 安装介质。
问题是许可证密钥在机器上的标签上 - 哎呀!原始制造商已经破产(Evesham),我怀疑微软也帮不上什么忙。
有没有简单的方法可以从硬盘中获取许可证密钥?我是否可以找到包含注册表数据的文件并使用十六进制编辑器获取密钥?
我确实需要一个备用的 XP 密钥以便在 Windows VM 中使用。
答案1
如果旧机器上有标签,那么很可能是 OEM 许可证。
OEM 许可证不能合法地从一台计算机转移到另一台计算机。计算机死机时,它们也会失效。
但是,回答你的问题......
加载旧的注册表配置单元在新电脑上找到 XP 密钥.——编辑确保您打开第一个指南中提到的 SOFTWARE 配置单元而不是 SYSTEM,然后在第二个指南中打开这个刚刚打开的离线配置单元。
答案2
显然Nirsoft 的 ProduKey可以这样做:
produkey.exe /windir [Windows Directory]
从同一台计算机上的另一个操作系统加载产品密钥信息。[Windows 目录] 指定 Windows 安装的基本文件夹,例如:c:\windows、c:\winnt 此功能仅支持 Windows 2000/XP/2003/2008/Vista/7。
如果这不起作用,你必须通过搜索手动从注册表文件中挖掘它
C:\WINDOWS\system32\config\软件对于注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId
我认为使用十六进制编辑器。
该密钥的字节 52-66(0x34 - 0x42)包含 15 字节的数字。
在十六进制中,它是一个 30 位数字:A2 23 51 D0 2A 38 5D 22 C4 41 6B 87 43 C1 00
二进制中,一个 120 位数字:10100010 00100011 ... 11000001 00000000
转换为基数 24:751AA001EHCCLAB3JH8KDIGAG
映射到 Microsoft 自定义的 base24 字母表“BCDFGHJKMPQRTVWXY2346789”并且每 5 个字符有一个连字符:
KHCQQ-BBCW2-TT7QR-F42M6-V3YQY
我这样做大约 4 年前,所以我真的希望 ProduKey 能够起作用。
答案3
快捷键查找器- · 查看 Windows XP CD 密钥 · 更改 Windows XP CD 密钥 · 查看 Windows Vista 32 位版本 CD 密钥 · 查看 MS Office 2007 CD 密钥 · 查看/更改 XP 密钥 · 查看/更改 MS office 密钥 · 查看 Win98 密钥 · 查看 Win2000 密钥 · 查看 .Net 密钥 · 查看 Windows2003 密钥
魔法果冻豆钥匙查找器适用于 Windows 95、98、ME、2000、XP、Vista、Server 2003、Server 2008、Office XP、Office 2003 和 Office 2007 系列产品。
在你这样做的同时,备份你的 XP 激活文件,据我所知,最新的 WinKeyFinder 有这个选项,如果没有,这里有一个教程。
答案4
如果您能够从注册表值中的位置 (52-66) 提取 15 个字节0x34
作为0x52
十六DigitalProductId
进制字符串,则可以使用以下 Python(Python 3)脚本将这些字节转换为产品密钥:
import sys
def eprint(s, *args, **kwargs):
sys.stderr.write(s.format(*args, **kwargs) + '\n')
class KeyConv(object):
_alphabet = 'BCDFGHJKMPQRTVWXY2346789'
def __init__(self, val, verbose = False):
self._val = val
self._verbose = verbose
@classmethod
def _int_to_indices(cls, val):
while (val > 0):
yield (val % len(cls._alphabet))
val = val // len(cls._alphabet)
@property
def key(self):
a_idx = list(self._int_to_indices(self._val))
s_key = ''
for i in range(0, (25 - len(a_idx))):
s_key = s_key + self._alphabet[0]
for idx in reversed(a_idx):
s_key = s_key + self._alphabet[idx]
if len(s_key) != 25:
if self._verbose:
eprint('Invalid Product Key length: {} ({}) from 0x{:X}'.format(len(s_key), s_key, self._val))
s_key = s_key[-25:]
chunks_key = (s_key[(5 * pos):((5 * pos) + 5)] for pos in range(0, 5))
return '-'.join(chunks_key)
@classmethod
def from_hex_string(cls, shex, *args, **kwargs):
return cls(int(shex, 16), *args, **kwargs)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description="""Decode a Windows Registry value to the corresponding Product Key""")
parser.add_argument(dest='hexstring', help="""The hex string to decode (from the Registry)""", metavar='STRING')
parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help="""Output more information about conversion""")
args = parser.parse_args()
k = KeyConv.from_hex_string(''.join(args.hexstring.split()).replace(',', '').replace('\\', ''), args.verbose)
print(k.key)
示例运行:
> python3 key-conv.py -v "A2 23 51 D0 2A 38 5D 22 C4 41 6B 87 43 C1 00"
Invalid Product Key length: 27 (CDKHCQQBBCW2TT7QRF42M6V3YQY) from 0xA22351D02A385D22C4416B8743C100
KHCQQ-BBCW2-TT7QR-F42M6-V3YQY
您可以在另一个答案中看到有关在何处找到DigitalProductId
值的详细信息,但本质上,查看注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
如果您无法访问机器的接口,但可以访问文件系统,请在此处找到注册表配置单元:
%WinDir%\system32\config\software
如果您在提取数据时遇到问题,您可以导出密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
,然后打开生成的.reg
文件。如果我想扩展脚本,我可以添加注册表或.reg
文件提取例程。