Ключик WinXP/Win2003 Server
От: Блудов Павел Россия  
Дата: 16.06.03 12:08
Оценка: 101 (11)
Если кому интересно (чисто в исследовательских целях) какой ключ использовался при установке
WinXP или 2003 сервера на тот или иной компьютер, вот пожалуйста:

#define WINDOWS_KEY_LENGTH    30    // "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX\x0"

static int WINAPI ShuffleBytes(IN OUT PBYTE bData)
{
    int nRet = 0;

    for (int nByte = 14; nByte >= 0; --nByte)
    {
        nRet <<= 8;
        nRet += bData[nByte];

        bData[nByte] = (BYTE)(((__int64)nRet * 0x2AAAAAAB) >> 34);
        nRet %= 24;
    }

    return nRet;
}

static void ProcessKey(IN OUT PBYTE pData, OUT LPTSTR szKey)
{
    const LPCTSTR    szKeySymbols = _T("BCDFGHJKMPQRTVWXY2346789");

    for (int nSymbol = 24;; --nSymbol)
    {
        szKey[nSymbol] = szKeySymbols[ShuffleBytes(pData)];

        if (0 == nSymbol)
            break;

        if (0 == nSymbol % 5)
        {
            szKey--;
            szKey[nSymbol] = _T('-');
        }
    }
}

BOOL GetWindowsKey(OUT LPTSTR szKey, IN int nLen)
{
    if (nLen < WINDOWS_KEY_LENGTH)
        return ::SetLastError(ERROR_INSUFFICIENT_BUFFER), FALSE;

    const LPCTSTR    szKeyPath =  _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
    const LPCTSTR    szKeyName =  _T("DigitalProductID");

    HKEY            hKey;
    LONG            nSuccess;
    PBYTE            pData = NULL;
    DWORD            nDataLength = 0;

    nSuccess = ::RegOpenKey(HKEY_LOCAL_MACHINE, szKeyPath, &hKey);
    if (ERROR_SUCCESS != nSuccess)
        return FALSE;

    nSuccess = ::RegQueryValueEx(hKey, szKeyName, NULL, NULL, pData, &nDataLength);
    if (ERROR_SUCCESS == nSuccess && nDataLength)
    {
        pData = (PBYTE)_alloca(nDataLength);
        nSuccess = ::RegQueryValueEx(hKey, szKeyName, NULL, NULL, pData, &nDataLength);

        if (ERROR_SUCCESS == nSuccess)
        {
            ::RegCloseKey(hKey);

            szKey[29] = _T('\x0');
            szKey += 4;        // Room for 4 '-' symbols

            ProcessKey(pData + 52, szKey);
            return TRUE;
        }
    }

    // else
    DWORD dwError = ::GetLastError();
    ::RegCloseKey(hKey);
    return ::SetLastError(dwError), FALSE;
}

int _tmain(int, _TCHAR*[])
{
    TCHAR szKey[WINDOWS_KEY_LENGTH];
    if (GetWindowsKey(szKey, WINDOWS_KEY_LENGTH))
        _tprintf(_T("%s\n"), szKey);
    return 0;
}


Собственно, пример делает все то же самое, что утилитка ViewKeyXP.exe от Сергея Кандакова,
но работает не только на XP, но и на сервере.

Павел.
Re: тоже на [FS2][Managed C++]
От: Lepsik Индия figvam.ca
Дата: 14.12.05 14:43
Оценка:
using namespace System;
using namespace System::Text;
using namespace Microsoft::Win32;


namespace Util 
{
    static Byte ShuffleBytes( Byte bytes[] )
    {
        int nRet = 0;

        for(int nByte = 14; nByte >= 0; --nByte)
        {
            nRet = nRet << 8;
            Byte indx = bytes[nByte];
            nRet += indx;
            Byte rs = (Byte)(((__int64)nRet * 0x2AAAAAAB) >> 34);
            bytes[nByte] = rs;
            nRet = nRet % 24;
        }
        return nRet;
    }
    static void ProcessKey( Byte bytes[], array<Byte>^ szKey )
    {
        Byte szKeySymbols[] = "BCDFGHJKMPQRTVWXY2346789";
        int shift = 4;
        int pointer = 0;
        for( int nSymbol = sizeof(szKeySymbols)-1; ; --nSymbol )
        {
            Byte index = ShuffleBytes(bytes);
            szKey[pointer+nSymbol+shift] = szKeySymbols[ index ];
            if( 0 == nSymbol )
            {
                break;
            }
            if( 0 == nSymbol % 5 )
            {
                pointer-- ;
                szKey[pointer+nSymbol + shift] = '-';
            }
        }
    }
    String^ GetWindowsKey( const int nLen )
    {
        if (nLen < WINDOWS_KEY_LENGTH)
        {
        //    return ::SetLastError(ERROR_INSUFFICIENT_BUFFER), FALSE;
            return L"";
        }
        array<Byte>^ szKey = gcnew array<Byte>(30);
        Byte ptr[] = "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX\x0"; 
        for(int i = 0; i < szKey->Length; i++ )
        {
            szKey[i] = ptr[i]; 
        }
        
        String^        szKeyPath =  L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
        String^        szKeyName =  L"DigitalProductID";

        RegistryKey^ HKLM = Registry::LocalMachine;
        RegistryKey^ reg = HKLM->OpenSubKey( szKeyPath, false );

        String^ CurrentVersion = reg->GetValue(L"CurrentVersion")->ToString();
        String^ ProductName = reg->GetValue( L"ProductName" )->ToString();
        array<Byte>^ Bytes = (array<Byte>^)reg->GetValue( szKeyName );

        if( Bytes->Length )
        {
            Byte *pData = new Byte[ Bytes->Length ];
            for(int i = 0; i < Bytes->Length; i++ )
            {
                pData[i] = Bytes[i];
            }
            reg->Close();
            szKey[29] = L'\x0';
            ProcessKey( pData + 52, szKey );

            Encoding^ ascii = Encoding::ASCII;
            Encoding^ unicode = Encoding::Unicode;

            array<Char>^asciiChars = gcnew array<Char>(ascii->GetCharCount( szKey, 0, szKey->Length ));
            ascii->GetChars( szKey, 0, szKey->Length, asciiChars, 0 );
            String^ asciiString = gcnew String( asciiChars );

            delete [] pData;
            return asciiString;
        }
        return L"";
    }

}
Re: Ключик WinXP/Win2003 Server
От: wildwind Россия  
Дата: 14.12.05 14:55
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Если кому интересно (чисто в исследовательских целях) какой ключ использовался при установке

БП>WinXP или 2003 сервера на тот или иной компьютер, вот пожалуйста:

А паленые она определяет?
Re: Ключик WinXP/Win2003 Server
От: retn нет
Дата: 14.12.05 15:37
Оценка: 57 (6)
Интересно, а такой вариант на сервере заработает?


<html>
<!--********************************************************************
'*
'*        File: xpkey.hta
'*        Created: 2005.12.08
'*        Version: 1.0
'*
'********************************************************************-->
<title>xpkey</title>
<HTA:APPLICATION
 ID="xpkey"
 APPLICATIONNAME="xpkey"
 SCROLL="no"
 maximizeButton="no"
 version="1.0"
 SINGLEINSTANCE="yes"
 WINDOWSTATE="normal"
 SCROLLFLAT="yes"
 INNERBORDER="no"
 ICON=""/>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<style>
body
{
 background-color: buttonface;
 font-family: Helvetica;
 font-size: 8pt;
 margin-top: 10px;
 margin-left: 10px;
 margin-right: 10px;
 margin-bottom: 10px;
}
</style>
<script language="jscript">
function window.onload()
{
    self.focus();
    self.resizeTo(400,170);
}

//"ProductId"="76487-640-0174977-23796"
//"DigitalProductId"=hex:
//  a4,00,00,00,03,00,00,00,37,36,34,38,37,2d,36,34,
//  30,2d,30,31,37,34,39,37,37,2d,32,33,37,39,36,00,
//  2e,00,00,00,41,32,32,2d,30,30,30,30,31,00,00,00,
//  00,00,00,00,
//              b2,c8,4b,cc,a5,3f,7d,d3,87,bc,0e,54,
//  36,8a,00,
//           00,00,00,00,00,1a,72,4b,43,90,c1,51,00,
//  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
//  00,00,00,00,00,00,00,00,37,32,36,32,31,00,00,00,
//  00,00,00,00,e6,17,00,00,45,3a,0d,a8,ff,03,00,00,
//  f5,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
//  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
//  c1,6b,73,e5
//"LicenseInfo"=hex:33,b7,21,9d,7e,35,40,38,4f,7c,7e,c6,15,f6,70,d2,a3,f9,cf,90,\
//  86,63,0f,79,7f,f0,04,79,4a,12,1a,33,9e,20,b1,64,ce,b1,0f,5a,8d,1e,b4,b0,4b,\
//  57,da,aa,82,ea,f4,37,90,e3,05,11
var strComputer = ".";
var HKEY_LOCAL_MACHINE    = 0x80000002
var HKEY_CURRENT_USER        = 0x80000001

