Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Очередной пост, рожденный из практической задачи.

Я уже неоднократно писал о том, что для защиты приложений использую ASProtect SKE, и время от времени мне приходится решать нестандартные задачи, связанные с его использованием. Как раз сегодня, мне пришлось поэкспериментировать с одной из таких задач. Суть в следующем. В нашем проекте существует основное приложение и несколько приложений сателлитов. Эти дополнительные приложения продаются отдельно и, соответственно, защищаются отдельными ключами. В один прекрасный момент мы решили одно из таких приложений объединить с главным, сохранив при этом необходимость его регистрации.

Иными словами, приложение должно проверять не один ключ, а сразу два. Можно ли это реализовать с помощью ASProtect? Я решил это проверить.

Актуальная версия ASProtect SKE – 2.65. Хотя я продолжаю использовать более раннюю версию (2.2), рекомендую все же скачать и установить последнюю. Дело в том, что в ней представлен исправленный файл aspr_api.pas, адаптированный для работы с новыми версиями Delphi, поддерживающими unicode. В принципе, вы можете использовать и более раннюю версию продукта с обновленными api заголовками.

В качестве базового я взял пример из комплекта поставки (..Reg_trial\Delphi).

Прежде всего, давайте откроем .aspr2 файл – проект ASProtect. В оригинальном примере он содержит два режима: Trial Mode и Registered Mode. Кроме того, следует убедиться, что ключ хранится в текстовом файле. Для этого откройте пункт меню Options | Keys storage area type:

asprotect_storage_type

Теперь добавим еще один режим (я назвал его Mode II), его настройки приведены на рисунке.

(в настоящее время ссылка не доступна)

Обратите внимание на то, что используется зашифрованная секция (Unlock Encrypted Section).

Теперь давайте посмотрим код приложения. Изначально все работает примерно следующим образом. При загрузке формы frmApp (onShow) вызывается функция

GetRegistrationInformation( 0, UserKey, UserName );

Эта функция получает регистрационную информацию о выбранном или текущем режиме. В данном случае речь идет именно о текущем режиме, поскольку первый параметр -0.

Далее проверяется наличие ключа, и если таковой имеется, вызывается зашифрованная секция, внутри которой выводится информация о текущем режиме. В случае отсутствия валидного ключа проверяется количество оставшихся триальных дней.

procedure TfrmApp.FormShow(Sender: TObject);
Var
  ModeStatus     : TModeStatus;
  sUserKey,
  sUserName,
  sModeName      : String;
begin
  lStatus.Caption := 'TRIAL EXPIRED!';

  GetRegistrationInformation( 0, UserKey, UserName );

  if (UserKey <> nil) AND (StrLen(UserKey) > 0) then
  begin

    {$I includeaspr_crypt_begin1.inc}

    GetModeInformation( 0, ModeName, ModeStatus );

    sUserKey  := StrPas(UserKey);
    sUserName := StrPas(UserName);
    sModeName := StrPas(ModeName);

    btnBuy.Visible := False;
    lStatus.Caption := 'Registered version:' + #13#10 +
                       'Key:'       + #13#10 + sUserKey  + #13#10 +
                       'Name:'      + #13#10 + sUserName + #13#10#13#10 +
                       'Mode Name: '+ sModeName;

    {$I includeaspr_crypt_end1.inc}

  end else

    If GetTrialDays( 0, TrialDaysTotal, TrialDaysLeft ) then
    begin

      If TrialDaysLeft = 0 then
      begin
        btnBuy.Visible:= True;
        lStatus.Caption := 'TRIAL EXPIRED!';
      end
       else
        lStatus.Caption := 'Unregistered trial version' + #13#10#13#10 +
                           'You have ' + IntToStr(TrialDaysLeft) + ' day(s) left';

    end;

end;

Если мы введем регистрационных ключ для любого из режимов, программа определит его как правильный. Но нам требуется проверить ключ для обоих режимов.

Я модифицировал код следующим образом:

 
procedure TfrmApp.FormShow(Sender: TObject);
Var
  ModeStatus,
  ModeStatus2     : TModeStatus;

  sUserKey,
  sUserName,
  sModeName      : String;

  sUserKey2,
  sUserName2,
  sModeName2      : String;
