ดึงรหัสผลิตภัณฑ์ Windows 7 จาก Linux


19

ฉันตัดการเชื่อมต่อฮาร์ดไดรฟ์โดยไม่ได้ตั้งใจในขณะที่มันยังทำงานอยู่และทำให้การติดตั้ง Windows 7 ของฉันเสียหาย ตอนนี้ฉันไม่สามารถบูตเข้าสู่ Windows ได้อย่างสมบูรณ์ ฉันได้ลองทุกอย่างเพื่อลองและซ่อมแซมการติดตั้ง: Windows Startup Repair, chkdsk / r, SFC / scannow, bootrec / rebuildbcd เป็นต้นและไม่มีโชค ฉันต้องการติดตั้งใหม่ แต่ปัญหาของฉันคือฉันไม่ได้เขียนรหัสผลิตภัณฑ์ Windows ไว้ทุกที่และฉันไม่สามารถใช้สคริปต์หรือยูทิลิตีใด ๆ เพื่อเรียกคืนจากรีจิสทรีเนื่องจากฉันไม่สามารถบูตเข้าสู่ Windows ได้

รหัสผลิตภัณฑ์ Windows 7 จะถูกจัดเก็บเข้ารหัสในค่า "DigitalProductId" ของรีจิสตรีคีย์ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion ฉันสามารถติดตั้งพาร์ติชัน Windows ที่เสียหายแบบอ่านอย่างเดียวจากอูบุนตูไลฟ์ซีดีและคัดลอกกลุ่มรีจิสทรี Windows \ System32 \ config \ SOFTWARE ซึ่งมีคีย์ & ค่าที่สงสัยไปยังแฟลชไดรฟ์ แต่โหลดไฮฟ์นี้ลงใน regedit ในการติดตั้ง Windows ที่ใช้งานได้และจากนั้นพยายามใช้สคริปต์หรือยูทิลิตี้เพื่อถอดรหัสค่า "DigitalProductId" ที่โหลดไว้จะส่งกลับเฉพาะหมายเลขผลิตภัณฑ์ของการติดตั้ง Windows โฮสต์ไม่ว่าฉันจะเล่นซอมากแค่ไหนก็ตาม ฉันได้ลองติดต่อฝ่ายสนับสนุนของ Microsoft และพวกเขาก็ไม่ค่อยช่วยเหลือ ทุกคนจะสามารถนำทางฉันเพิ่มเติมได้หรือไม่ บางทีถ้ามีวิธีอื่นในการรับรหัสผลิตภัณฑ์จาก Linux

หากผู้อื่นคุ้นเคยกับการเขียนสคริปต์ / การเข้ารหัสจะยินดีที่จะลองและติดตามสคริปต์การถอดรหัสเพื่อถอดรหัสรหัสผลิตภัณฑ์ด้วยตนเองฉันสามารถส่งอีเมลถึงค่า "DigitalProductId" ที่ส่งออกของคุณกลุ่มซอฟต์แวร์รีจิสทรีและสคริปต์การถอดรหัส


สิ่งนี้ไม่ถูกต้อง หากคุณซื้อใบอนุญาตคุณควรมีรหัส ในทางกลับกันถ้าคุณได้เห็นใครบางคนในหน้าต่างของคนอื่นและต้องการดึงกุญแจออกมานั่นไม่ใช่จุดของไซต์นี้จริงๆ
JasonXA

ฉันซื้อใบอนุญาตแล้ว ฉันมี DVD การติดตั้ง แต่ไม่สามารถค้นหาหมายเลขผลิตภัณฑ์ที่มาพร้อมกับมัน แต่ฉันคิดว่าฉันอาจได้พบวิธีแก้ปัญหาที่นี่: dagondesign.com/articles/windows-xp-product-key-recovery/?hl=th
sundiata

ใช่มันดูเหมือนว่าจะใช้งานได้ ใช้วิธีที่ฉันจัดการเพื่อสร้างคีย์ของฉันใหม่
JasonXA

