Lấy khóa sản phẩm Windows 8 từ bo mạch chính


12

Máy tính xách tay mới của tôi đã được cài đặt sẵn Windows 8. Chắc chắn, như tôi, tôi chỉ định dạng ổ cứng và cài đặt Ubuntu cũ tốt. Bây giờ tôi muốn cài đặt lại Windows 8 để khởi động kép, nhưng tôi không có DVD và tải xuống ISO cần một khóa sản phẩm. Phím đó không nằm ở mặt sau của máy tính xách tay nữa mà ở đâu đó trên bo mạch chính.

Có cách nào để khôi phục mã khóa sản phẩm từ bo mạch chính bằng Ubuntu không?

Câu trả lời:


16

Thông thường, các nhà sản xuất OEM đã tải trước khóa điện tử trên ROM. Windows sẽ xác định điều này và tự động kích hoạt cài đặt của bạn. Vì vậy, thông thường, bạn không cần phải biết mã này. Tuy nhiên, bạn có thể thấy một số dấu vết của việc này bằng cách sử dụng

sudo dmidecode

được liệt kê là OEM-specific Types, được mã hóa / mã hóa, có thể giữ nó. Các OEM lớn như HP và Dell sử dụng điều này. Hỏi trên các trang web Windows để biết thêm chi tiết; đây là chỗ sai Chi tiết duy nhất tôi nhớ là người ta cần một phiên bản OEM của đĩa cài đặt Windows (tức là không bán lẻ).


Tôi nhớ rằng đã sử dụng dmidecode trên Lenovo Thinkpad trước đây, nhưng có vẻ như trên Lenovo Ideapad này không có khóa cấp phép ở bất cứ đâu. Cuối cùng, tôi đã tìm thấy nó /sys/firmware/acpi/tables/MSDMnhư được đề cập bởi Chuck R trong câu trả lời khác bên dưới.
Luc

23

Một cách khác không yêu cầu xem qua một tấn đầu ra là:

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

acpidump kết xuất bảng (mặc định ở định dạng hexdump), nhưng các tùy chọn -b bảo nó xuất dữ liệu thô. Vì chúng ta chỉ cần phần cuối của bảng, chuyển đầu ra thành dd, nhưng bỏ qua các thứ không cần thiết. Cuối cùng, thêm một tiếng vang ở cuối để làm cho nó thân thiện với thiết bị đầu cuối = D

acpidump -t MSDM cũng sẽ hoạt động tốt, nhưng khóa bị hỏng trên nhiều dòng, khiến cho việc sao chép khó khăn.


Cập nhật nhờ Lekensteyn:

Các phiên bản mới acpidumpđược vận chuyển với Ubuntu hoạt động khác với mô tả ở trên. Cờ -b gây ra acpidumpviệc ghi vào tệp trong mọi trường hợp, vì vậy một phương pháp khác là sử dụng lệnh

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

Trình cài đặt Windows 8 hợp pháp sẽ tự động phát hiện khóa trong ACPI và tiếp tục cài đặt với khóa tích hợp.

Tuy nhiên, cần lưu ý rằng tôi đã sử dụng phương pháp này để thử cài đặt Win8 trong máy ảo bằng khóa sản phẩm của riêng tôi, nhưng nó tự động hủy kích hoạt nói rằng khóa sản phẩm đang được sử dụng. Vì vậy, nó ít được sử dụng trong thực tế. Vì các khóa OEM của Win8 được thiết kế để gắn với máy tính cụ thể đó, bạn sẽ gặp phải một bức tường gạch nếu bạn yêu cầu Microsoft hủy đăng ký khóa để bạn có thể sử dụng nó trong VM, chứ đừng nói đến một máy tính khác.

Cách duy nhất bạn có thể sử dụng khóa là nếu bạn chưa từng khởi động vào Win8 để bắt đầu hoặc không kết nối với mạng khi bạn thực hiện. Mặc dù vậy, nếu VM / máy tính mới của bạn đã từng được phép kết nối với mạng, nó sẽ tự động đăng ký khóa làm cho cài đặt thực tế của bạn không thể sử dụng được.