begin
  lStatus.Caption := 'TRIAL EXPIRED!';

  GetRegistrationInformation( 2, UserKey, UserName );

  if (UserKey <> nil) AND (StrLen(UserKey) > 0) then
  begin

    {$I includeaspr_crypt_begin1.inc}

    GetModeInformation( 2, ModeName, ModeStatus );

    sUserKey  := StrPas(UserKey);
    sUserName := StrPas(UserName);
    sModeName := StrPas(ModeName);

    btnBuy.Visible := False;
    lStatus.Caption := 'Registered version:' + #13#10 +
                       'Key:'       + #13#10 + sUserKey  + #13#10 +
                       'Name:'      + #13#10 + sUserName + #13#10#13#10 +
                       'Mode Name: '+ sModeName;

    {$I includeaspr_crypt_end1.inc}
  end
  else

    If GetTrialDays(2, TrialDaysTotal, TrialDaysLeft ) then
    begin

      If TrialDaysLeft = 0 then
      begin
        btnBuy.Visible:= True;
        lStatus.Caption := 'TRIAL EXPIRED!';
      end
       else
        lStatus.Caption := 'Unregistered trial version' + #13#10#13#10 +
                           'You have ' + IntToStr(TrialDaysLeft) + ' day(s) left';

    end;

  GetRegistrationInformation( 3, UserKey2, UserName2 );
  if (UserKey2 <> nil) AND (StrLen(UserKey2) > 0) then
  begin

    {$I includeaspr_crypt_begin2.inc}

    GetModeInformation( 2, ModeName2, ModeStatus2 );

    sUserKey2  := StrPas(UserKey2);
    sUserName2 := StrPas(UserName2);
    sModeName2 := StrPas(ModeName2);

    btnBuy.Visible := False;
    lStatus2.Caption := 'Registered version:' + #13#10 +
                       'Key:'       + #13#10 + sUserKey2  + #13#10 +
                       'Name:'      + #13#10 + sUserName2 + #13#10#13#10 +
                       'Mode Name: '+ sModeName2;

    {$I includeaspr_crypt_end2.inc}
  end
    else

    If GetTrialDays(3, TrialDaysTotal, TrialDaysLeft ) then
    begin

      If TrialDaysLeft = 0 then
      begin
        btnBuy.Visible:= True;
        lStatus2.Caption := 'TRIAL EXPIRED!';
      end
       else
        lStatus2.Caption := 'Unregistered trial version' + #13#10#13#10 +
                           'You have ' + IntToStr(TrialDaysLeft) + ' day(s) left';

    end;
end;

В отличие от первоначального кода, этот код последовательно проверяет ключи для двух режимов. Соответственно, для каждого из режимов я сделал свои переменные. Значения отображаемых меток заполняются в зашифрованных секциях, для каждого из режимов соответственно.

Если ввести оба ключа, то текст файла с ключами будет выглядеть так:

[LastKey]
Value=2
[Keys]
2=DAYG5Q-W4N94-UJMYE-AMUUV-RUDSJ-9JEVN
3=AFB65E-UMLGM-BSQLR-J9VU2-Q2XZT-D6KRU
[Names]
2=Registered User Mode 3
3=Registered User Mode 2

А так будет выглядеть результат работы программы.

(в настоящее время ссылка не доступна)

Таким образом, мы можем одновременно использовать в Delphi приложении несколько ключей ASProtect и работать в нескольких режимах.

Вы можете скачать данный пример отсюда.

В заключение, хочу сказать несколько слов о развитии ASProtect. Помимо хорошо известной редакции ASProtect SKE, недавно появилась еще одна – ASProtect 64. К сожалению, я не успел его попробовать. Но, очевидно, что с моей точки зрения основной интерес заключается в том, а работает ли этот ASProtect с 64-битным компилятором Delphi.

(в настоящее время ссылка не доступна)

Купить ASProtect:

 

ASProtect SKE

6705 руб.

(в настоящее время ссылка не доступна)

ASProtect 64

5580 руб.


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

1 комментарий: ASProtect. Работа в нескольких режимах одновременно.

  • ASProtect 64 не совместим с проектами для ASProtect ASE. Это делает его почти не применимым на практике, т.к. не получится вести 2 сборки приложения – для x86 и x64, чтобы для обеих был один и тот же алгоритм рег. ключей. И зачем тогда нужен ASProtect 64…

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика