รับรหัสผลิตภัณฑ์ Windows 8 จากเมนบอร์ด


13

แล็ปท็อปเครื่องใหม่ของฉันติดตั้ง Windows 8 ไว้ล่วงหน้าอย่างไร้เดียงสาฉันเพิ่งฟอร์แมตฮาร์ดไดรฟ์และติดตั้ง Ubuntu รุ่นเก่า ตอนนี้ฉันต้องการติดตั้ง Windows 8 สำหรับการบูทคู่อีกครั้ง แต่ฉันไม่มี DVD และทำการดาวน์โหลด ISO จะต้องใช้รหัสผลิตภัณฑ์ รหัสนั้นไม่ได้อยู่ที่ด้านหลังของแล็ปท็อปอีกต่อไป แต่อยู่ที่อื่นบนเมนบอร์ด

มีวิธีการกู้คืนหมายเลขผลิตภัณฑ์จากเมนบอร์ดโดยใช้ Ubuntu หรือไม่?

คำตอบ:


16

โดยปกติผู้ผลิต OEM จะโหลดคีย์ไว้ทางอิเล็กทรอนิกส์ใน ROM Windows จะระบุสิ่งนี้และเปิดใช้งานการติดตั้งของคุณโดยอัตโนมัติ ดังนั้นโดยปกติคุณไม่จำเป็นต้องรู้รหัสนี้ อย่างไรก็ตามคุณอาจเห็นร่องรอยของการใช้นี้

sudo dmidecode

แสดงรายการเป็นOEM-specific Types เข้ารหัส / เข้ารหัสซึ่งอาจเก็บไว้ OEM รายใหญ่เช่น HP และ Dell ใช้สิ่งนี้ สอบถามรายละเอียดเพิ่มเติมได้จากเว็บไซต์ Windows นี่เป็นสถานที่ที่ผิด รายละเอียดเพียงอย่างเดียวที่ฉันจำได้คือต้องการแผ่นดิสก์การติดตั้ง Windows รุ่น OEM (เช่นไม่ใช่แบบขายปลีก)


ฉันจำได้ว่าเคยใช้ dmidecode กับ Lenovo Thinkpad ในอดีต แต่ดูเหมือนว่าใน Lenovo Ideapad นี้มันไม่มีคีย์ใบอนุญาตทุกที่ ในที่สุดฉันก็พบว่ามัน/sys/firmware/acpi/tables/MSDMดังที่ Chuck R กล่าวไว้ในคำตอบอื่น ๆ ด้านล่าง
ลุค

24

อีกวิธีหนึ่งที่ไม่ต้องการตรวจสอบผลลัพธ์เป็นตัน:

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

acpidump ดัมพ์ตาราง (ค่าดีฟอลต์ในรูปแบบ hexdump) แต่อ็อพชัน -b บอกให้ส่งเอาต์พุตข้อมูลดิบ เนื่องจากเราต้องการเฉพาะส่วนสุดท้ายของตารางให้ไพพ์เอาต์พุตเป็น dd แต่ให้ข้ามขยะที่ไม่จำเป็น สุดท้ายให้เพิ่มเสียงสะท้อนที่ส่วนท้ายเพื่อทำให้เป็นมิตรกับเทอร์มินัล = D

acpidump -t MSDM จะใช้งานได้เช่นกัน แต่รหัสถูกตัดผ่านหลายบรรทัดทำให้คัดลอกยาก


อัปเดตต้องขอบคุณ Lekensteyn:

เวอร์ชั่นใหม่ของการacpidumpจัดส่งกับ Ubuntu นั้นแตกต่างจากที่อธิบายไว้ข้างต้น แฟล็ก -b ทำให้acpidumpการเขียนไปยังไฟล์ภายใต้สถานการณ์ทั้งหมดดังนั้นวิธีอื่นคือการใช้คำสั่ง

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

โปรแกรมติดตั้ง Windows 8 ที่ถูกกฎหมายควรตรวจจับคีย์ใน ACPI โดยอัตโนมัติและทำการติดตั้งต่อไปด้วยคีย์ในตัว

อย่างไรก็ตามควรสังเกตว่าฉันใช้วิธีนี้เพื่อพยายามติดตั้ง Win8 ใน VM โดยใช้รหัสผลิตภัณฑ์ของตัวเอง แต่จะปิดการใช้งานโดยอัตโนมัติโดยบอกว่าหมายเลขผลิตภัณฑ์นั้นถูกใช้งาน ดังนั้นมันจึงมีประโยชน์น้อยมากในความเป็นจริงทั้งหมด เนื่องจาก Win8 OEM keys ได้รับการออกแบบให้เชื่อมโยงกับคอมพิวเตอร์เครื่องนั้นคุณจะชนกำแพงอิฐถ้าคุณขอให้ Microsoft ยกเลิกการลงทะเบียนกุญแจดังนั้นคุณสามารถใช้มันใน VM ได้โดยไม่ต้องใช้คอมพิวเตอร์เครื่องอื่น

วิธีเดียวที่คุณสามารถใช้คีย์ได้คือถ้าคุณไม่เคยบูทใน Win8 เพื่อเริ่มต้นด้วยหรือไม่ได้เชื่อมต่อกับเครือข่ายเมื่อคุณทำ อย่างไรก็ตามหาก VM / คอมพิวเตอร์เครื่องใหม่ของคุณได้รับอนุญาตให้เชื่อมต่อกับเครือข่ายมันจะลงทะเบียนคีย์โดยอัตโนมัติทำให้การติดตั้งจริงของคุณไม่สามารถใช้งานได้


เพิ่งลองทำสิ่งนี้และคำสั่งด้านบนตัดหนึ่งในตัวละคร ฉันใช้sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echoและฉันได้รับกุญแจเต็ม
Andrew C

คุณถูกต้องขอโทษด้วย กำลังอัปเดตคำตอบของฉัน
Chuck 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 / เฟิร์มแวร์ / acpi / tables / MSDM" สามารถยืนยันได้ว่าฉันได้รับกุญแจ Windows จากแล็ปท็อป Samsung เพียงแค่ปรับ =)
Valross.nu

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

นี่ทำให้ฉันได้รหัสผลิตภัณฑ์ของ OEM Windows 8 ของฉันบนแล็ปท็อป MSI


3

คุณสามารถใช้รหัสนี้ได้เช่นกันหากรหัสข้างบนไม่เหมาะกับคุณหรือคุณต้องการเห็นเอาต์พุตเลขฐานสิบหกด้วยรหัสของคุณ มันคล้ายกับพรฐานสิบหกแก้ไข hex 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;
    }

ฉันจะลองและถอดรหัสอัลกอริทึมและเขียนมันในทุบตี เอาต์พุต dmi น่าจะเป็นอัลกอริทึมที่เก่ากว่า (<win8) สำหรับการถอดรหัสคีย์ ฉันไม่พบตัวเลือกสำหรับใช้อัลกอริทึมใหม่ (> win7)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.