Microsoft Product Key Enumeration - Windows 10 ?

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Microsoft Product Key Enumeration - Windows 10 ?

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by Gucky_87 » 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.

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by just me » 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.

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by Gucky_87 » 09 Nov 2017, 05:22

Also ich nehm dafür "Produkey". Das kostet nix und macht genau, was ich will - Auch unter Windows 10.

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by just me » 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.

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by moefr01 » 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:

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by just me » 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.

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by moefr01 » 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:

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by just me » 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.

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by moefr01 » 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.

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by just me » 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?

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by moefr01 » 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:

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by just me » 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)?

Re: Microsoft Product Key Enumeration - Windows 10 ?

Post by moefr01 » 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:

Microsoft Product Key Enumeration - Windows 10 ?

Post by moefr01 » 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

Top