หากเฟิร์มแวร์ของคุณใช้ UEFI คีย์ใบอนุญาตจะถูกจัดเก็บจริงในตาราง ACPI MSDM ดังนั้นจึงยังคงมีอยู่ในการรีบูต ถ้าเป็นเช่นนั้นให้ดู blog.fpmurphy.com สำหรับรายละเอียดเกี่ยวกับวิธีการกู้คืน
fpmurphy

คำตอบ:


31

chntpwมีเครื่องมือที่ดีพร้อมใช้งานสำหรับลินุกซ์ที่เรียกว่าเป็น คุณสามารถรับมันได้อย่างง่ายดายบน Debian / Ubuntu ผ่านทาง:

sudo apt install chntpw

หากต้องการดูไฟล์รีจิสตรีที่เกี่ยวข้องให้ใส่ดิสก์ Windows แล้วเปิดขึ้นมาตามต้องการ:

chntpw -e /path/to/windisk/Windows/System32/config/software

ตอนนี้เพื่อให้ถอดรหัสDigitalProductIdป้อนคำสั่งนี้:

dpi \Microsoft\Windows NT\CurrentVersion\DigitalProductId

5
เส้นทางไปยังไฟล์รีจิสตรีที่เกี่ยวข้องอยู่ใน / path / to / windisk / Windows / System32 / config / RegBack / SOFTWARE
Mohamed EL HABIB

2
นี่เป็นคำตอบที่ยอดเยี่ยมฉันเสนอราคาบน Ask Ubuntu askubuntu.com/a/953130/75060
Mark Kirby

ขอบคุณสำหรับสิ่งนี้. โปรดจดบันทึกเพื่อตรวจสอบกรณีของโฟลเดอร์และชื่อไฟล์ ในกรณีของฉันฉันต้องใช้ตัวพิมพ์ใหญ่SOFTWAREสำหรับชื่อไฟล์
Paddy Landau

หากคุณมีปัญหาในการอ่านโฟลเดอร์ system32 ลองทำสำเนาและระบุเส้นทางไปยังสำเนาไปยัง chntpw
Markus von Broady

2

สำหรับคนที่ไม่อายที่จะทำการเขียนสักหน่อย

ฉันพบอัลกอริทึมประมาณ 10 ปีที่แล้วและนำไปใช้ในC # (ดูด้านล่าง)


หากคุณเพียงต้องการเรียกใช้บน Windows

ฉันใช้เสรีภาพในการแปลงเป็นสคริปต์ PowerShell:

$dpid = Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "DigitalProductId"

# Get the range we are interested in
$id = $dpid.DigitalProductId[52..(52+14)]

# Character table
$chars = "BCDFGHJKMPQRTVWXY2346789"

# Variable for the final product key
$pkey = ""

# Calculate the product key
for ($i=0; $i -le 24; $i++) {
    $c = 0

    for($j=14; $j -ge 0; $j--) {
        $c = ($c -shl 8) -bxor $id[$j]

        $id[$j] = [Math]::Floor($c / 24) -band 255

        $c = $c % 24
    }
    $pkey = $chars[$c] + $pkey
}
# Insert some dashes
for($i = 4; $i -gt 0; $i--) {
    $pkey = $pkey.Insert($i * 5, "-")
}
$pkey

เรียกใช้สิ่งนี้และคุณจะได้รับรหัสผลิตภัณฑ์ของคุณ (ดังนั้นจึงไม่มีการเข้ารหัสสำหรับคุณหลังจากทั้งหมด)


โพสต์ต้นฉบับ

นี่คือรหัส C # จริงที่ฉันขุดและแสดงความคิดเห็น

public static string ConvertDigitalProductID(string regPath, string searchKey = "DigitalProductID") {
    // Open the sub key i.E.: "Software\Microsoft\Windows NT\CurrentVersion"
    var regkey = Registry.LocalMachine.OpenSubKey(regPath, false);
    // Retreive the value of "DigitalProductId"
    var dpid = (byte[])regkey.GetValue(searchKey);
    // Prepare an array for the relevant parts
    var idpart = new byte[15];

    // Copy the relevant parts of the array
    Array.Copy(dpid, 52, idpart, 0, 15);

    // Prepare the chars that will make up the key
    var charStore = "BCDFGHJKMPQRTVWXY2346789";

    // Prepare a string for the result
    string productkey = "";

    // We need 24 iterations (one for each character)
    for(int i = 0; i < 25; i++) {

        int c = 0;
        // Go through each of the 15 bytes of our dpid
        for(int j = 14; j >= 0; j--) {
            // Shift the current byte to the left and xor in the next byte
            c = (c << 8) ^ idpart[j];

            // Leave the result of the division in the current position
            idpart[j] = (byte)(c / 24);

            // Take the rest of the division forward to the next round
            c %= 24;
        }
        // After each round, add a character from the charStore to our key
        productkey = charStore[c] + productkey;
    }

    // Insert the dashes
    for(int i = 4; i > 0; i--) {
        productkey = productkey.Insert(i * 5, "-");
    }

    return productkey;
}

