Linux'tan Windows 7 ürün anahtarını alma / şifresini çözme


19

Windows 7 kurulumumu çalışırken hala sabit diskimin bağlantısını kesmiştim; Artık tamamen Windows'a önyükleme yapamıyorum. Yüklemeyi denemek ve onarmak için her şeyi denedim: Windows Başlangıç ​​Onarımı, chkdsk / r, SFC / scannow, bootrec / rebuildbcd, vb. Sadece yeni bir yükleme yapmak istiyorum, ancak benim sorunum Windows ürün anahtarımı hiçbir yere yazmamış olmam ve Windows'a önyükleme yapamadığım için kayıt defterinden almak için herhangi bir komut dosyasını veya yardımcı programı kullanamıyorum.

Windows 7 ürün anahtarları HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion kayıt defteri anahtarının "DigitalProductId" değerinde depolanır, şifrelenir. Bir Ubuntu canlı CD'sinden bozuk Windows bölümünü salt okunur olarak bağlayabildim ve söz konusu anahtar ve değeri içeren Windows \ System32 \ config \ SOFTWARE kayıt defteri kovanını bir flash sürücüye kopyalayabildim, ancak bu kovanı regedit'e yükledim yüklenen "DigitalProductId" değerinin şifresini çözmek için komut dosyalarını veya yardımcı programları kullanmaya çalıştığınızda, ne kadar uğraştığımdan bağımsız olarak, ana bilgisayar Windows kurulumunun ürün anahtarını döndürür. Microsoft desteğiyle iletişime geçmeyi denedim ve oldukça yararsız oldular. Biri bana daha fazla rehberlik edebilir mi? Belki de ürün anahtarını Linux'tan almanın farklı bir yolu varsa?

Komut dosyası / kriptografiye daha aşina olan bir kişi, ürün anahtarının şifresini çözmek için şifre çözme komut dosyasını denemeye ve izlemeye istekli olursa, size verilen "DigitalProductId" değerini, YAZILIM kayıt defteri kovanını ve şifre çözme komut dosyasını e-postayla gönderebilirim.


Kulağa doğru gelmiyor. Bir lisans satın aldıysanız, anahtarınız olmalıdır. Öte yandan, eğer bir başkasının Windows görüntüsünü elinize aldıysanız ve anahtarını çıkarmak istiyorsanız, bu gerçekten bu sitenin amacı değil.
JasonXA

Bir lisans satın aldım. Kurulum DVD'sim var ancak beraberinde gelen ürün anahtarını bulamıyorum. Ama sanırım burada bir çözüm bulmuş olabilirim: dagondesign.com/articles/windows-xp-product-key-recovery/…
sundiata

Evet, işe yarıyor gibi görünüyor. Yöntemi kullanarak anahtarımı yeniden oluşturmayı başardım.
JasonXA

Ürün yazılımınız UEFI tabanlıysa, lisans anahtarı aslında ACPI MSDM tablosunda saklanır, böylece yeniden başlatma boyunca devam eder. Öyleyse, nasıl kurtarılacağına ilişkin ayrıntılar için blog.fpmurphy.com adresine bakın.
fpmurphy

Yanıtlar:


31

Linux için harika bir araç var denir chntpw. Debian / Ubuntu'dan kolayca alabilirsiniz:

sudo apt install chntpw

İlgili kayıt defteri dosyasına bakmak için Windows diskini takın ve şu şekilde açın:

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

Şimdi kodu çözmek DigitalProductIdiçin şu komutu girin:

dpi \Microsoft\Windows NT\CurrentVersion\DigitalProductId

5
İlgili kayıt defteri dosyasının yolu / path / to / windisk / Windows / System32 / config / RegBack / SOFTWARE
Mohamed EL HABIB

2
Bu harika bir cevap, Ask Ubuntu'dan alıntı yaptım askubuntu.com/a/953130/75060
Mark Kirby

Bunun için teşekkür ederim. Lütfen klasör ve dosya adlarının durumunu kontrol edin. Benim durumumda, SOFTWAREdosya adı için büyük harf kullanmak zorunda kaldım .
Paddy Landau

System32 klasörünü okumada sorun yaşıyorsanız, bir kopya oluşturmayı ve chntpw kopyasına giden yolu sağlamayı deneyin.
Markus von Broady

2

Biraz kodlama yapmaktan çekinmeyenler için.

Yaklaşık 10 yıl önce bir algoritma buldum ve C # ile uyguladım (Aşağıya bakın)


Sadece Windows'da çalıştırmak istiyorsanız

Bir powershell betiğine dönüştürme özgürlüğünü aldım:

$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

Bunu çalıştırın ve ürün anahtarınızı alın. (Sonuçta sizin için kodlama yok)


Orijinal yayın

Yani bu kazdık ve yorum gerçek C # kodu.

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

Bunu geçmesi gerekecek Software\Microsoft\Windows NT\CurrentVersionbunun bulacaksınız bir Key olarakDigitalProductId

O zaman MS Office Ürünleri aynı algoritmayı kullandı, bu nedenle işleve ilgili kayıt defteri anahtarını sağlayarak bu ürün anahtarlarını da hesaplayabilir.

Tabii ki bir bayt dizisini girdi olarak almak için işlevi yeniden düzenleyebilirsiniz.

Bugünlük. Sadece Windows 10 Makinemde test ettim ve hala çalışıyor.


Bu iyi bir cevap ama soru çok eski ve pek çok görüş alamayabilir. Üye olduğunuzda, lütfen mevcut Ububu
Mark Kirby

Teşekkür ederim. Ama orada konu dışı olacağını düşünüyorum. Ben bir sözde kod uygulaması tokat olabilir. Ve bu yayına gerçek bir uygulama olarak bakın.
MrPaulch

Sorun değil, en iyi olduğunu düşündüğünüzü yapın
Mark Kirby

2

İşte diğer cevabın bir Python portu (Windows 8.1 için uyarlanmıştır). Bunun avantajı, chntpwsalt okunur durumdaki sürücülerle bile çalışmasıdır.

Gereksinimler:

pip install python-registry

Kod:

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

İç döngü çok kısa bir yinelemeydi. Şimdi çalışmalı.
Lenar Hoyt

0

İşte bash uygulamam. Ben get_windows_key.sh diyorum klonezilla iyi çalışır. Başlangıçta buraya gönderdim 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.