Форум — Ответы ( К темам )
? | Igos: Привязка ПО к машине (31-03-2003 13:01:48) |
Хотелось бы узнать привязывает ли кто ПО к железу, и если да — то как ? Я например делаю это сл. образом: получаю VolumeSerialNumber, с помощью CryptoApi, шифрую эти данные, добавляя в опр. месте некоторые постоянные величины, кот. мне нужны в проге и все. До сих пор все вроде работает, за искл. старых брендов. Если что могу обьяснить более подробно (дабы принять критику), правда сначала винт восстановлю. | |
Владимир (31-03-2003 20:00:25) | |
Во-первых, поместите код, как вы это делаете, всегда интересно посмотреть, поучиться. На форуме был подобный вопрос, по привязке к номеру винчестера http://rxlib.ru/arhp/id1673.html и http://rxlib.ru/arhp/id230.html | |
Владимир (02-04-2003 13:30:23) | |
Получено от 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 использованных здесь... |