Microsoft Product Key Enumeration - Windows 10 ?

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
moefr01
Posts: 115
Joined: 25 Nov 2015, 09:01
Location: Germany

Microsoft Product Key Enumeration - Windows 10 ?

04 Jul 2016, 10:10

Liebe AHK-Freunde,
bin auf der Suche nach einer Möglichkeit zur Anzeige des product-key's für Windows 10... bzw. der Entschlüsselung des eigenen, aktivierten Schlüssels aus der registry. Im Archiv-Board habe ich folgendes gefunden (die Entschlüsselung klappt zwar unter Windows 10 Pro 32/64 Bit, zeigt aber nicht den richtigen Code):
https://autohotkey.com/board/topic/7327 ... on-script/
Hat denn jemand bereits damit experimentiert, bzw. eine Lösung oder Korrektur des Archivscripts von Isavell (...Danke!) parat?
:wave: moefr01
User avatar
moefr01
Posts: 115
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

04 Nov 2017, 06:23

Hi AHK-Coder,
nachdem ich nun etwas Luft :o für die Aktualisierung vergangener Scripte hatte, bin ich selber fündig geworden und habe folgendes Script gebastelt:

Code: Select all

; Embedded VBScript to get the Windows(R) 7/8.x/10 DigitalProductID (registry) converting to Product Key
myVBScript =
(
Set WshShell = WScript.CreateObject("WScript.Shell")
RegKeyPath   = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"
ProductKey   = ConvertKey(WshShell.RegRead(RegKeyPath))
MsgBox ProductKey, , "My Windows Product-Key:"

Function ConvertKey(KeyInput)
  Const KeyOffset = 52
  Dim isW8, i, x, Cur, KeyOutput, Last, keypart1, insert
  'If Windows >= 8:
  isW8 = (KeyInput(66) \ 6) And 1
  KeyInput(66) = (KeyInput(66) And &HF7) Or ((isW8 And 2) * 4)
  i = 24
  Chars = "BCDFGHJKMPQRTVWXY2346789"
  Do
    Cur = 0
    x = 14
    Do
      Cur = Cur * 256
      Cur = KeyInput(x + KeyOffset) + Cur
      KeyInput(x + KeyOffset) = (Cur \ 24) And 255
      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 
  keypart1 = Mid(KeyOutput, 2, Last)
  insert = "N"
  KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
  If Last = 0 Then KeyOutput = insert & KeyOutput
  ConvertKey = Mid(KeyOutput, 1, 5) & "-" & Mid(KeyOutput, 6, 5) & "-" & Mid(KeyOutput, 11, 5) & "-" & Mid(KeyOutput, 16, 5) & "-" & Mid(KeyOutput, 21, 5)
  
End Function
)
FileAppend, %myVBScript%, ProductKey.vbs 
RunWait,    ProductKey.vbs
FileDelete, ProductKey.vbs
ExitApp
o.a. Code nutzt VBScript für das Lesen und Konvertieren der ProductID aus der Registry von Windows 7, 8.x und 10 (FUNKTIONSTÜCHTIG: Windows 10 Pro 1709.16299.19)
Da sich mir VBScript noch nicht sooo erschlossen hat :wtf: , baute ich den Code in AHK ein und starte diesen darüber. Das VBS-Script wird nach Ausführung dessen wieder gelöscht.

Mein Anliegen: Wer kann mir den implantierten VBScript-Code in puren AHK-Code umwandeln ???

moefr01 :wave:
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

06 Nov 2017, 04:25

Moin,
moefr01 wrote:Da sich mir VBScript noch nicht sooo erschlossen hat :wtf: , ...
Da bin ich ganz auf Deinem Stand. Dennoch sollte es nicht zu schwer sein. Dein VB-Code vermittelt den Eindruck, als ob Microsoft (zumindest) für den Key eine BASE24 Kodierung verwendet. In VB liefert RegRead ein 0-basiertes Array von Integer-Werten im Bereich von 0x00 - 0xFF. AHK liefert einen Hex-String.

Ich habe allerdings noch ein Problem mit:

Code: Select all

  isW8 = (KeyInput(66) \ 6) And 1
  KeyInput(66) = (KeyInput(66) And &HF7) Or ((isW8 And 2) * 4)
