Главная

Программы

OSProtector

Реализация
Примеры
OSa

Активация

Контакт

Ссылки


Пример использования протектора - создание слоев, проверка серийных номеров.


     Программа-пример написана в среде разработки Borland Delphi 7. Программа имеет текстовое поле ввода, в которое пользователь вводит серийный номер в (кодировке Base64) и кнопку "Check", по нажатию на которую пользователю сообщается о статусе введенного номера. В заголовке отображается идентификатор оборудования. Исходный код данной программы находится в каталоге Examples\Delphi в дистрибутиве протектора (аналогичный пример для языка C++ имеется в каталоге Examples\Borland C++ Bulder).

     Ниже представлен фрагмент листинга программы, отвечающий за проверку валидности серийного номера. В нем вызываются функции, объявленные в файле OSProtectorSDK.pas и вызываемые из динамической библиотеки OSProtectorSDK32.dll. До защиты протектором данные функции являются всего лишь заглушками (они ничего не делают), после защиты протектор заменит их вызовы вызовами интегрированных в защищенный файл функций.

function TrimEx(s : String) : String;
var
r : String;
n : Integer;
i : Integer;
begin
CreateOSProtectorMarker('m0');
n := Length(s);
for i := 1 to n do
if (s[i]<>#10) and (s[i]<>#13) and (s[i]<>#32) then
r := r + s[i];
Result := r;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
sMessage :String;
sData :String;
SerialNumberInfo :TSerialNumberInfo;
Status :Integer;

begin
CreateOSProtectorMarker('m0');
sData := TrimEx(Memo1.Lines.Text);

ZeroMemory(@SerialNumberInfo, SizeOf(SerialNumberInfo));

if (not IsCorrectBase64(sData)) then
  begin
   ShowMessage('Incorrect base64 string!');
   Exit;
  end;
sData := DecodeBase64(sData);

SerialNumberInfo.key := PChar(sData);
SerialNumberInfo.keyLen := Length(sData);
GetOSEquipmentId(HWID_from_microprocessor or HWID_from_hard_disk, SerialNumberInfo.HardwareID);

Status := GetOSSerialNumberInformation(@SerialNumberInfo);

if Status = GetSerialNumberStatus_Too_Long_Key then
  begin
   ShowMessage('Too long key!');
   Exit;
  end;

{ //unnecessary checks
if Status = GetSerialNumberStatus_Empty_Key then
 begin
   ShowMessage('Empty key!');
   Exit;
  end;

if Status = GetSerialNumberStatus_Incorrect_Input_Data then
  begin
    ShowMessage('Incorrect input data!');
    Exit;
  end;
}

if SerialNumberInfo.IsSerialNumber then
  sMessage := sMessage + 'Is serial number.' + #13
else
  sMessage := sMessage + 'Is not serial number.' + #13;

if SerialNumberInfo.IsLocked then
  sMessage := sMessage + 'Is locked.' + #13
else
  sMessage := sMessage + 'Is not locked.' + #13;

if SerialNumberInfo.IsDateExpired then
  sMessage := sMessage + 'Is date expired.' + #13
else
  sMessage := sMessage + 'Is date not expired.' + #13;

if SerialNumberInfo.IsTimeExpired then
  sMessage := sMessage + 'Is time expired.' + #13
else
  sMessage := sMessage + 'Is time not expired.' + #13;

if SerialNumberInfo.IsIncorrectHardwareID then
  sMessage := sMessage + 'Is incorrect hardware ID.' + #13
else
  sMessage := sMessage + 'Is correct hardware ID.' + #13;
ShowMessage(sMessage);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  HardwareID :THWIDArray;
  sMessage :String;
  i :Integer;
begin
  CreateOSProtectorMarker('m1');
  ZeroMemory(@HardwareID, SizeOf(HardwareID));
  GetOSEquipmentId(HWID_from_microprocessor or HWID_from_hard_disk, HardwareID);

  sMessage := 'HWID = ';
  for i:=0 to Length(HardwareID)-1 do
    begin
      sMessage := sMessage + IntToHex(Integer(HardwareID[i]), 2) + ' '
    end;
  Caption := sMessage;
end;

    

Перед генерацией исполняемого файла попросим компилятор (в настройках проекта) создать map-файл.

     Откомпилировав программу, загрузим бинарный файл в протектор. Видим, что протектор нашел и корректно дизассемблировал необходимые нам функции.

     Создаем слои. Для тестового примера достаточно создать два слоя. С первым слоем ассоциируем все функции, в которых содержится маркер m0 (для данного примера это функции TrimEx и TForm1.Button1Click), со вторым слоем все функции, содержащие маркер m1 (в нашем примере это функция TForm1.FormCreate).

     Прежде чем приступать к защите добавим в менеджер лицензий некриптостойкий серийный номер содержащий следующие байтики "31 32 33 34 35". В кодировке Base64 это будет выглядеть как "MTIzNDU=". Видим, что менеджер лицензий принял серийный номер разработчика (он отмечен пиктограммой синего цвета) - при защите хэш этого серийного номера будет интегрирован в бинарный файл.

     Защитим тестовую программу.

     После защиты можем увидеть, что протектор изменил все функции, ассоциированные со вторым и последующими слоями, заменил функции, вызываемые из OSProtectorSDK.pas. Теперь защищенная программа принимает как вновь сгенерированные серийные номера, так и серийный номер разработчика.

© 2009—2011 «OS-Lab.ru»