คุณจะต้องผ่านมันSoftware\Microsoft\Windows NT\CurrentVersionเป็นกุญแจสำคัญที่มันจะหาDigitalProductId

ในขณะนั้นผลิตภัณฑ์ MS Office ใช้อัลกอริทึมเดียวกันดังนั้นโดยการให้ฟังก์ชั่นกับรหัสรีจิสตรีที่เกี่ยวข้องจะสามารถคำนวณคีย์ผลิตภัณฑ์เหล่านั้นได้เช่นกัน

แน่นอนคุณสามารถ refactor ฟังก์ชั่นเพื่อที่จะใช้อาร์เรย์ไบต์เป็นอินพุต

สำหรับวันนี้ ฉันเพิ่งทดสอบบนเครื่อง Windows 10 ของฉันและยังใช้งานได้


นี่เป็นคำตอบที่ดี แต่คำถามนั้นเก่ามากและอาจไม่ได้รับมุมมองมากมาย ในฐานะที่คุณเป็นสมาชิกโปรดพิจารณาการเพิ่มคำตอบของคุณลงในโพสต์ถามอูบุนตูปัจจุบันAskubuntu.com/questions/953126/ …
Mark Kirby

ขอบคุณ. แต่ฉันเชื่อว่ามันจะปิดหัวข้อที่นั่น ฉันอาจตบการใช้รหัสเทียมร่วมกัน และอ้างถึงโพสต์นี้เป็นการใช้งานจริง
MrPaulch

ไม่มีปัญหาทำในสิ่งที่คุณคิดว่าดีที่สุด
Mark Kirby

2

นี่คือพอร์ต Python ของคำตอบอื่น ๆ (ดัดแปลงสำหรับ Windows 8.1) ข้อดีของข้อนี้chntpwคือมันจะทำงานได้แม้กับไดรฟ์ที่อยู่ในสถานะอ่านอย่างเดียว

ที่ต้องการ:

pip install python-registry

รหัส:

#!/usr/bin/env python
import sys
from Registry import Registry
reg = Registry.Registry("/path/to/drive/Windows/System32/config/RegBack/SOFTWARE")
# Uncomment for registry location for Windows 7 and below:
#reg = Registry.Registry("/path/to/drive/Windows/system32/config/software")
key = reg.open("Microsoft\Windows NT\CurrentVersion")
did = bytearray([v.value() for v in key.values() if v.name() == "DigitalProductId"][0])
idpart = did[52:52+15]
charStore = "BCDFGHJKMPQRTVWXY2346789";
productkey = "";
for i in range(25):
  c = 0
  for j in range(14, -1, -1):
    c = (c << 8) ^ idpart[j]
    idpart[j] = c // 24
    c %= 24
  productkey = charStore[c] + productkey
print('-'.join([productkey[i * 5:i * 5 + 5] for i in range(5)]))

วงด้านในสั้นเกินไปหนึ่งรอบ มันควรจะทำงานตอนนี้
Lenar Hoyt

0

นี่คือการดำเนินการทุบตีของฉัน ฉันเรียกมันว่า get_windows_key.sh ใช้งานได้ดีจาก clonezilla ฉันโพสต์ไว้ที่นี่เดิมhttps://sourceforge.net/p/clonezilla/discussion/Open_discussion/thread/979f335385/