Nach meinem bisherigen Verständnis liefert (KeyInput(66) \ 6) And 1 auch in VB immer 0 oder 1. Was genau macht dann (isW8 And 2)?
User avatar
moefr01
Posts: 115
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

06 Nov 2017, 13:32

hey just me,
habe das VBScript gegoogelt... der ominöse Code setzt die Variablen isW8 und KeyInput(66) auf 1... ebenso bei Windows 8.1 und 10, jedoch nicht bei 7.
Die ProductId-Werte in der Registry sind unter VB mit &HF7 (dec 247) maskiert und werden 14 mal ausgelesen (x).
Bei meinen kläglichen Versuchen :headwall: die Do ... Loop While - Schleifen mit AHK-Code Loop { while } oder Loop ( until ) zu ersetzen kommt nix raus:

Code: Select all

RegRead, DigitalID, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows NT\CurrentVersion, DigitalProductId
ProductKey := ConvertToKey(DigitalID)
MsgBox, %ProductKey%

ConvertToKey(Key) {
    KeyOffset := 52
    ;isWin8 := (Key[66] // 6) And 1
    ;Key(66) := (Key[66] And &HF7) Or ((isWin8 And 2) * 4)
    isWin8 := 1
    Key[66] := 1
    i := 24
    Chars := "BCDFGHJKMPQRTVWXY2346789"
    Loop {
          Cur := 0
          X := 14
          Loop {
                Cur := Cur * 256
                Cur := Key[X + KeyOffset] + Cur
                Key[X + KeyOffset] := (Cur // 24)
                Cur := Mod(Cur, 24)
                X -= 1
              } While X >= 0
          i -= 1
          KeyOutput := SubStr(Chars, Cur + 1, 1) & KeyOutput
          Last := Cur
         } While i >= 0
    If (isWin8 = 1)
      {
        keypart1 := SubStr(KeyOutput, 2, Last)
        insert := "N"
        KeyOutput := StrReplace(KeyOutput, keypart1, keypart1 & insert, 2, 1)
        If Last := 0
          KeyOutput := insert & KeyOutput
      }
    a := SubStr(KeyOutput, 1, 5)
    b := SubStr(KeyOutput, 6, 5)
    c := SubStr(KeyOutput, 11, 5)
    d := SubStr(KeyOutput, 16, 5)
    e := SubStr(KeyOutput, 21, 5)
    ConvertToKey := a "-" b "-" c "-" d "-" e
}
Die Variablen isW8 und Key[66] := 1 umgehen den ominösen Code und erzeugen unter VB den richtigen ProductKey, aber nicht unter AHK... Beim Debuggen des VB-codes mit msgbox lese ich in der Variablen Cur dezimale Werte, beim AHK-Code nix. Stimmt die Syntax meines AHK-codes?
moefr01 :wave:
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

07 Nov 2017, 03:33

Moin,

ich habe hier etwas, das auf meinem Rechner einen Key ausgibt, der mit dem des VB-Skripts identisch ist. Um erst einmal möglichst nahe am VB-Skript zu bleiben, habe ich dabei den Hex-String aus RegRead in ein 0-basiertes Array übertragen. Der 'ominöse' Code ist noch drin, ich habe aber nach wie vor Zweifel am Sinn von | ((IsW8 & 2) * 4), zumindest in AHK. Das Arrayelement 66 wird hier auf 1 gesetzt, weil das Element den Wert 9 enthält (9 & 0xF7 = 1). Du kannst ja probieren, ob Dein Workaround Key[66] := 1 zuverlässig funktioniert:

Code: Select all

#NoEnv
MsgBox, % GetWinProductKey()
ExitApp
GetWinProductKey() {
   Static Chars := "BCDFGHJKMPQRTVWXY2346789"
   Static Insert := "N"
   Static KeyOffset := 52
   ProductKeyArray := []
   RegRead, ProductKey, HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion, DigitalProductId
   Loop, % (StrLen(ProductKey) // 2) {
      I := A_Index - 1
      ProductKeyArray[I] := "0x" . SubStr(ProductKey, (I * 2) + 1, 2)
   }
   IsW8 := (ProductKeyArray[66] // 6) & 1
   ProductKeyArray[66] := (ProductKeyArray[66] & 0xF7) | ((IsW8 & 2) * 4)
   I := 24
   KeyOutput := ""
   While (I >= 0) {
      Cur = 0
      X := 14
      While (X >= 0) {
         Cur := Cur * 256
         Cur := ProductKeyArray[X + KeyOffset] + Cur
         ProductKeyArray[X + KeyOffset] := (Cur // 24) & 0xFF
         Cur := Mod(Cur, 24)
         X--
      }
      KeyOutput := Substr(Chars, Cur + 1, 1) . KeyOutput
      Last := Cur
      I--
   }
   KeyPart1 := SubStr(KeyOutput, 2, Last)
   KeyOutput := StrReplace(SubStr(KeyOutput, 2), KeyPart1, KeyPart1 . Insert, , 1)
   If (Last = 0)
      KeyOutput := Insert . KeyOutput
   Return SubStr(KeyOutput, 1, 5) . "-" . SubStr(KeyOutput, 6, 5) . "-" . SubStr(KeyOutput, 11, 5) . "-"
        . SubStr(KeyOutput, 16, 5) . "-" . SubStr(KeyOutput, 21, 5)
}
Hast Du noch den Link für das VB-Skript?
User avatar
moefr01
Posts: 115
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

07 Nov 2017, 04:52

Hey hey just me,

hier der gewünschte link: https://stackoverflow.com/questions/313 ... ean-in-vbs

Super... dein Code (ist so aufgeräumt! :clap:) funktioniert soweit gut. Ich habe festgestellt, dass der ausgelesene ProductKey auf einem Windows 7 Pro 64Bit-System sich wie folgt jeweils nur am Anfang unterscheidet:

mit VBScript-Code: CVMQH - ...
mit AHK-Code: VNMQH - ...

Scheint so, dass die Berechnung | ((IsW8 & 2) * 4) doch irgendwie relevant ist.

Microsoft hat auch zu Zeiten Windows 7 den ProductKey anders verschlüsselt - ich hatte mal einen alten VBS-Code, der damals funktionierte, heute aber nicht mehr... siehe auch im Code das replacement mit dem Buchstabe "N" für Windows 8.x und 10.
Bei einem Windows 10 Pro 64Bit-System jedenfalls passt der key.
Test 2 - Windows 7 Pro 64Bit: Beim Weglassen von | ((IsW8 & 2) * 4) oder Key[66] := 1 wird wiederrum der falsche key angezeigt (VNMQH - ...).
Element 66 ist laut registry bei Windows 7 Pro eine 0 ... bei Windows 10 eine 9.
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

07 Nov 2017, 06:24

Code: Select all

    If (isWin8 = 1)
      {
        keypart1 := SubStr(KeyOutput, 2, Last)
        insert := "N"
        KeyOutput := StrReplace(KeyOutput, keypart1, keypart1 & insert, 2, 1)
        If Last := 0
          KeyOutput := insert & KeyOutput
      }
Die Bedingung (isWin8 = 1) fehlt Deinem VB-Skript und ist deshalb auch nicht in der AHK-Version enthalten. Du kannst das aber mal selbst in die AHK-Version einbauen.
User avatar
moefr01
Posts: 115
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

07 Nov 2017, 06:57

hab' ich da womöglich voll übersehen... passiert!

Deine Info wahr goldrichtig, jetzt klappt's auch mit dem Auslesen des ProductKeys für Windows 7.

Hier der angepasste und verifizierte Code:

Code: Select all

; ProductKey von Windows 7, 8.x, 10 auslesen
#NoEnv
MsgBox, % GetWinProductKey()
ExitApp
GetWinProductKey() {
   Static Chars := "BCDFGHJKMPQRTVWXY2346789"
   Static KeyOffset := 52
   ProductKeyArray := []
   RegRead, ProductKey, HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion, DigitalProductId
   Loop, % (StrLen(ProductKey) // 2) {
      I := A_Index - 1
      ProductKeyArray[I] := "0x" . SubStr(ProductKey, (I * 2) + 1, 2)
   }
   IsW8 := (ProductKeyArray[66] // 6) & 1
   ProductKeyArray[66] := (ProductKeyArray[66] & 0xF7) | ((IsW8 & 2) * 4)
   I := 24
   KeyOutput := ""
   While (I >= 0) {
      Cur := 0
      X := 14
      While (X >= 0) {
         Cur := Cur * 256
         Cur := ProductKeyArray[X + KeyOffset] + Cur
         ProductKeyArray[X + KeyOffset] := (Cur // 24) & 0xFF
         Cur := Mod(Cur, 24)
         X--
      }
      KeyOutput := Substr(Chars, Cur + 1, 1) . KeyOutput
      Last := Cur
      I--
   }
   If (IsW8 = 1)
     {
      KeyPart1 := SubStr(KeyOutput, 2, Last)
      Insert := "N"
      KeyOutput := StrReplace(SubStr(KeyOutput, 2), KeyPart1, KeyPart1 . Insert, , 1)
      If Last := 0
        KeyOutput := Insert & KeyOutput
     }
   Return SubStr(KeyOutput, 1, 5) . "-" . SubStr(KeyOutput, 6, 5) . "-" . SubStr(KeyOutput, 11, 5) . "-"
        . SubStr(KeyOutput, 16, 5) . "-" . SubStr(KeyOutput, 21, 5)
}
:bravo: moefr01 sagt artig schankedön für die prompte Hilfe :wave:
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

07 Nov 2017, 08:08

Gut, das es funktioniert. Hast Du eine Chance, den gelieferten Aktivierungskey zu prüfen? Alle Skriptversionen, die ich noch gefunden habe, geben schließlich immer irgendetwas zurück, das wie ein Aktivierungskey aussieht.
User avatar
moefr01
Posts: 115
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

07 Nov 2017, 11:52

Konnte heute meinen barebone mit gekaufter Softwarebuilder-Lizenz für Windows 10 Pro 64Bit und einen älteren Asus-Laptop mit aufgeklebter OEM-Lizenz für Windows 7 Pro 64Bit erfolgreich verifizieren. Mit der "Microsoft PID Checker"-Anwendung kann man auch Keys manuell eingeben und auf Gültigkeit prüfen lassen ... gerade erfolgreich ausprobiert. Ansonsten kannst Du mit "slmgr.vbs -dlv" deinen Aktivierungsstatus abfragen > https://msdn.microsoft.com/de-de/librar ... s.11).aspx
Sobald ich wieder einen PC mit aufgeklebtem COA in die Finger bekomme (Home und 32Bit ...) lasse ich das AHK-script drüberlaufen und poste das Ergebnis.

ProductKey VERIFIZIERUNG:
- Windows 10 Professional 64 Bit, deutsch, Version 1709 Build 16299.19 :thumbup:
- Windows 10 Home 32 Bit, deutsch, Version 1709 Build 16299.19 :thumbup:
- Windows 7 Home 32 Bit, deutsch, Version 6.1 Build 7601.23914 :thumbup:
- Windows 7 Professional 64 Bit, deutsch, Version 6.1 Build 7601.23914 :thumbup:
Last edited by moefr01 on 10 Nov 2017, 12:01, edited 2 times in total.
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

07 Nov 2017, 13:00

Wirklich spannend ist, ob das so auch für Win 8(.1) funktioniert. Man müsste herausfinden, welchen Inhalt das Feld 66 da hat.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Microsoft Product Key Enumeration - Windows 10 ?

09 Nov 2017, 05:22

Also ich nehm dafür "Produkey". Das kostet nix und macht genau, was ich will - Auch unter Windows 10.
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Microsoft Product Key Enumeration - Windows 10 ?

09 Nov 2017, 05:53

Moin Gucky,

ich habe beim Recherchieren auch einige Tools gefunden. Ich bin mir aber inzwischen ziemlich sicher, dass die eine sehr ähnliche Methode vewenden. Und schließlich: Nur bei Software, die man selbst geschrieben hat bzw. deren Sourcecode man kennt und lesen kann, weiß man genau, was sie tut.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Microsoft Product Key Enumeration - Windows 10 ?

09 Nov 2017, 07:44

Das ist natürlich klar, keine Frage.
Außerdem ist es ja auch eine Bereicherung für die AHK Community, wenn sich das auch mit AHK lösen lässt.

Gucky.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 31 guests