ActiveX компонент для защиты конфигураций 1С

Электронные ключи SenseLock являются наилучшим средством для защиты программ, написанных на легко декомпилируемых скриптовых языках, к которым можно отнести скрипты 1С, .NET, PHP и другие.

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

Использование внешних компонент из продуктов компании 1С

Для работы с внешним ActiveX компонентом 1С, прежде всего необходимо зарегистрировать его в системе стандартной утилитой MS Windows - RegSvr32.exe.

RegSvr32.exe SenselockKey.dll

После этого внешний компонент становится доступным для работы из среды 1С и появляется возможность использовать его методы и свойства.

Ниже приведен пример подключения внешнего компонента защиты SenselockKey в коде глобального модуля конфигурации 1С.

перем senselock Экспорт;
Процедура ПриНачалеРаботыСистемы()
  Ок = ПодключитьВнешнююКомпоненту("AddIn.SenselockKey");
  Если Ок = 0 Тогда
    Предупреждение("Не удалось загрузить компонент AddIn.SenselockKey");
    ЗавершитьРаботуСистемы(0);
    Возврат;
  КонецЕсли;
  senselock = СоздатьОбъект("AddIn.SenselockKey");
  ret = senselock.sense_enum();
КонецПроцедуры

Алгоритм использования электронного ключа SenseLock EL

Основным методом организации защиты на основе электронных ключей SenseLock является вынесение части алгоритмов из конфигурации 1С в ключ. Более подробно с технологией защиты с использованием электронных ключей SenseLock EL можно ознакомиться в "Руководстве разработчика".

Для того, чтобы организовать обмен данных с ключом из внутреннего языка 1С, прежде всего необходимо определить, как будет осуществляться поиск ключей. Для этого с помощью функции sense_setmode() следует установить метод поиска. Затем следует определить общее количество подключенных ключей с помощью функции sense_enum(). После того, как было получено их количество, необходимо инициализировать дальнейшую работу с ключом функцией sense_open(). Теперь можно выполнять различные функции, такие как sense_led(), sense_getinfo().

Для того, чтобы начать работать с прошивкой ключа, необходимо выбрать рабочий каталог внутри ключа функцией sense_changedir() и произвести проверку PIN-кода функцией sense_verifypin().

После этого, чтобы передать данные в электронный ключ, следует заполнить буфер обмена с помощью функций sense_setbyte(), sense_setshort(), sense_setlong(), sense_setfloat(), sense_setdouble() или sense_setstring(), указывая при этом смещение относительно начал буфера. Следует помнить, что максимальная длина буфера 250 байт. Перед вызовом функции sense_execute() необходимо установить количество байт в буфере обмена, которые будут посылаться в ключ. Для этого надо установить значение свойства BufferLen.

Функция sense_execute () вызывает исполняемый модуль внутри ключа, передавая ему данные из буфера обмена. После выполнения, буфер обмена содержит данные, полученные из ключа, а свойство BufferLen содержит размер полученных данных. Доступ к данным осуществляется функциями sense_getbyte(), sense_getshort(), sense_getlong(), sense_getfloat(), sense_getdouble() или sense_getstring().

Список свойств и методов внешнего компонента SenselockKey.dll

Свойства:

  1. BuffLen [read/write]
    Размер буфера обмена до и после вызова sense_execute().
  2. Error [read]
    Код ошибки, возникший при работе с электронным ключом SenseLock.

Методы:

  1. sense_setmode()
    Настройки параметров для работы с электронным ключом SenseLock.
  2. sense_enum()
    Получение количества найденных электронных ключей SenseLock согласно установленным настройкам.
  3. sense_open()
    Открытие электронного ключа SenseLock.
  4. sense_close()
    Закрытие электронного ключа SenseLock и сброс параметров его работы.
  5. sense_getinfo()
    Получение информации о найденном электронном ключе SenseLock.
  6. sense_led()
    Управление светодиодным индикатором электронного ключа SenseLock.
  7. sense_time()
    Получение времени из электронного ключа SenseLock (при использовании моделей, оснащённых часами реального времени).
  8. sense_changedir()
    Переход в указанный каталог файловой системы электронного ключа SenseLock.
  9. sense_verifypin()
    Авотризация PIN-кода доступа к каталогу файловой системы электронного ключа SenseLock.
  10. sense_execute()
    Запуск EXF модуля в электронном ключе SenseLock.
  11. sense_setbyte()
    Установка BYTE'а (1 байт) в буфере обмена.
  12. sense_setshort()
    Установка SHORT'а (2 байта) в буфере обмена.
  13. sense_setlong()
    Установка LONG'а (4 байта) в буфере обмена.
  14. sense_setfloat()
    Установка FLOAT'а (4 байта) в буфере обмена.
  15. sense_setdouble()
    Установка DOUBLE'а (8 байт) в буфере обмена.
  16. sense_setstring()
    Установка строки в буфере обмена.
  17. sense_getbyte()
    Получение BYTE'а (1 байт) из буфера обмена.
  18. sense_getshort()
    Получение SHORT'а (2 байта) из буфера обмена.
  19. sense_getlong()
    Получение LONG'а (4 байтf) из буфера обмена.
  20. sense_getfloat()
    Получение FLOAT'а (4 байтf) из буфера обмена.
  21. sense_getdouble()
    Получение DOUBLE'а (8 байт) из буфера обмена.
  22. sense_getstring()
    Получение строки из буфера обмена.

Пример использования:

// Заполняем буфер, передаваемый в ключ
senselock.sense_setbyte(0, 1); // 1 байт
senselock.sense_setbyte(1, 22); // 1 байт
senselock.sense_setfloat(2, X); // 4 байта
senselock.sense_setfloat(6, Y); // 4 байта
senselock.sense_setfloat(10, Cell); // 4 байта
senselock.sense_setfloat(14, X_Offset); // 4 байта
senselock.sense_setfloat(18, Door_Width); // 4 байта
senselock.sense_setfloat(22, NetLength); // 4 байта

senselock.BufferLen = 26; // Длина передаваемого буфера

// Запустить на выполнение EXF модуль 0x1000 в электронном ключе SenseLock
res = senselock.sense_execute("1000", 0);
Сообщить ("Execute : " + res); 

// Обработка полученных результатов вычисления
Сообщить(senselock.sense_getbyte(0));
Сообщить(senselock.sense_getbyte(1));
Сообщить(senselock.sense_getfloat(2));
Сообщить(senselock.sense_getfloat(6));
Сообщить(senselock.sense_getlong(10));
Сообщить(senselock.sense_getlong(14));