GetWindowsProductKey

#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;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值