Форум - Ответы     (  К темам )
 ?  Igos: Привязка ПО к машине (31-03-2003 13:01:48)
Хотелось бы узнать привязывает ли кто ПО к железу, и если да - то как ?
Я например делаю это сл. образом: получаю VolumeSerialNumber, с помощью CryptoApi, шифрую эти данные, добавляя в опр. месте некоторые постоянные величины, кот. мне нужны в проге и все. До сих пор все вроде работает, за искл. старых брендов. Если что могу обьяснить более подробно (дабы принять критику), правда сначала винт восстановлю.
 Владимир (31-03-2003 20:00:25) http://cbuilder.ru
Во-первых, поместите код, как вы это делаете,
всегда интересно посмотреть, поучиться.

На форуме был подобный вопрос, по привязке к номеру винчестера

http://rxlib.ru/arhp/id1673.html

и

http://rxlib.ru/arhp/id230.html

 Владимир (02-04-2003 13:30:23) http://cbuilder.ru
Получено от Igos (по теме Привязка ПО к машине):

//---------------------------------------------------------------------------


void Encrypt(AnsiString S)
{
    int OutLen;
    char *StrToEncrypt=S.c_str();
    char OutString[255];
    HCRYPTPROV hProv = 0;
    HCRYPTKEY hKey = 0;
    HCRYPTKEY hXchgKey = 0;
    bool Result;
    DWORD dwCount = S.Length();
    DWORD dwBlobLen;
    Result=CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
    if(!Result)
    {
        Result=CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
        if(!Result)
        {
            if(hProv != 0) CryptReleaseContext(hProv, 0);
            return ;
        }
    }
    Result=CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey);
    if(!Result)
    {
        Result=CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey);
        if(!Result)
        {
            if(hKey != 0) CryptDestroyKey(hKey);
            if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
            if(hProv != 0) CryptReleaseContext(hProv, 0);
            return ;
        }
        Result=CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey);
        if(!Result)
        {
            if(hKey != 0) CryptDestroyKey(hKey);
            if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
            if(hProv != 0) CryptReleaseContext(hProv, 0);
            return ;
        }
    }

    Result=CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE, &hKey);
    if(!Result)
    {
        if(hKey != 0) CryptDestroyKey(hKey);
        if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
        if(hProv != 0) CryptReleaseContext(hProv, 0);
        return ;
    }
    Result=CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwBlobLen);
    if(!Result)
    {
        if(hKey != 0) CryptDestroyKey(hKey);
        if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
        if(hProv != 0) CryptReleaseContext(hProv, 0);
        return ;
    }
    BYTE *pbKeyBlob=new BYTE[dwBlobLen];
    Result=CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwBlobLen);
    if(!Result)
    {
        free(pbKeyBlob);
        if(hKey != 0) CryptDestroyKey(hKey);
        if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
        if(hProv != 0) CryptReleaseContext(hProv, 0);
        return ;
    }
    Main->dwBlobLen=dwBlobLen;
    memcpy(Main->pbKeyBlob, pbKeyBlob, dwBlobLen);
    free(pbKeyBlob);
    Result=CryptEncrypt(hKey, 0, true, 0, NULL, &dwCount, BUFFER_SIZE);
    if(!Result)
    {
        if(hKey != 0) CryptDestroyKey(hKey);
        if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
        if(hProv != 0) CryptReleaseContext(hProv, 0);
        return ;
    }
    strcpy(OutString,StrToEncrypt);
    OutLen=dwCount;
    dwCount = S.Length();
    Result=CryptEncrypt(hKey, 0, true, 0, OutString, &dwCount, OutLen);
    if(!Result)
    {
        if(hKey != 0) CryptDestroyKey(hKey);
        if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
        if(hProv != 0) CryptReleaseContext(hProv, 0);
        return ;
    }
    Main->OutLen=OutLen;
    memcpy(Main->OutString, OutString, OutLen);
    if(hKey != 0) CryptDestroyKey(hKey);
    if(hXchgKey != 0) CryptDestroyKey(hXchgKey);
    if(hProv != 0) CryptReleaseContext(hProv, 0);
    return ;
}
//---------------------------------------------------------------------------
AnsiString Decrypt(void)
{
    HCRYPTPROV hProv = 0;
    HCRYPTKEY hKey = 0;
    DWORD dwCount;
    DWORD dwBlobLen;

    char pbBuffer[BLOCK_SIZE];
    char DecryptedStr[255]; //=StringToDecrypt.c_str();
    dwBlobLen=Main->dwBlobLen;

    BYTE *pbKeyBlob=new BYTE[dwBlobLen];

    dwCount=Main->OutLen;
    //pbKeyBlob="x01x02";
    memcpy(pbKeyBlob,pbKeyBlob,dwBlobLen);

    memcpy(pbKeyBlob,Main->pbKeyBlob,dwBlobLen);

    memcpy(DecryptedStr,Main->OutString,dwCount);
    bool Result;
    Result=CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
    if(!Result)
    {
        Result=CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
        if(!Result)
        {
            if(hProv != 0) CryptReleaseContext(hProv, 0);
            return "";
        }
    }
    Result= CryptImportKey(hProv, pbKeyBlob, dwBlobLen, 0, 0, &hKey);
    if(!Result)
    {
        free(pbKeyBlob);
        if(hKey != 0) CryptDestroyKey(hKey);
        if(hProv != 0) CryptReleaseContext(hProv, 0);
        return "";
    }
    memcpy(pbBuffer, DecryptedStr, dwCount);
    Result=CryptDecrypt(hKey, 0, true, 0, pbBuffer, &dwCount);
    if(!Result)
    {
        free(pbKeyBlob);
        if(hKey != 0) CryptDestroyKey(hKey);
        if(hProv != 0) CryptReleaseContext(hProv, 0);
        return "";
    }
    pbBuffer[dwCount]=0;
    if(pbKeyBlob) free(pbKeyBlob);
    if(hKey != 0) CryptDestroyKey(hKey);
    if(hProv != 0) CryptReleaseContext(hProv, 0);
    return (AnsiString)pbBuffer;
}
//---------------------------------------------------------------------------
AnsiString VolSerNum(void)
{
    double b;
    LPTSTR lpVolumeNameBuffer = new char[20];
    LPDWORD lpVolumeSerialNumber = new DWORD;
    LPDWORD lpMaximumComponentLength = new DWORD;
    LPDWORD lpFileSystemFlags = new DWORD;
    LPTSTR lpFileSystemNameBuffer = new char[20];
    bool Result;
    Result=GetVolumeInformation(NULL,   lpVolumeNameBuffer, 20, lpVolumeSerialNumber,
        lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer,10);
    if (Result)
    {
        b= *lpVolumeSerialNumber;
        return (AnsiString)b;
    }

    else return "";
}
//---------------------------------------------------------

 Георгий (02-04-2003 19:59:58)
А теперь можно хоть схематически описать алгоритм работы с этими функциями и работу этих ф-ций
а так же, если возможно, описание API использованных здесь...


support@cbuilder.ru