#include <stdio.h>
#include <windows.h>
#include <assert.h>
char* DecodeProductKey(BYTE digitalProductId[])
{
static const 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
static const int decodeLength = 29;
// Length of decoded product key in byte-form.
// Each byte represents 2 chars.
static const int decodeStringLength = 15;
// Array of containing the decoded product key.
char* decodedChars = new char[decodeLength+1];
ZeroMemory(decodedChars,decodeLength+1);
// Extract byte 52 to 67 inclusive.
for (int 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)digitalProductId[j];
digitalProductId[j] = (byte)(byteValue / 24);
digitMapIndex = byteValue % 24;
decodedChars[i] = digits[digitMapIndex];
}
}
}
return decodedChars;
}
char* DecodeProductKey2(BYTE digitalProductId[])
{
int i; //Counter
int j; //Convert
int nCur; //XOR calculate
static const char *KeyChars[] = {"B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9",NULL};
char* decodedChars = new char[30];
ZeroMemory(decodedChars,30);
for(i=24; i >= 0; --i)
{
nCur = 0;
for(j=14; j >= 0; --j)
{
nCur = (nCur * 256) ^ digitalProductId[j];
digitalProductId[j] = nCur / 24;
nCur %= 24;
}
strcat(decodedChars, KeyChars[nCur]);
if( !(i % 5) && i )
strcat(decodedChars, "-");
}
return decodedChars;
}
char* GetWindowsProductKey()
{
HKEY hKey=NULL;
BOOL bRet=FALSE;
static DWORD Type = REG_BINARY;
PBYTE pVauleData = NULL;
LONG cbBuffSize=0;
LONG cbValue=0;
BOOL RegResult = FALSE;
BYTE ProductKeyExtract[15]={0}; //Extract Key
char* decodedChars=NULL;
do
{
RegResult=RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),NULL,KEY_QUERY_VALUE|KEY_WOW64_64KEY,&hKey);
if (ERROR_SUCCESS != RegResult)
{
assert(FALSE);
break;
}
//查询键值
RegResult=RegQueryValueEx(hKey, TEXT("DigitalProductId"), NULL,&Type,pVauleData,(LPDWORD)&cbValue);
if (ERROR_SUCCESS != RegResult)
{
assert(FALSE);
break;
}
//分配内存
cbBuffSize=cbValue+sizeof(BYTE);
pVauleData = new BYTE[cbBuffSize];
if (pVauleData==NULL)
{
assert(FALSE);
break;
}
//查询键值
ZeroMemory(pVauleData, cbBuffSize);
RegResult = RegQueryValueEx(hKey, TEXT("DigitalProductId"), NULL, &Type,pVauleData, (LPDWORD)&cbValue);
if (ERROR_SUCCESS != RegResult || cbValue<=0)
{
assert(FALSE);
break;
}
bRet=TRUE;
} while (FALSE);
if (hKey)
{
RegCloseKey(hKey);
}
if (!bRet)
{
return NULL;
}
memcpy(ProductKeyExtract, pVauleData+52, 15);
if(pVauleData) delete []pVauleData;
//decodedChars=DecodeProductKey(ProductKeyExtract);
//_strrev(decodedChars);
decodedChars=DecodeProductKey2(ProductKeyExtract);
return decodedChars;
}
int main(void)
{
printf("%s\n",GetWindowsProductKey());
getchar();
getchar();
return 0;
}
GetWindowsProductKey
最新推荐文章于 2023-07-16 09:07:58 发布