답변:
일반적으로 OEM 제조업체는 ROM에 전자적으로 키를 사전로드했습니다. Windows가이를 식별하고 자동으로 설치를 활성화합니다. 따라서 일반적으로이 코드를 알 필요가 없습니다. 그러나 다음을 사용 하여이 흔적을 볼 수 있습니다
sudo dmidecode
OEM-specific Type
암호화 / 암호화 되어 s로 나열되어 있을 수 있습니다. HP 및 Dell과 같은 주요 OEM이이를 사용합니다. 자세한 내용은 Windows 웹 사이트에 문의하십시오. 여기가 잘못된 곳입니다. 내가 기억하는 유일한 세부 사항은 OEM 버전의 Windows 설치 디스크 (즉, 비 소매)가 필요하다는 것입니다.
많은 출력을 살펴볼 필요가없는 다른 방법은 다음과 같습니다.
sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echo
acpidump는 테이블을 덤프하지만 (기본값은 16 진 덤프 형식) -b 옵션은 원시 데이터를 출력하도록 지시합니다. 테이블의 마지막 부분 만 필요하므로 출력을 dd로 파이프하지만 불필요한 정크는 건너 뜁니다. 마지막으로 끝에 에코를 추가하여 터미널 친화적 = D
acpidump -t MSDM
잘 작동하지만 키가 여러 줄로 나뉘어 복사하기가 어렵습니다.
Lekensteyn 덕분에 업데이트 :
acpidump
Ubuntu와 함께 제공되는 새 버전은 위에서 설명한 것과 다르게 작동합니다. -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
했고 나는 풀 키를 꺼냈다.
-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
위의 코드가 효과가 없거나 키로 16 진수 출력을보고 싶다면이 코드를 모두 사용할 수 있습니다. 축복 16 진 이진 편집기와 비슷합니다. 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
그래서 나는 여기에 다른 답변을 보았고 차임 할 필요가있었습니다.
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)을 사용하기위한 옵션을 찾지 못했습니다.
/sys/firmware/acpi/tables/MSDM
아래의 다른 답변에서 Chuck R이 언급 한대로 그것을 발견했습니다 .