[Windows 7] verwendeten Key identifizieren

[Wabbajack]

Cadet 4th Year
Registriert
Jan. 2017
Beiträge
100
Hallo Gemeinde,

gibt es ein Merkmal (z.B. Registry Key), woran ich erkennen kann welcher Windows 7 Key für die Installation eines Rechners verwendet wurde?
Zur Klarstellung: Es geht mir nicht darum den Key im Klartext auszulesen. Ich möchte nur wissen welcher der mir vorliegenden Keys bei Rechner XY verwendet wurde. Ich meine mich zu erinnern, dass es in der Registry einen Eintrag gibt der mir den letzten Block des Keys zeigt, in etwa so "XXXXX-XXXXX-XXXXX-XXXXX-ABC12". Leider finde ich den entsprechenden Wert nicht.

Vielen Dank vorab für eure Hilfe :)
 
Den Codeblock rauskopieren, in eine leere Textdatei einfügen, mit der Endung .vbs speichern und doppelklicken.

Code:
Set WshShell = CreateObject("WScript.Shell")
Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
DigitalID = WshShell.RegRead(key & "DigitalProductId")

ProductName = "Product Name: " & WshShell.RegRead(Key & "ProductName") & vbNewLine
ProductID = "Product ID: " & WshShell.RegRead(Key & "ProductID") & vbNewLine
ProductKey = "Installed Key: " & ConvertToKey(DigitalID)
ProductID = ProductName & ProductID & ProductKey

If vbYes = MsgBox(ProductId & vblf & vblf & "Save to a file?", vbYesNo + vbQuestion, "Windows Key Information") then
   Save ProductID
End if

Function ConvertToKey(Key)
    Const KeyOffset = 52
    isWin8 = (Key(66) \ 6) And 1
    Key(66) = (Key(66) And &HF7) Or ((isWin8 And 2) * 4)
    i = 24
    Chars = "BCDFGHJKMPQRTVWXY2346789"
        Do
        Cur = 0
        X = 14
        Do
            Cur = Cur * 256
            Cur = Key(X + KeyOffset) + Cur
            Key(X + KeyOffset) = (Cur \ 24)
            Cur = Cur Mod 24
            X = X -1
        Loop While X >= 0
        i = i -1
        KeyOutput = Mid(Chars, Cur + 1, 1) & KeyOutput
        Last = Cur
    Loop While i >= 0
    If (isWin8 = 1) Then
        keypart1 = Mid(KeyOutput, 2, Last)
        insert = "N"
        KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
        If Last = 0 Then KeyOutput = insert & KeyOutput
    End If
    a = Mid(KeyOutput, 1, 5)
    b = Mid(KeyOutput, 6, 5)
    c = Mid(KeyOutput, 11, 5)
    d = Mid(KeyOutput, 16, 5)
    e = Mid(KeyOutput, 21, 5)
    ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
End Function

Function Save(Data)
    Const ForWRITING = 2
    Const asASCII = 0
    Dim fso, f, fName, ts
    fName = "Windows Key.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CreateTextFile fName
    Set f = fso.GetFile(fName)
    Set f = f.OpenAsTextStream(ForWRITING, asASCII)
    f.Writeline Data
    f.Close
End Function

Schon hat man den Key.

Funktioniert aber nicht bei Windows 10, da hier immer nur generische Produkt Keys gefunden werden können.
 
  • Gefällt mir
Reaktionen: cyberpirate
@visiothek
Nur wenn Windows mit einem im UEFI hinterlegten Key aktiviert wurde!
 
  • Gefällt mir
Reaktionen: [Wabbajack]
Ich würde das ganze gern ohne extra Tools wie Jeally Bean o. Ä. realisieren. Per Google habe ich nur diesen ellenlangen Hexwert in der Registry gefunden.

@areiland
Das Script spuckt mir leider nur "BBBBB-BBBBB-BBBBB-BBBBB-BBBBB" aus.

Ist die ProductID von Windows eigentlich an den Key gekoppelt? Dann wäre das ein brauchbares Merkmal für mich.
 
Nirsoft produkey.
 
@[Wabbajack]
Ersetze mal Zeile 2 des Scriptes durch diese Zeile: Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey\".

Ich hab jetzt kein Windows 7 zur Hand, damit ich nachsehen kann welcher Schlüssel bei Windows 7 der richtige ist und es gibt insgesamt deren drei, die in Frage kommen können.

Die Zeile Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey2\" könnte auch in Frage kommen.
 
[Wabbajack] schrieb:
Das Script spuckt mir leider nur "BBBBB-BBBBB-BBBBB-BBBBB-BBBBB" aus.
Das passiert immer dann, wenn für das Ausführen des Codes die enstprechende Berechtigung fehlt.

