Отримайте / розшифруйте ключ продукту 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, доступний лише для читання, з живого компакт-диска Ubuntu та скопіювати на флешку диск реєстру Windows \ System32 \ config \ SOFTWARE, який містить ключ та значення, але завантажуючи цей вулик у regedit на робочій установці Windows, а потім намагається використовувати скрипти або утиліти для розшифровки завантаженого значення "DigitalProductId", лише повертає ключ продукту хост-установки Windows, незалежно від того, наскільки непогано я намагаюся. Я намагався зв’язатися зі службою підтримки Microsoft, і вони виявилися досить недобрими. Хтось міг би мене вести далі? Можливо, якщо є інший спосіб отримати ключ продукту з Linux?

Якщо хтось більш знайомий із сценарієм / криптографією буде готовий спробувати виконати сценарій дешифрування, щоб розшифрувати ключ продукту вручну, я можу надіслати електронною поштою вам експортоване значення "DigitalProductId", вулик реєстру програмного забезпечення та скрипт розшифровки.


Це не звучить правильно. Якщо ви купили ліцензію, у вас повинен бути ключ. Тепер, з іншого боку, якщо ви потрапили на зображення когось з інших вікон і хочете витягнути його ключ, це не справді сенс цього сайту.
JasonXA

Я купував ліцензію. У мене є інсталяційний DVD, але не можу знайти ключ продукту, який постачається разом із ним. Але я думаю, що я, можливо, знайшов тут рішення: dagondesign.com/articles/windows-xp-product-key-recovery/…
sundiata

Так, це, здається, працює. За допомогою методу мені вдалося відтворити свій ключ.
JasonXA

Якщо ваша прошивка базується на UEFI, ліцензійний ключ фактично зберігається в таблиці ACPI MSDM, щоб він зберігався під час перезавантаження. Якщо це так, перегляньте blog.fpmurphy.com, щоб дізнатися, як відновити його.
fpmurphy

Відповіді:


31

Для Linux називається чудовий інструмент 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
Шлях до відповідного файлу реєстру знаходиться в / шлях / до / windisk / Windows / System32 / config / RegBack / SOFTWARE
Mohamed EL HABIB

2
Це відмінна відповідь, я процитував це на Ask Ubuntu askubuntu.com/a/953130/75060
Марк Кірбі

Дякую за це. Зробіть примітку, щоб перевірити регістр назв папки та файлів. У моєму випадку мені довелося використовувати великі регістри SOFTWAREдля імені файлу.
Падді Ландау

Якщо у вас є проблеми з читанням папки system32, спробуйте зробити копію та подати шлях до копії до chntpw.
Маркус фон

2

Для тих, хто не соромиться зробити трохи кодування.

Я знайшов алгоритм близько 10 років тому і реалізував його в C # (Дивіться нижче)


Якщо ви просто хочете запустити його в Windows

Я взяв на себе сміливість перетворити його на скрипт повноважень:

$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 Products використовував той самий алгоритм, тому, надаючи функцію відповідним ключем реєстру, він міг також обчислити ці ключі продукту.

Ви, звичайно, можете рефакторну функцію, щоб вона взяла байтовий масив як вхід.

Що стосується сьогодні. Я щойно тестував його на своїй машині Windows 10, і він все ще працює.


Це хороша відповідь, але питання дуже старе і може не сприймати багато поглядів. Як ви є членом, будь ласка, подумайте про те, як додати свою відповідь до нашого поточного запиту на
Марк Кірбі

Дякую. Але я вірю, що це буде поза темою. Я можу ляпати разом реалізацію псевдокоду. І посилайтеся на цю посаду як на фактичну реалізацію.
MrPaulch

Без проблем, зробіть те, що вважаєте найкращим
Марк Кірбі

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)]))

Внутрішня петля була одна ітерація занадто коротка. Це має працювати зараз.
Ленар Хойт

0

Ось моя реалізація bash. Я називаю це 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.