//alert(window.location.pathname.substr(0,window.location.pathname.lastIndexOf("\\")+1));

var WshShell = new ActiveXObject("WScript.Shell"); 
var bTempKey = VBArray(WshShell.RegRead("HKLM\\SOFTWARE\\MICROSOFT\\Windows NT\\CurrentVersion\\DigitalProductId")); 
var bKey = new Array 
bKey = bTempKey.toArray(); 

function GetKey()
{
    //debugger;
    document.getElementById("jskey").value = XPKeyFromProductId(bKey);
}

function XPKeyFromProductId(bKey)
{
    var KeyBase = new Array('B', 'C', 'D', 'F', 'G', 'H', 'J','K', 'M', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9'); 
    var dLen = 29; 
    var sLen = 15; 
    var Dst = new Array(dLen); 
    var StartOffset = 0x34; 
    var EndOffset = 0x34 + 15 
    var Src = new Array(15); 
     
    for (var i = StartOffset; i<=EndOffset; i++) 
    { 
        Src[i-StartOffset] = bKey[i]  
    } 
    for (var i = dLen - 1; i>=0; i--) 
    { 
        if (((i + 1) % 6) == 0) 
        { 
            Dst[i] = '-'; 
        } 
        else 
        { 
            var HN = 0; 
            for (var n = sLen - 1; n>=0; n--) 
            { 
                var Value = (HN << 8) | Src[n]; 
                Src[n] = Value / 24; 
                HN = Value % 24; 
            } 
            Dst[i] = KeyBase[HN]; 
        } 
    } 
    var str = ""; 
    for (i = 0; i<=dLen-1; i++) 
    { 
    str += Dst[i]; 
    }
    return str;
}

function changeKey()
{
    var prod_key = document.getElementById("newkey").value;
    var re = new RegExp("[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" + 
                                        "[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" + 
                                        "[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" + 
                                        "[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" + 
                                        "[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]");
    if(!re.test(prod_key))
    {
        alert("Invalid Product Key!");
        return;
    }
    prod_key = prod_key.replace(/-/,"")
    var objProdActiv = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf ("win32_WindowsProductActivation");
    var vret = 0;
    for(var _enum=new Enumerator(objProdActiv);!_enum.atEnd();_enum.moveNext())
    {
        var objItem = _enum.item();
        try
        {
            vret = objItem.SetProductKey(prod_key);
            alert("Your product key has been successfully updated.");
        }
        catch(e)
        {
            alert("An error has occurred. This was probably caused by the keying of an invalid number. Please check it and try again.");
        }
    }
}
</script>

</head>
<body>
<table>
    <td>
            <hr>    
        <input type="button" onclick="GetKey()" title="" value="Get Key" style="font-family:Verdana;font-size:12px;width:90px;">&nbsp;&nbsp;&nbsp;
          <input style="font-family:Verdana;font-size:12px;" size="40" type="text" id="jskey" />
          <br/><hr>
        <input type="button" onclick="changeKey()" title="" value="Change Key" style="font-family:Verdana;font-size:12px;width:90px;">&nbsp;&nbsp;&nbsp;
          <input style="font-family:Verdana;font-size:12px;" size="40" type="text" id="newkey" />
          <br />
    </td>
  </tr>
</table>
</body>
</html>
... << RSDN@Home 1.2.0 alpha rev. 622>>
Re[2]: Ключик WinXP/Win2003 Server
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.12.05 16:17
Оценка:
Здравствуйте, retn, Вы писали:

R>Интересно, а такой вариант на сервере заработает?


угу
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Ключик WinXP/Win2003 Server
От: Блудов Павел Россия  
Дата: 15.12.05 03:46
Оценка:
Здравствуйте, wildwind, Вы писали:

W>А паленые она определяет?


Нет. PIDGEN.DLL Вам в руки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Ключик WinXP/Win2003 Server
От: RealFduch  
Дата: 31.05.06 01:27
Оценка: :)
А нет ли честной "заковыривалки ключа" без objItem.SetProductKey(prod_key);? А то он не принимает ключ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.