Man benötigt für das Auslesen des Produktschlüssels keine externen Tools. Auch das Installieren von Systemanalyseanwendungen ist nicht unbedingt notwendig, jedenfall nicht, wenn man nur den Key auslesen möchte.
Man verwendet dafür PowerShell und ich werde gleich den entsprechenden Code hier einstellen. Dauert aber noch einen Augenblick.

Auch die Verwendung eines .vbs-Codes ist so eine Sache. Würde ich anderen, aus Sicherheitsaspekten, auch nicht allgemein empfehlen, auch wenn ich selbst Skripte dieser Art verwenden würde.

------------------------------------------------------------------------------------------------------

Um diesen Prozess durchführen zu können, muss man im System mit Adminrechten angemeldet sein.

Vorgehensweise wie folgt:

PowerShell aufrufen
-> Suche -> powershell
den Fund mit rechter Maustaste markieren und "Als Administrator ausführen" anklicken.

Danach erfolgt die erste Eingabe. Damit setzt man die Ausführungsrichtlinie für PS fest:

PowerShell:
Set-ExecutionPolicy -Scope "LocalMachine" -ExecutionPolicy "RemoteSigned" -Force

Später sollte man die Richtlinie wieder auf standard setzen:

PowerShell:
Set-ExecutionPolicy -Scope "LocalMachine" -ExecutionPolicy "Restricted" -Force

Jetzt den gesamten Code, wie nachfolgend zu sehen, kopieren und in die PS-Konsole einsetzen.
-> Entertaste drücken

PowerShell:
$CPN = "$Env:COMPUTERNAME"
Function ConvertToKey([String]$CPN)
{
    $RegKey = [WMIClass] ("\\" + $CPN + "\root\default:StdRegProv")
    $RegVal = [Byte[]]($RegKey.GetBinaryValue(2147483650,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","DigitalProductId").uValue)

    $Chars = [Char[]]("B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9")
    $KeyStartIndex = [Int]52
    $KeyEndIndex = [Int]($KeyStartIndex + 15)

    $DecodeLength = [Int]29
    $DecodeStringLength = [Int]15
    $DecodedChars = New-Object Char[] $DecodeLength

    $HexPid = New-Object System.Collections.ArrayList

    For ($i = $KeyStartIndex; $i -Le $KeyEndIndex; $i++){[Void]$HexPid.Add($RegVal[$i])}

    For ($i = $DecodeLength - 1; $i -Ge 0; $i--)
    {            
        If (($i + 1) % 6 -Eq 0){$DecodedChars[$i] = '-'}
        Else
        {
            $DigitMapIndex = [Int]0

            For ($j = $DecodeStringLength - 1; $j -Ge 0; $j--)
            {
                $ByteValue = [Int](($DigitMapIndex * [Int]256) -Bor [Byte]$HexPid[$j]);
                $HexPid[$j] = [Byte] ([Math]::Floor($ByteValue / 24));
                $DigitMapIndex = $ByteValue % 24;
                $DecodedChars[$i] = $Chars[$DigitMapIndex];
            }
        }
    }
    $STR = "" 
    $DecodedChars | ForEach {$STR+=$_}
    $STR
}

$PrKey1Gen = "TY4CG-JDJH7-VJ2WF-DY4X9-HCFC6"
$PrKey2Gen = "VK7JG-NPHTM-C97JM-9MPGT-3V66T"
$PrID = (Get-WmiObject "Win32_OperatingSystem").SerialNumber
[String]$OemKey = (Get-WmiObject -Query "Select * from SoftwareLicensingService").OA3xOriginalProductKey
If ([String]::IsNullOrEmpty($OemKey))
{
    $DigiID = ConvertToKey .
    $ProdKey = $DigiID
    If ($ProdKey -Eq "$PrKey1Gen" -Or $ProdKey -Eq "$PrKey2Gen")
    {
        $ProdKey = "$ProdKey (Generiert)"
    }
    Else
    {
        $ProdKey = "$ProdKey (Retail)"
    }
}
Else
{
    $ProdKey = "$OemKey (OEM)"
}
cls
[String]$Value = "ProduktID.........: $PrID`r`n" `
+ "Produkt-Schlüssel.: $ProdKey"
$Value

Sowohl der Produktschlüssel, als auch die ProduktID sollten jetzt korrekt ausgegeben worden sein.

Dieser Code funktioniert bei Windows Vista und neuer.
Bei Windows 10 wird ebenfall der korrekte Key ausgegeben. Entweder der generierte, oder der echte Key.

Ist der Key bei Komplettgeräten im UEFI-Bios hinterlegt, funktioniert das Auslesen mit diesem Code ebenfalls.

Alles, wie immer, ohne Gewähr und auf eigenes Risiko.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben