Lấy / giải mã khóa sản phẩm Windows 7 từ Linux


18

Tôi vô tình ngắt kết nối ổ cứng trong khi nó vẫn đang chạy và làm hỏng cài đặt Windows 7 của tôi; Bây giờ tôi hoàn toàn không thể khởi động vào Windows. Tôi đã thử mọi cách để thử và sửa chữa cài đặt: Windows Startup Repair, chkdsk / r, SFC / scannow, bootrec / construcildbcd, v.v. và không gặp may. Tôi muốn thực hiện cài đặt mới, nhưng vấn đề của tôi là tôi không có mã khóa sản phẩm Windows của mình được ghi ở bất cứ đâu và tôi không thể sử dụng bất kỳ tập lệnh hoặc tiện ích nào để truy xuất nó từ sổ đăng ký vì tôi không thể khởi động vào Windows.

Các khóa sản phẩm của Windows 7 được lưu trữ, mã hóa, trong giá trị "Digital SẢNtId" của khóa đăng ký HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion. Tôi đã có thể gắn phân vùng Windows bị hỏng chỉ đọc từ đĩa CD trực tiếp Ubuntu và sao chép tổ hợp sổ đăng ký Windows \ System32 \ config \ SOFTWARE, có chứa khóa & giá trị nghi vấn, vào ổ đĩa flash, nhưng tải tổ ong này vào regedit trên bản cài đặt Windows đang hoạt động và sau đó cố gắng sử dụng tập lệnh hoặc tiện ích để giải mã giá trị "Digital SẢNtId" đã tải chỉ trả về khóa sản phẩm của bản cài đặt Windows, cho dù tôi có cố gắng bao nhiêu. Tôi đã thử liên hệ với bộ phận hỗ trợ của Microsoft và họ khá vô ích. Bất cứ ai sẽ có thể hướng dẫn tôi thêm? Có lẽ nếu có một cách khác để lấy khóa sản phẩm từ Linux?

Nếu ai đó quen thuộc hơn với tập lệnh / mã hóa sẽ sẵn sàng thử và theo dõi tập lệnh giải mã để giải mã khóa sản phẩm bằng tay, tôi có thể gửi email cho bạn giá trị "Digital SẢNtId", tổ hợp đăng ký PHẦN MỀM và tập lệnh giải mã.


Điều này không đúng. Nếu bạn mua một giấy phép, bạn nên có chìa khóa. Bây giờ, mặt khác, nếu bạn đã chạm tay vào hình ảnh cửa sổ của ai đó và muốn trích xuất khóa của nó, đó không thực sự là điểm chính của trang web này.
JasonXA

Tôi đã mua một giấy phép. Tôi có DVD cài đặt nhưng không thể tìm thấy khóa sản phẩm đi kèm. Nhưng tôi nghĩ rằng tôi có thể đã tìm thấy một giải pháp ở đây: dagondesign.com/articles/windows-xp-product-key-recovery/ trộm
sundiata

Vâng, điều đó dường như làm việc. Sử dụng phương pháp tôi đã quản lý để tái tạo khóa của mình.
JasonXA

Nếu phần sụn của bạn dựa trên UEFI, khóa cấp phép thực sự được lưu trữ trong bảng MSDM ACPI để nó tồn tại trong suốt quá trình khởi động lại. Nếu vậy, hãy xem blog.fpmurphy.com để biết chi tiết về cách phục hồi nó.
fpmurphy

Câu trả lời:


29

Có một công cụ tuyệt vời có sẵn cho Linux được gọi là chntpw. Bạn có thể tải nó dễ dàng trên Debian / Ubuntu thông qua:

sudo apt install chntpw

Để xem xét tệp đăng ký có liên quan, hãy gắn đĩa Windows và mở nó như sau:

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

Bây giờ để có được giải mã, DigitalProductIdhãy nhập lệnh này:

dpi \Microsoft\Windows NT\CurrentVersion\DigitalProductId

5
Đường dẫn đến tệp đăng ký có liên quan là vào / path / to / Windisk / Windows / System32 / config / RegBack / SOFTWARE
Mohamed EL HABIB

1
Đây là một câu trả lời tuyệt vời, tôi đã trích dẫn nó trên Ask Ubuntu askubfox.com/a/953130/75060
Mark Kirby

Cảm ơn vì điều này. Vui lòng ghi chú để kiểm tra trường hợp tên thư mục và tệp. Trong trường hợp của tôi, tôi đã phải sử dụng chữ hoa SOFTWAREcho tên tệp.
Paddy Landau

Nếu bạn gặp vấn đề khi đọc thư mục system32, hãy thử tạo một bản sao và cung cấp đường dẫn đến bản sao cho chntpw.
Markus von Broady

2

Đối với những người không ngại làm một chút mã hóa.

Tôi đã tìm thấy một thuật toán khoảng 10 năm trước và triển khai nó trong C # (Xem bên dưới)


Nếu bạn chỉ muốn chạy nó trên Windows

Tôi lấy tự do để chuyển đổi nó thành một kịch bản quyền hạn:

$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

Chạy này và bạn nhận được mã khóa sản phẩm của bạn. (Vì vậy, không có mã hóa cho bạn sau tất cả)


Bài gốc

Vì vậy, đây là mã C # thực tế tôi đã đào lên và nhận xét.

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;
}

Bạn sẽ phải vượt qua nó Software\Microsoft\Windows NT\CurrentVersionnhư một Khóa, nơi nó sẽ tìm thấyDigitalProductId

Vào thời điểm đó, MS Office Products đã sử dụng cùng một thuật toán, do đó, bằng cách cung cấp chức năng với khóa đăng ký có liên quan, nó cũng có thể tính toán các khóa sản phẩm đó.

Tất nhiên bạn có thể cấu trúc lại hàm để nó lấy một mảng byte làm đầu vào.

Như hôm nay. Tôi mới thử nó trên Windows 10 Machine và nó vẫn hoạt động.


Đây là một câu trả lời tốt nhưng câu hỏi rất cũ và có thể không nhận được nhiều lượt xem. Khi bạn là thành viên, vui lòng xem xét thêm câu trả lời của bạn vào bài đăng Hỏi Ubuntu hiện tại của chúng tôi Askubfox.com/questions/953126/ mẹo
Mark Kirby

Cảm ơn bạn. Nhưng tôi tin rằng nó sẽ lạc đề ở đó. Tôi có thể cùng nhau thực hiện mã giả. Và tham khảo bài viết này như là một thực hiện thực tế.
MrPaulch

Không có vấn đề gì, hãy làm những gì bạn nghĩ là tốt nhất
Mark Kirby

2

Đây là cổng Python của câu trả lời khác (được điều chỉnh cho Windows 8.1). Ưu điểm của việc này chntpwlà nó sẽ hoạt động ngay cả với các ổ đĩa ở trạng thái chỉ đọc.

Yêu cầu:

pip install python-registry

Mã số:

#!/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)]))

Vòng lặp bên trong là một lần lặp quá ngắn. Nó nên hoạt động ngay bây giờ.
Lenar Hoyt

0

Đây là thực hiện bash của tôi. Tôi gọi nó là get_windows_key.sh hoạt động tốt từ clonezilla. Ban đầu tôi đã đăng nó ở đây 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
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.