Ambil / dekripsi kunci produk Windows 7 dari Linux


19

Saya tidak sengaja memutus hard drive saya ketika masih berjalan dan merusak instalasi Windows 7 saya; Saya sekarang benar-benar tidak dapat boot ke Windows. Saya telah mencoba segalanya untuk mencoba dan memperbaiki instalasi: Perbaikan Startup Windows, chkdsk / r, SFC / scannow, bootrec / rebuildbcd, dll. Dan tidak berhasil. Saya hanya ingin melakukan instalasi baru, tetapi masalah saya adalah bahwa saya tidak punya kunci produk Windows saya ditulis di mana saja, dan saya tidak dapat menggunakan skrip atau utilitas untuk mengambilnya dari registri karena saya tidak bisa boot ke Windows.

Kunci produk Windows 7 disimpan, dienkripsi, dalam nilai "DigitalProductId" dari kunci registri HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion. Saya dapat me-mount partisi Windows yang rusak hanya-baca dari live Ubuntu Ubuntu dan menyalin sarang registri Windows \ System32 \ config \ SOFTWARE, yang berisi kunci & nilai yang dimaksud, ke flash drive, tetapi memuat sarang ini ke regedit pada instalasi Windows yang berfungsi dan kemudian mencoba menggunakan skrip atau utilitas untuk mendekripsi nilai "DigitalProductId" yang dimuat hanya mengembalikan kunci produk instalasi Windows host, tidak peduli berapa banyak saya mengutak-atik. Saya sudah mencoba menghubungi dukungan Microsoft dan mereka agak tidak membantu. Adakah yang bisa membimbing saya lebih jauh? Mungkin jika ada cara berbeda untuk mengambil kunci produk dari Linux?

Jika seseorang yang lebih akrab dengan skrip / kriptografi akan bersedia untuk mencoba dan mengikuti skrip dekripsi untuk mendekripsi kunci produk dengan tangan, saya dapat mengirimi Anda email nilai "DigitalProductId" yang diekspor, kumpulan registri SOFTWARE, dan skrip dekripsi.


Ini kedengarannya tidak benar. Jika Anda membeli lisensi, Anda harus memiliki kunci. Sekarang, di sisi lain, jika Anda mendapatkan gambar jendela orang lain dan ingin mengekstrak kuncinya, itu sebenarnya bukan poin dari situs ini.
JasonXA

Saya memang membeli lisensi. Saya memiliki DVD instalasi tetapi tidak dapat menemukan kunci produk yang menyertainya. Tapi saya pikir saya mungkin telah menemukan solusi di sini: dagondesign.com/articles/windows-xp-product-key-recovery/…
sundiata

Ya, itu sepertinya berhasil. Menggunakan metode yang saya lakukan untuk mereproduksi kunci saya.
JasonXA

Jika firmware Anda berbasis UEFI, kunci lisensi sebenarnya disimpan dalam tabel ACPI MSDM sehingga terus di reboot. Jika demikian, lihat blog.fpmurphy.com untuk detail tentang cara memulihkannya.
fpmurphy

Jawaban:


30

Ada alat hebat yang tersedia untuk Linux chntpw. Anda bisa mendapatkannya dengan mudah di Debian / Ubuntu melalui:

sudo apt install chntpw

Untuk melihat ke file registri yang relevan, pasang disk Windows dan buka seperti ini:

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

Sekarang untuk mendapatkan yang diterjemahkan, DigitalProductIdmasukkan perintah ini:

dpi \Microsoft\Windows NT\CurrentVersion\DigitalProductId

5
Path ke file registry yang relevan adalah ke / path / ke / windisk / Windows / System32 / config / RegBack / SOFTWARE
Mohamed EL HABIB

2
Ini adalah jawaban yang bagus, saya kutip di Ask Ubuntu askubuntu.com/a/953130/75060
Mark Kirby

Terima kasih untuk ini. Harap membuat catatan untuk memeriksa kasus folder dan nama file. Dalam kasus saya, saya harus menggunakan huruf besar SOFTWAREuntuk nama file.
Paddy Landau

Jika Anda memiliki masalah dalam membaca folder system32, cobalah membuat salinan dan menyediakan path ke salinan ke chntpw.
Markus von Broady

2

Bagi yang tidak malu melakukan sedikit coding.

Saya menemukan algoritma sekitar 10 tahun yang lalu dan mengimplementasikannya dalam C # (Lihat di bawah)


Jika Anda hanya ingin menjalankannya di Windows

Saya mengambil kebebasan untuk mengubahnya menjadi skrip 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

Jalankan ini dan Anda mendapatkan kunci produk Anda. (Jadi tidak ada coding untuk Anda setelah semua)


Pos asli

Jadi ini adalah kode C # aktual yang saya gali dan komentari.

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

Anda harus melewatinya Software\Microsoft\Windows NT\CurrentVersionsebagai Kunci, di mana ia akan menemukanDigitalProductId

Pada saat itu Produk MS Office menggunakan algoritma yang sama, jadi dengan menyediakan fungsi dengan kunci registri yang relevan, ia dapat menghitung kunci produk tersebut juga.

Anda tentu saja dapat memperbaiki fungsi sehingga dibutuhkan array byte sebagai input.

Adapun hari ini. Saya baru saja mengujinya pada Mesin Windows 10 saya, dan masih berfungsi.


Ini adalah jawaban yang bagus tetapi pertanyaannya sudah sangat lama dan mungkin tidak menerima banyak pandangan. Karena Anda adalah anggota, silakan pertimbangkan untuk menambahkan jawaban Anda ke posting Ubuntu Ask kami saat ini askubuntu.com/questions/953126/…
Mark Kirby

Terima kasih. Tapi saya percaya itu akan menjadi topik diluar sana. Saya dapat menampar bersama implementasi kode semu. Dan lihat posting ini sebagai implementasi aktual.
MrPaulch

Tidak masalah, lakukan apa yang menurut Anda terbaik
Mark Kirby

2

Berikut ini adalah port Python dari jawaban lain (disesuaikan untuk Windows 8.1). Kelebihan dari ini chntpwadalah bahwa ia akan bekerja bahkan dengan drive dalam kondisi read-only.

Persyaratan:

pip install python-registry

Kode:

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

Loop dalam adalah satu iterasi yang terlalu pendek. Itu seharusnya bekerja sekarang.
Lenar Hoyt

0

Inilah implementasi bash saya. Saya menyebutnya get_windows_key.sh berfungsi baik dari clonezilla. Saya awalnya diposting di sini 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.