#!/bin/bash
# written by Jeff Sadowski
# credit
###################################################
# Pavel Hruška, Scott Skahht, and Philip M for writting
# https://github.com/mrpeardotnet/WinProdKeyFinder/blob/master/WinProdKeyFind/KeyDecoder.cs
# that I got my conversion code from
#
# I used the comments on the sudo code from
# /ubuntu/953126/can-i-recover-my-windows-product-key- from-ubuntu
# by MrPaulch
#
# and the creator of chntpw
#
# Petter Nordahl-Hagen
# without which I would not be able to get the key in linux
#
# also the creators of ntfs-3g, linux and bash

parted -l 2>/dev/null |grep -e ntfs -e fat -e Disk|grep -v Flags
#get the first mac address that isn't a loopback address
# loopback will have all zeros
MAC=$(cat /sys/class/net/*/address|grep -v 00:00:00:00:00:00|head -n 1|sed "s/:/-/g")
if [ "$1" = "" ];then
 echo "mount the Windows share then give this script the path where you mounted it"
 exit
fi
cd $1
#
# This way will work no matter what the capitalization is
next=$(find ./ -maxdepth 1 -iname windows);cd ${next}
next=$(find ./ -maxdepth 1 -iname system32);cd ${next}
next=$(find ./ -maxdepth 1 -iname config);cd ${next}
file=$(find ./ -maxdepth 1 -iname software)
#echo $(pwd)${file:1}
#Get the necissary keys
#get the version key
VERSION=$((16#$(echo -e "cat \\Microsoft\\Windows NT\\CurrentVersion\\CurrentMajorVersionNumber\nq\n" | chntpw -e ${file}|grep "^0x"|cut -dx -f2)))
hexPid_csv_full=$(echo $(echo -e "hex \\Microsoft\\Windows NT\\CurrentVersion\\DigitalProductId\nq\n" | chntpw -e ${file}|grep "^:"|cut -b 9-55)|sed 's/ /,/g' | tr '[:u>
# get the subset 53 to 68 of the registry entry
hexPid_csv=$(echo $(echo -e "hex \\Microsoft\\Windows NT\\CurrentVersion\\DigitalProductId\nq\n" | chntpw -e ${file}|grep "^:"|cut -b 9-55)|sed 's/ /,/g' | tr '[:upper:>
echo "${hexPid_csv_full}" > /custom/DigitalProductId_${MAC}.txt
#formatted output
spread()
{
 key=$1
 echo ${key:0:5}-${key:5:5}-${key:10:5}-${key:15:5}-${key:20:5}
}
# almost a direct conversion of c# code from
# https://github.com/mrpeardotnet/WinProdKeyFinder/blob/master/WinProdKeyFind/KeyDecoder.cs
# however most of this looks similar to sudo code I found
# /ubuntu/953126/can-i-recover-my-windows-product-key-from-ubuntu
DecodeProductKey()
{
digits=(B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9)
for j in {0..15};do
#Populate the Pid array from the values found in the registry
 Pid[$j]=$((16#$(echo ${hexPid_csv}|cut -d, -f $(($j+1)))))
done
if [ "$1" = "8+" ];then
# modifications needed for getting the windows 8+ key
 isWin8=$(($((${Pid[14]}/6))&1))
 Pid[14]=$(( $(( ${Pid[14]}&247 )) | $(( $(( ${isWin8} & 2 )) * 4 )) ))
fi
key=""
last=0
for i in {24..0};do
 current=0
 for j in {14..0};do
  # Shift the current contents of c to the left by 1 byte 
  # and add it with the next byte of our id
  current=$((${current}*256))
  current=$((${Pid[$j]} + current))
  # Put the result of the divison back into the array
  Pid[$j]=$((${current}/24))
  # Calculate remainder of c
  current=$((${current}%24))
  last=${current}
 done
 # Take character at position c and prepend it to the ProductKey
 key="${digits[${current}]}${key}"
done
if [ "$1" = "8+" ];then
# another modification needed for a windows 8+ key
 key="${key:1:${last}}N${key:$((${last}+1)):24}"
 echo -n "Windows 8+ key: "
else
 echo -n "Windows 7- key: "
fi
spread "${key}"
}
if [ "$VERSION" -gt "7" ];then
 DecodeProductKey 8+
else
 DecodeProductKey
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.