Chỉ cần thử điều này, và lệnh trên đã cắt đứt một trong các nhân vật. Tôi đã sử dụng sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echovà tôi đã nhận được đầy đủ chìa khóa.
Andrew C

Bạn đã đúng, xin lỗi về điều đó. Cập nhật câu trả lời của tôi.
Chuck R

1
Các -btùy chọn là cụ thể cho các acpidumpcông cụ kèm với cây hạt nhân. Các phiên bản Ubuntu mới hơn xuất xưởng với một acpidumpcông cụ khác (từ iasl) có các tùy chọn khác nhau. Tôi không thể kiểm tra lệnh này, nhưng nó sẽ hoạt động : sudo acpidump -n HPET | tail -n+2 | xxd -r | head -c+57. Phương pháp thay thế:sudo tail -c+57 /sys/firmware/acpi/tables/MSDM
Lekensteyn

@Lekensteyn Tôi nhận thấy rằng gần đây cũng vậy khi tôi nói chuyện điện thoại với MS. Nếu bạn thực hiện tùy chọn -b, nó sẽ mặc định chuyển sang một tệp ngay bây giờ vì một số lý do. Tôi tự hỏi liệu có cách nào để gắn cờ rằng một đường ống bị phá hủy khi không còn dữ liệu nào nữa không ... một chủ đề khác cho một ngày khác. Lệnh đầu tiên của bạn không hiệu quả với tôi, tuy nhiên lệnh thứ hai vẫn ổn. Tôi sẽ cập nhật câu trả lời của mình để đưa nó vào =)
Chuck R

1
Sử dụng phiên bản cập nhật cho Ubuntu 16.04 LTS: "sudo đuôi -c + 57 / sys / firmware / acpi / bảng / MSDM" Có thể khẳng định tôi có phím Windows của tôi từ một máy tính xách tay Samsung tốt =)
Valross.nu

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

Điều này đã cho tôi Mã khóa sản phẩm của OEM Windows 8 trên máy tính xách tay MSI.


3

Tất cả các bạn đều có thể sử dụng mã này hoạt động tốt nếu các mã ở trên không hoạt động cho bạn hoặc bạn chỉ muốn xem đầu ra hex bằng khóa của mình. Nó tương tự như chúc phúc cho trình soạn thảo nhị phân hex. Windows sẽ có khóa của họ ở định dạng thông thường HAN50-0L00M-4D31T-CR4ZY. 5 chữ cái hoặc số trong 5 nhóm.

$ 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|

Chạy lệnh sau sẽ kết xuất khóa sản phẩm theo định dạng Microsoft tiêu chuẩn của nó.

sudo hexdump -s 56 -e '"MSDM key: " /29 "%s\n"' /sys/firmware/acpi/tables/MSDM

0

Vì vậy, tôi thấy các câu trả lời khác ở đây và cần phải bấm chuông. Tìm thấy

strings /sys/firmware/acpi/tables/MSDM

hoạt động tuyệt vời nếu khóa gốc là những gì vẫn đang được sử dụng. Tuy nhiên tôi có một số hệ thống đi kèm với bổ sung nhà và bạn cần lấy khóa hiện tại từ sổ đăng ký.

winmount=/mnt
echo "hex \\Microsoft\\Windows NT\\CurrentVersion\\DigitalProductId\nq\nq" | chntpw -e ${winmount}/Windows/System32/config/SOFTWARE

sau đó chúng ta sẽ cần chạy nó thông qua một thuật toán để lấy khóa.

Tôi đã tìm thấy một số mã từ https://github.com/mrpeardotnet/WinProdKey Downloader/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;
    }

Tôi sẽ thử giải mã thuật toán và viết nó trong bash. Đầu ra dmi dường như là thuật toán cũ hơn (<win8) để giải mã khóa. Tôi chưa tìm thấy tùy chọn sử dụng thuật toán mới (> win7).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.