Windows のProduct IDの正確な記録場所

GitHub - mrpeardotnet/WinProdKeyFinder: Windows Product Key Finder written in C#.
オープンソース のProduct ID 抽出ツールってあるんですね。
それを見て初めてProduct ID の場所を知りました

IEのレジストリである
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Registration
DigitalProductId の 52 バイト目から 67バイト目を
BCDFGHJKMPQRTVWXY2346789 の24文字で復号するとOSのProductId になるのが確認出来ました

VC++で書くとこんな感じ(ちょっと手抜き)

void DecodeProductKey(BYTE *digitalProductId, char *outstr)
{
  int i;
// Offset of first byte of encoded product key in
// 'DigitalProductIdxxx" REG_BINARY value. Offset = 34H.
  const int keyStartIndex = 52;
// Offset of last byte of encoded product key in
// 'DigitalProductIdxxx" REG_BINARY value. Offset = 43H.
  const int keyEndIndex = keyStartIndex + 15;
// Possible alpha-numeric characters in product key.
  char 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',
  };
// Length of decoded product key
  const int decodeLength = 29;
// Length of decoded product key in byte-form.
// Each byte represents 2 chars.
  const int decodeStringLength = 15;
// Array of containing the decoded product key.
  char *decodedChars = new char[decodeLength];
// Extract byte 52 to 67 inclusive.
  BYTE hexPid[2560]={0};// = new ArrayList();
  for (i = keyStartIndex; i <= keyEndIndex; i++)
  {
    hexPid[i-52]=digitalProductId[i];
  }
  decodedChars[decodeLength]=0;
  for (i = decodeLength - 1; i >= 0; i--)
  {
// Every sixth char is a separator.
    if ((i + 1) % 6 == 0)
    {
      decodedChars[i] = '-';
    }
    else
    {
// Do the actual decoding.
      int digitMapIndex = 0;
      for (int j = decodeStringLength - 1; j >= 0; j--)
      { 
        int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
        hexPid[j] = (byte)(byteValue / 24);
        digitMapIndex = byteValue % 24;
        decodedChars[i] = digits[digitMapIndex];
      }
    }
  }
  lstrcpy(outstr,decodedChars);
}

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です