Linux에서 Windows 7 제품 키 검색 / 복호화


19

하드 드라이브가 여전히 실행 중이고 Windows 7 설치를 손상시키는 동안 실수로 하드 드라이브를 분리했습니다. 이제 Windows로 완전히 부팅 할 수 없습니다. 나는 Windows Startup Repair, chkdsk / r, SFC / scannow, bootrec / rebuildbcd 등의 설치를 시도하고 복구하기 위해 모든 것을 시도했지만 운이 없습니다. 새로 설치 만하고 싶지만 내 문제는 Windows 제품 키를 아무 곳에 나 기록하지 않았으며 Windows로 부팅 할 수 없기 때문에 스크립트 나 유틸리티를 사용하여 레지스트리에서 검색 할 수 없다는 것입니다.

Windows 7 제품 키는 레지스트리 키 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion의 "DigitalProductId"값에 암호화되어 저장됩니다. Ubuntu 라이브 CD에서 손상된 Windows 파티션을 읽기 전용으로 마운트하고 문제의 키 및 값이 포함 된 Windows \ System32 \ config \ SOFTWARE 레지스트리 하이브를 플래시 드라이브로 복사 할 수 있었지만이 하이브를 regedit에로드했습니다. 작동하는 Windows 설치에서 스크립트 나 유틸리티를 사용하여로드 된 "DigitalProductId"값의 암호를 해독하려고하면 아무리 노력해도 호스트 Windows 설치의 제품 키만 반환됩니다. Microsoft 지원에 문의하려고했지만 도움이되지 않았습니다. 누구든지 나를 더 안내 할 수 있습니까? 아마도 리눅스에서 제품 키를 검색하는 다른 방법이 있다면?

스크립팅 / 암호화에 더 익숙한 사람이 암호 해독 스크립트를 사용하여 제품 키를 직접 해독하려고하면 내 보낸 "DigitalProductId"값, 소프트웨어 레지스트리 하이브 및 암호 해독 스크립트를 전자 메일로 보낼 수 있습니다.


이것은 제대로 들리지 않습니다. 라이센스를 구입 한 경우 키가 있어야합니다. 다른 한편으로, 다른 사람의 Windows 이미지에 손을 대고 키를 추출하려는 경우 실제로이 사이트의 요점이 아닙니다.
JasonXA

라이센스를 구입했습니다. 설치 DVD가 있지만 함께 제공된 제품 키를 찾을 수 없습니다. 그러나 나는 여기서 해결책을 찾은 것 같다 : dagondesign.com/articles/windows-xp-product-key-recovery/…
sundiata

예, 작동하는 것 같습니다. 방법을 사용하여 키를 재현했습니다.
JasonXA

펌웨어가 UEFI 기반 인 경우 라이센스 키는 실제로 ACPI MSDM 테이블에 저장되므로 재부팅해도 계속 유지됩니다. 그렇다면 복구 방법에 대한 자세한 내용은 blog.fpmurphy.com을 참조하십시오.
fpmurphy

답변:


31

리눅스에서 사용할 수있는 훌륭한 툴이있다 chntpw. 다음을 통해 데비안 / 우분투에서 쉽게 구할 수 있습니다.

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

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 Products는 동일한 알고리즘을 사용했기 때문에 관련 레지스트리 키를 제공하여 해당 제품 키도 계산할 수있었습니다.

물론 바이트 배열을 입력으로 사용하도록 함수를 리팩토링 할 수 있습니다.

오늘도. 방금 Windows 10 컴퓨터에서 테스트했지만 여전히 작동합니다.


이것은 좋은 대답이지만 질문은 매우 오래되어 많은 견해를 얻지 못할 수 있습니다. 회원으로서, 현재 Ask Ubuntu 게시물 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

여기 내 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.