Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Как сделать простейшую защиту программы
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Виталик Виталик вне форума
Member
 
Сообщений: 333
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.03.2006
По умолчанию Как сделать простейшую защиту программы - 04.08.2006, 12:09

здравстуйте!

у меня такая просьба: можете сказать какими функциями и вообще алгоритмами можно создать генерацию строки, которая будет зависеть от аппаратной части компьютера и от собственно конкретно установленной Windows? необходимо сделать защиту в программе так, чтобы на каждой новой машине в каждой новой винде требовался новый серийный номер.. интересует именно алгоритм получения данных о машине и винде и создание из этих данных какой-то строки.. особой надежности не требуется, можно простейший алгоритм.. чтобы понять принцип создания такого набора символов.. и если можно, какой-нибудь алгоритм, по которому можно вычислять из этого набора символов уже готовый серийный номер.. это все необходимо для ознакомления, так что не нужно никаких особо сложных и навороченных алгоритмов..
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 05.08.2006, 12:59

Пример реализации:
Код:
void CKeyGenDlg::OnGenerate()
{
    // Генерация кода ключа основана на серийном номере винчестера
    const char szDiskName[] = "C:\\";
    char szVolumeNameBuffer[260];
    DWORD dwVolumeNameSize = sizeof(szVolumeNameBuffer);
    DWORD dwVolumeSerialNumber;
    DWORD dwMaxCompLength;
    DWORD dwFileSystemFlags;
    char szSysNameBuf[260];
    DWORD dwSysNameSize = sizeof(szSysNameBuf);

    VERIFY(GetVolumeInformation(szDiskName, szVolumeNameBuffer, dwVolumeNameSize,
        &dwVolumeSerialNumber, &dwMaxCompLength, &dwFileSystemFlags, szSysNameBuf, dwSysNameSize));

    // я получил серийный номер диска. Теперь надо сгенерировать номера и
    // показать их юзеру :
    m_Serial_1 = GenerateNumber( dwVolumeSerialNumber, 0 );
    UpdateData( FALSE );
}

CString CKeyGenDlg::GenerateNumber( DWORD dwSerial, int index )
{
   // маска из 32 байт
   static const BYTE Mask[32] = {
       0x13, 0x24, 0x5D, 0x09, 0x2E, 0x07, 0x17, 0x25,    // 0..7
       0x1B, 0x0B, 0x3F, 0x16, 0x53, 0x18, 0x5B, 0x1B,    // 8..15
       0x08, 0x37, 0x1F, 0x3E, 0x3A, 0x0C, 0x09, 0x14,    // 16..23
       0x49, 0x13, 0x0A, 0x12, 0x1C, 0x24, 0x5C, 0x40    // 24..31
   };

    CString Result;
    Result.Format( "%08X", dwSerial );

    // не вполне очевидная, но необходимая корректировочка для цифр
    // A..F (0x41..0x46):
    for (int i = 0; i < Result.GetLength(); ++i)
        if (Result[i] > '9') Result.SetAt(i, Result[i]-7);

    CString retStr("");
    BYTE c;

    switch( index )
    {
    case 0 :
        c = (Result[0] - Mask[0x1D] ) & 0x0F;
        retStr += GetSymbol(c);
        c = (Result[1] + Mask[0x16]) & 0x0F;
        retStr += GetSymbol(c);
        c = (Result[2] - Mask[2]) & 0x0F;
        retStr += GetSymbol(c);
        c = (Result[3] + Mask[0x1B]) & 0x0F;
        retStr += GetSymbol(c);
        c = (Result[4] - Mask[0]) & 0x0F;
        retStr += GetSymbol(c);
        c = (Result[5] + Mask[9]) & 0x0F;
        retStr += GetSymbol(c);
        c = (Result[6] - Mask[0x1E]) & 0x0F;
        retStr += GetSymbol(c);
        c = (Result[7] + Mask[0x15]) & 0x0F;
        retStr += GetSymbol(c);
    break;

    default : retStr = "";
    }
    return retStr;
}

// Метод GetSymbol возвращает очередной символ для регнума
char CKeyGenDlg::GetSymbol(BYTE c)
{
    return (char)(c <= 9 ? c+0x30 : c+0x37);  // 0x0A -> 0x41
}


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#3 (permalink)) Старый
Gedeon Gedeon вне форума
Member
 
Сообщений: 631
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.06.2003
По умолчанию 07.08.2006, 21:29

ТОлько не серийный номер винта, а номер тома.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как снять защиту от записи? Anatoly Любые вопросы от новичков 5 04.04.2011 07:57
CppEvents как поставить защиту kjam С/С++ 1 03.02.2010 15:56
Написать простейшую двухслойную сеть Кохонена Lessi Delphi 2 28.02.2009 10:49
Возможно ли обойти защиту для установки программы? Voron Любые вопросы от новичков 6 15.11.2008 18:26
Как организовать простейшую систему видеонаблюдения PiLiGriM Системный блок 28 23.08.2008 16:05
Как поставить защиту на SQL 2000 Jon1 MSSQL Server 3 17.03.2008 08:15
Как поставить защиту на программу Shturmovuk Delphi 5 07.02.2008 01:08
Как обойти защиту файлов висты? KpoLiK Софт и программы 2 18.04.2007 13:43
Как сделать запуск программы из другой программы Alexandr P Вопросы начинающих программистов 1 24.05.2005 15:58
Закажу БД в Delhi простейшую, лучше в Самаре Фиона Работа 1 24.11.2004 23:15
Как нарисовать простейшую графику emir .NET 1 29.03.2004 21:17



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов