|| Author: RadiatioN/EOF || Back to sources || View project folder ||
/*

With this small code you can get windows and office serials which are stored in the registry.
This code also decodes and formats them to a real serial.
The code will show you:
- Serial
- Product Name (if it exists)
- ProductId

No Copyright - free for any use

Written by RadiatioN in September-October 2006

Zine and group site:
EOF - Electrical Ordered Freedom
http://www.eof-project.net

My site:
RadiatioN's VX World
http://radiation.eof-project.net

Contact:
radiation[at]eof-project[dot]net

some nice greetings to Sky my good friend :)

*/

#include "stdafx.h"

void ConvertProductKey(char *szKey)
{
	char szTemp[35]="";
	int iPos=0;

	strcpy(szTemp,szKey);

	memset(szKey, 0, 30);
	
	szKey[5]='-';
	szKey[11]='-';
	szKey[17]='-';
	szKey[23]='-';

	for(int i=0; i<5; i++)
	{
		szKey[i]=szTemp[iPos];
		iPos+=1;
	}

	for(int i=6; i<11; i++)
	{
		szKey[i]=szTemp[iPos];
		iPos+=1;
	}

	for(int i=12; i<17; i++)
	{
		szKey[i]=szTemp[iPos];
		iPos+=1;
	}

	for(int i=18; i<23; i++)
	{
		szKey[i]=szTemp[iPos];
		iPos+=1;
	}

	for(int i=24; i<=29; i++)
	{
		szKey[i]=szTemp[iPos];
		iPos+=1;
	}
}

void DecodeMSKey(HKEY hKey, char *szSubkey)
{
    char szDigits[] = {'B','C','D','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9'},
		szResult[35]="\0",
		szProductName[250]="", 
		szProductID[250]="";
    PUCHAR wszBuf = new UCHAR[200];
    HKEY key = NULL;
    DWORD dwDatasize = 200, dwRet = 0;

    for(int a=0; a<200; a++)
	{
		wszBuf[a]=0;
	}

    dwRet = RegOpenKeyEx(hKey, szSubkey, 0, KEY_READ, &key);
    dwRet = RegQueryValueEx(key, "DigitalProductID", NULL, NULL, (LPBYTE)wszBuf, &dwDatasize);
   
    if (dwRet != ERROR_SUCCESS) 
	{
	   return;
    }

    for (int i=24; i>=0; i--) 
	{
        int x=0;

        for (int j=14; j>=0; j--) 
		{
            x = (x<<8) + (wszBuf+0x34)[j];
            (wszBuf+0x34)[j] = x / 24;
            x = x % 24;
        }
        szResult[i]=szDigits[x];
    }

	ConvertProductKey(szResult);

    dwDatasize=250;
	RegQueryValueEx(key, "ProductName", NULL, NULL, (LPBYTE)szProductName, &dwDatasize);

    dwDatasize=250;
	RegQueryValueEx(key, "ProductId", NULL, NULL, (LPBYTE)szProductID, &dwDatasize);
    
	printf("Serial:      %s\r\n", szResult);
	printf("ProductName: %s\r\n", szProductName);
	printf("ProductId:   %s\r\n\r\n", szProductID);

	RegCloseKey(key);
}

void EnumOfficeKey(char *szSubkey)
{
	HKEY hMainKey;
	LONG lRetVal;
	int iPos=0;
	char szKeyName[512]="", szNewKey[512]="";
	DWORD dwKeyNameLen;

	lRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, 0, KEY_ALL_ACCESS, &hMainKey);

	if(lRetVal == ERROR_SUCCESS)
	{
		dwKeyNameLen=512;
		
		if(RegEnumKeyEx(hMainKey, iPos, szKeyName, &dwKeyNameLen, NULL, NULL, NULL, NULL)!=ERROR_NO_MORE_ITEMS)
		{
			do
			{
				if(strcmp(szSubkey, "")!=0)
				{
					strcpy(szNewKey, szSubkey);
					strcat(szNewKey, "\\");
					strcat(szNewKey, szKeyName);
				}
				else
				{					
					strcpy(szNewKey, szKeyName);
				}

				DecodeMSKey(HKEY_LOCAL_MACHINE, szNewKey);

				iPos+=1;
				dwKeyNameLen=512;

			}while(RegEnumKeyEx(hMainKey, iPos, szKeyName, &dwKeyNameLen, NULL, NULL, NULL, NULL)!=ERROR_NO_MORE_ITEMS);
		}
	}

	RegCloseKey(hMainKey);
}

void GetMSProductKeys(void)
{
	//WINDOWS serials
	DecodeMSKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
	DecodeMSKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion");

	//OFFICE serials
	EnumOfficeKey("SOFTWARE\\Microsoft\\Office\\8.0\\Registration");
	EnumOfficeKey("SOFTWARE\\Microsoft\\Office\\9.0\\Registration");
	EnumOfficeKey("SOFTWARE\\Microsoft\\Office\\10.0\\Registration");
	EnumOfficeKey("SOFTWARE\\Microsoft\\Office\\11.0\\Registration");
}

int main(int argc, char* argv[])
{
	GetMSProductKeys();

	_getch();

	return 0;
}