메인 보드에서 Windows 8 제품 키 검색


13

새 랩톱에는 Windows 8이 사전 설치되어 있습니다. 순진하게도 하드 드라이브를 포맷하고 기존의 우분투를 설치했습니다. 이제 이중 부팅을 위해 Windows 8을 다시 설치하고 싶지만 DVD가없고 ISO를 다운로드하려면 제품 키가 필요합니다. 그 열쇠는 더 이상 랩톱 뒷면이 아니라 메인 보드 어딘가에 있습니다.

Ubuntu를 사용하여 메인 보드에서 제품 키를 복구 할 수있는 방법이 있습니까?

답변:


16

일반적으로 OEM 제조업체는 ROM에 전자적으로 키를 사전로드했습니다. Windows가이를 식별하고 자동으로 설치를 활성화합니다. 따라서 일반적으로이 코드를 알 필요가 없습니다. 그러나 다음을 사용 하여이 흔적을 볼 수 있습니다

sudo dmidecode

OEM-specific Type암호화 / 암호화 되어 s로 나열되어 있을 수 있습니다. HP 및 Dell과 같은 주요 OEM이이를 사용합니다. 자세한 내용은 Windows 웹 사이트에 문의하십시오. 여기가 잘못된 곳입니다. 내가 기억하는 유일한 세부 사항은 OEM 버전의 Windows 설치 디스크 (즉, 비 소매)가 필요하다는 것입니다.


과거에는 Lenovo Thinkpad에서 dmidecode를 사용한 것을 기억하지만이 Lenovo Ideapad에서는 라이센스 키가 어디에도없는 것 같습니다. 결국 나는 /sys/firmware/acpi/tables/MSDM아래의 다른 답변에서 Chuck R이 언급 한대로 그것을 발견했습니다 .
Luc

24

많은 출력을 살펴볼 필요가없는 다른 방법은 다음과 같습니다.

sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echo

acpidump는 테이블을 덤프하지만 (기본값은 16 진 덤프 형식) -b 옵션은 원시 데이터를 출력하도록 지시합니다. 테이블의 마지막 부분 만 필요하므로 출력을 dd로 파이프하지만 불필요한 정크는 건너 뜁니다. 마지막으로 끝에 에코를 추가하여 터미널 친화적 = D

acpidump -t MSDM 잘 작동하지만 키가 여러 줄로 나뉘어 복사하기가 어렵습니다.


Lekensteyn 덕분에 업데이트 :

acpidumpUbuntu와 함께 제공되는 새 버전은 위에서 설명한 것과 다르게 작동합니다. -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했고 나는 풀 키를 꺼냈다.
앤드류 C

당신은 맞습니다, 죄송합니다. 내 답변을 업데이트합니다.
척 R

1
-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
Lekensteyn

@Lekensteyn 나는 최근에 MS와 전화를 할 때도 나타났습니다. -b 옵션을 사용하면 어떤 이유로 인해 파일에 충돌하는 것이 기본값입니다. 파이프에 더 이상 데이터가 없을 때 파이프가 파괴되었다고 플래그를 지정할 수있는 방법이 있는지 궁금합니다. 첫 번째 명령은 저에게 효과적이지 않았지만 두 번째 명령은 괜찮 았습니다. 포함하도록 내 답변을 업데이트하겠습니다 =)
Chuck R

1
Ubuntu 16.04 LTS에 대해 업데이트 된 버전을 사용했습니다. "sudo tail -c + 57 / sys / firmware / acpi / tables / MSDM"Samsung 노트북에서 Windows 키를 얻었는지 확인할 수 있습니다 =)
Valross.nu

10
 sudo tail -c+57 /sys/firmware/acpi/tables/MSDM

MSI 랩톱에서 OEM Windows 8의 제품 키를 받았습니다.


3

위의 코드가 효과가 없거나 키로 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

0

그래서 나는 여기에 다른 답변을 보았고 차임 할 필요가있었습니다.

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)을 사용하기위한 옵션을 찾지 못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.