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); } |
Comments